在pyspark中使用正则表达式创建n-gram

zf2sa74q  于 2021-05-16  发布在  Spark
关注(0)|答案(1)|浏览(379)

我有一个pyspark dataframe列,名为:

|   name     |
--------------
|Lebron James|
|Kyrie Irving|
|Kevin Durant|

我想创建一个新列,如下所示:

|   name     |         trigram          |
-----------------------------------------
|Lebron James| Leb ebr bro on  Jam ame es
|Kyrie Irving| ...
|Kevin Durant| ...

到目前为止我已经

df.withColumn("trigram", regex_replace(col("name"), "([A-Za-z0-9\s]{3})(?!$)", r"$1 "))

但这会产生:

|   name     |         trigram       |
--------------------------------------
|Lebron James| Leb ron Ja  mes
|Kyrie Irving| Kyr ie  Irv ing
|Kevin Durant| Kev in  Dur ant

注意:重要的是不要使用自定义项。我可以简单地使用自定义项和列表理解来做我想做的事情,但是我希望以最理想的方式来做,因为实际数据有数亿行

lp0sw83n

lp0sw83n1#

你可以用

regex_replace(col("name"), "(?=(.{3})).", r"$1 ")

查看regex演示。细节: (?=(.{3})) -一个积极的前瞻,捕捉到(第1组, $1 )除换行符以外的三个字符立即位于当前位置的右侧 . -除换行符以外的任何字符,被消耗(它将被删除,并被从这个字符开始的3个字符替换)。

相关问题