【问题标题】:Compare strings in dataframe column according to levenshtein distance with words in a list根据 levenshtein 距离将数据框列中的字符串与列表中的单词进行比较
【发布时间】:2020-10-03 09:09:01
【问题描述】:

使用 PyTesseract 后,我​​有一个带有单词的数据框(它们是希腊语,但没关系)。 我还创建了一个列表(words_list),这是我的自定义词典,包含我正在检查的主题的特定单词。

我想要做的是,将 df["no_punctuation"] 中的每个单词与列表中的每个单词进行比较,然后

  • 如果这对单词之间的 levenshtein 距离小于 4,我想用列表中的相应单词替换数据框中的单词
  • 否则,我想将单元格留空

基本上,这是我自己的拼写检查器的一个步骤,但是到目前为止我还不能让它工作。

附上数据框和列表的图像。

dataframe list

到目前为止我尝试过的是:

for j in range (0,len(df2)):
    for word in words_list:
        if (enchant.utils.levenshtein(df2["no_punctuation"][j],word)<4):
            df2["new"][j]=word
        else:
            df2["new"][j]=""

正如它在数据帧图像中显示的那样,它只更正了“generali”这个词,并将所有其余单元格留空。但是,还有许多其他单元格也应该完成。

我也尝试了以下方法,但是它只产生空单元格。

df2['new']=df2["no_punctuation"].apply(lambda x:"" if (enchant.utils.levenshtein(text,word)>=4 for word in words_list) else word )

我想我已经接近了,但还是有问题。有什么想法吗?

【问题讨论】:

    标签: python list-comprehension string-comparison spell-checking levenshtein-distance


    【解决方案1】:

    空单元格的原因是您提供的 else 条件。因此,对于与 Levenshtein 距离 >4 的所有比较,输入空字符串。 删除 else 条件肯定会解决您的问题。

    另外,在循环外定义一个新列。

    df2["new"][j]==""
    for j in range (len(df2)):
        for word in words_list:
            if (enchant.utils.levenshtein(df2["no_punctuation"][j],word)<4):
                df2["new"][j]=word
    

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2018-09-11
      相关资源
      最近更新 更多