Я хочу измерить сходство между двумя словами. Идея состоит в том, чтобы прочитать текст с OCR и проверить результат по ключевым словам. Функция, которую я ищу, должна сравнить два слова и вернуть сходство в%. Поэтому сравнение слова с собой должно быть на 100% аналогичным. Я написал функцию самостоятельно и сравнил char по char и вернул количество совпадений в соотношении к длине. Но проблема в том, что
wordComp('h0t',hot')
0.66
wordComp('tackoverflow','stackoverflow')
0
Но интуитивные оба примера должны иметь очень высокое сходство> 90%. Добавление Levenstein-Distance
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
Я написал следующий код. попытайся. Я определил str3 для тех случаев, когда длина двух строк сравнения (str1 и str2) не равна. код находится в цикле 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))
str3=str2[0:len(str1)]
.