【问题标题】:How to find similar word in set? [duplicate]如何在集合中找到相似的单词? [复制]
【发布时间】:2016-03-22 00:43:22
【问题描述】:

word = "work" word_set = {"word","look","wrap","pork"}

如何找到相似的单词,让“word”和“pork”都只需要一个字母就可以变成“work”?

我想知道是否有一种方法可以找到字符串和集合中的项目之间的差异。

【问题讨论】:

  • 寻找词“词距离”
  • 其实正确的搜索词是“Levenshtein distance”。
  • Levenshtein 距离只是一系列距离指标中的一个特定指标。

标签: python string list set


【解决方案1】:

使用标准库中的difflib.get_close_matches()

import difflib

word = "work"
word_set = {"word","look","wrap","pork"}

difflib.get_close_matches(word, word_set)

返回:

['word', 'pork']

EDIT如果需要,可以使用difflib.SequenceMatcher.get_opcodes()计算编辑距离:

matcher = difflib.SequenceMatcher(b=word)
for test_word in word_set:
    matcher.set_seq1(test_word)
    distance = len([m for m in matcher.get_opcodes() if m[0]!='equal'])
    print(distance, test_word)

【讨论】:

  • 很好 - 没听说过 difflib。请注意, get_close_matches 也将返回完全匹配,因此您应该检查并删除它。此外,它返回的单词的相似度大于阈值(默认为 0.6),而不是具体地关闭 1 个字符 - 这在具有更长单词的示例中变得明显,其中相同的代码将返回更多字符的单词。在这里我们很幸运,因为一个 4 个字符的单词与 1 个字符的相似度为 0.75,而 2 个字符的相似度为 0.5。
【解决方案2】:

你可以这样做:

word = "work"
word_set = set(["word","look","wrap","pork"])

for example in word_set:
    if len(example) != len(word):
        continue
    num_chars_out = sum([1 for c1,c2 in zip(example, word) if c1 != c2])
    if num_chars_out == 1:
        print(example)

【讨论】:

    【解决方案3】:

    我会推荐editdistance Python package,它提供了一个editdistance.eval 函数,用于计算从第一个单词到第二个单词需要更改的字符数。编辑距离与MattDMo建议的Levenshtein距离相同。

    在您的情况下,如果您想识别彼此相距 1 个编辑距离内的单词,您可以这样做:

    import editdistance as ed
    
    thresh = 1
    w1 = "work"
    word_set = set(["word","look","wrap","pork"])
    neighboring_words = [w2 for w2 in word_set if ed.eval(w1, w2) <= thresh]
    
    print neighboring_words
    

    neighboring_words 评估为 ['pork', 'word']

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2012-07-07
      • 1970-01-01
      • 2020-08-14
      • 2020-08-30
      • 2013-04-24
      相关资源
      最近更新 更多