Python中字符串的相似性度量

tif*_*i90 3 python similarity measure

我想测量两个词之间的相似度。想法是使用OCR读取文本并检查关键字的结果。我要寻找的功能应该比较两个单词并以%返回相似度。因此,将单词与自身进行比较应该是100%相似的。我自己编写了一个函数,然后逐个字符比较char,然后返回与长度成比例的匹配数。但是问题是

wordComp('h0t',hot')
0.66
wordComp('tackoverflow','stackoverflow')
0
Run Code Online (Sandbox Code Playgroud)

但是直观的两个示例都应该具有很高的相似度> 90%。加Levenstein距离

import nltk
nltk.edit_distance('word1','word2')
Run Code Online (Sandbox Code Playgroud)

在我的函数中会将第二个结果提高到92%,但第一个结果仍然不好。

我已经找到了针对“ R”的解决方案,可以将此功能与另一种方法结合rpy2使用或agrepy用作另一种方法。但是我想通过更改接受基准来使程序变得越来越敏感(仅接受相似度> x%的匹配项)。

我还有其他可以使用的好方法吗?或者您有什么想法可以改善我的功能?

Mar*_*in 5

您可以只使用difflib。我从一个答案中得到的这个功能对我很有帮助:

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

print (similar('tackoverflow','stackoverflow'))
print (similar('h0t','hot'))

0.96
0.666666666667
Run Code Online (Sandbox Code Playgroud)

您可以轻松地附加函数或将其包装在另一个函数中,以解决不同程度的相似性,例如,传递第三个参数:

from difflib import SequenceMatcher

def similar(a, b, c):
    sim = SequenceMatcher(None, a, b).ratio()
    if sim > c: 
        return sim

print (similar('tackoverflow','stackoverflow', 0.9))
print (similar('h0t','hot', 0.9))

0.96
None
Run Code Online (Sandbox Code Playgroud)