Python中字符串的相似性度量

时间:2018-11-29 09:40:53

标签: python similarity measure

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

wordComp('h0t',hot')
0.66
wordComp('tackoverflow','stackoverflow')
0

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

import nltk
nltk.edit_distance('word1','word2')
在我的函数中,

会将第二个结果提高到92%,但第一个结果仍然不好。

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

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

2 个答案:

答案 0 :(得分:4)

您可以只使用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

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

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

答案 1 :(得分:0)

我编写了以下代码。尝试一下。我为两个比较字符串(str1和str2)的长度不相等的情况定义了str3。该代码在while循环中退出以使用k输入。

k=1
cnt=0
str3=''
while not k==-1:
    str1=input()
    str2=input()
    k=int(input())

    if len(str1)>len(str2):
        str3=str1[0:len(str2)]
        for j in range(0,len(str3)):
            if str3[j]==str2[j]:
                cnt+=1
        print((cnt/len(str1)*100))

    elif len(str1)<len(str2):
        str3=str2[0:len(str1)]
        for j in range(0,len(str2)):
            if str3[j]==str1[j]:
                cnt+=1
        print((cnt/len(str2)*100))

    else:
        for j in range(0,len(str2)):
            if str2[j]==str1[j]:
                cnt+=1
        print((cnt/len(str1)*100))
相关问题