【问题标题】:Fuzzy matching a word inside a pyspark dataframe string模糊匹配 pyspark 数据帧字符串中的单词
【发布时间】:2018-06-12 23:11:22
【问题描述】:

我有一些数据,其中“X”列包含字符串。我正在使用 pyspark 编写一个函数,其中传递了一个 search_word,并且过滤掉了列“X”字符串中不包含子字符串 search_word 的所有行。该函数还必须允许单词的拼写错误,即模糊匹配。 我已将数据加载到 pyspark 数据帧中,并使用 NLTK 和 Fuzzywuzzy python 库编写了一个函数,如果字符串包含 search_word,则返回 True 或 False。

我的问题是我无法将函数正确映射到数据框。 我是否错误地处理了这个问题?我应该尝试通过某种 SQL 查询进行模糊匹配,还是使用 RDD?

我是 pyspark 的新手,所以我觉得这个问题之前一定已经回答过,但我在任何地方都找不到答案。我从未使用 SQL 做过任何 NLP,也从未听说过 SQL 能够模糊匹配子字符串。

更新 #1

函数如下:

wf = WordFinder(search_word='some_substring')
result1 = wf.find_word_in_string(string_to_search='string containing some_substring or misspelled some_sibstrung')
result2 = wf.find_word_in_string(string_to_search='string not containing the substring')

结果 1 为真

结果 2 为假

【问题讨论】:

  • 如果没有your code,你希望得到什么样的答案?
  • @Piinthesky 我已经添加了上面的方法。为类和方法添加实际代码是没有意义的,因为它只是一些 nltk 标记器和 lemmitizer 以及一个模糊模糊的 partial_ratio。这与问题完全无关。问题是关于如何将函数应用于 pyspark 数据帧,是否可以使用布尔函数过滤行,以及 sql 或 python 是否是解决问题的最佳方法。

标签: python nlp pyspark pyspark-sql fuzzy-search


【解决方案1】:

一个简单的方法是使用内置的levenstein 函数。例如,

(
    spark.createDataFrame([("apple",), ("aple",), ("orange",), ("pear",)], ["fruit"])
    .withColumn("substring", func.lit("apple"))
    .withColumn("levenstein", func.levenshtein("fruit", "substring"))
    .filter("levenstein <= 1")
    .toPandas()
)

返回

   fruit substring  levenstein
0  apple     apple           0
1   aple     apple           1

如果你想使用一个普通的 Python 函数,比如来自 NLTK 包的东西,你必须定义一个接受字符串并返回布尔值的 UDF。

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2012-02-14
    • 2014-11-02
    • 2017-08-03
    • 2018-05-31
    相关资源
    最近更新 更多