Number pyspark 或 NLP 如何拆分

Posted

技术标签:

【中文标题】Number pyspark 或 NLP 如何拆分【英文标题】:How split between Number pyspark or NLP 【发布时间】:2019-10-10 20:51:05 【问题描述】:

我想在我的数据框的一列中进行多次拆分。 示例:

s = "Cras mattis MP the -69661/69662;69663 /IS4567"

如何获得:

s = ['Cras', 'mattis', 'MP', 'the', '69661', '69662', '69663', 'IS4567' ]

谢谢

【问题讨论】:

【参考方案1】:

使用 SparkSQL 的内置函数 sentences() 和 flatten() 的一种方法 [flatten() 需要 spark 2.4.0+]:

from pyspark.sql.functions import expr

df.withColumn('new_s', expr('flatten(sentences(s))')).show(truncate=False)    
#+---------------------------------------------+----------------------------------------------------+
#|s                                            |new_s                                               |
#+---------------------------------------------+----------------------------------------------------+
#|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
#+---------------------------------------------+----------------------------------------------------+

sentences() 在 Apache Hive 文档中的作用:

将自然语言文本字符串标记为单词和句子,其中每个句子在适当的句子边界处断开并作为单词数组返回。 'lang' 和 'locale' 是可选参数。例如,句子('Hello there! How are you?') 返回 (("Hello", "there"), ("How", "are", "you"))。

【讨论】:

is sentences 不是 pyspark.sql.function 的一部分?我们可以在不使用 select 的情况下使用它吗? @PIG,您始终可以使用 pyspark.sql.functions.expr 和 dataFrame API 运行 SparkSQL。【参考方案2】:

您可以使用split 函数,它采用正则表达式模式来拆分数据。

import pyspark.sql.functions as f

df.withColumn('ns', f.split('s', "[^a-zA-Z0-9']+")).show(10,False)
+---------------------------------------------+----------------------------------------------------+
|s                                            |ns                                                  |
+---------------------------------------------+----------------------------------------------------+
|Cras mattis MP the -69661/69662;69663 /IS4567|[Cras, mattis, MP, the, 69661, 69662, 69663, IS4567]|
+---------------------------------------------+----------------------------------------------------+

注意: "[^a-zA-Z0-9']+" 会处理基本的英文字符但是如果你想包含特殊字符,你可以使用通用的\pL 而不是a-zA-Z"[^\\pL0-9']+"

【讨论】:

以上是关于Number pyspark 或 NLP 如何拆分的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量拆分为列 - 使用 PySpark

如何在 pyspark 上创建分层拆分训练、验证和测试集?

如何在 PySpark 中拆分数据框列

如何根据行的内容拆分pyspark数据框

Pyspark - 如何拆分具有 Datetime 类型的结构值的列?

如何在pyspark中将文件名拆分为两个字符串?