【问题标题】:Create N-Gram using Regular Expression in PySpark在 PySpark 中使用正则表达式创建 N-Gram
【发布时间】:2021-03-14 20:49:27
【问题描述】:

我有一个带有名称的 pyspark 数据框列:

|   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

注意:不要使用 udfs 很重要。我可以简单地使用 udf 和列表理解来做我想做的事情,但我希望以最优化的方式做到这一点,因为实际数据有数亿行

【问题讨论】:

  • 也许regex_replace(col("name"), "(?=(.{3})).", r"$1 ") 可以吗?
  • 是的,谢谢!我还是个正则表达式的新手

标签: python regex dataframe apache-spark pyspark


【解决方案1】:

你可以使用

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

请参阅regex demo。详情:

  • (?=(.{3})) - 一个正向前瞻,捕获(进入第 1 组,$1)除了换行符之外的三个字符,紧邻当前位置
  • . - 除换行符之外的任何字符都被消耗(它将被删除,并被从该字符开始的 3 个字符连续替换)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多