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

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

我有一个pyspark dataframe列,名为:

  1. | name |
  2. --------------
  3. |Lebron James|
  4. |Kyrie Irving|
  5. |Kevin Durant|

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

  1. | name | trigram |
  2. -----------------------------------------
  3. |Lebron James| Leb ebr bro on Jam ame es
  4. |Kyrie Irving| ...
  5. |Kevin Durant| ...

到目前为止我已经

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

但这会产生:

  1. | name | trigram |
  2. --------------------------------------
  3. |Lebron James| Leb ron Ja mes
  4. |Kyrie Irving| Kyr ie Irv ing
  5. |Kevin Durant| Kev in Dur ant

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

lp0sw83n

lp0sw83n1#

你可以用

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

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

相关问题