我想测量两个词之间的相似度。想法是使用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%的匹配项)。
我还有其他可以使用的好方法吗?或者您有什么想法可以改善我的功能?
答案 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))