Python中字符串的相似性度量



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

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

但直观的两个例子应该有非常高的相似性>90%。添加Levenstein距离

import nltk
nltk.edit_distance('word1','word2')

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

我已经为"R"找到了这个解决方案,可以将这个函数与rpy2一起使用,也可以将agrepy用作另一种方法。但我想通过更改接受的基准来使程序变得越来越不敏感(只接受相似度>x%的匹配(。

我还有什么好的措施可以用吗?或者你有什么想法可以改善我的功能吗?

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

我编写了以下代码。试试看。我为两个比较字符串(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))

最新更新