Мера подобия для строк в Python - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу измерить сходство между двумя словами.Идея состоит в том, чтобы прочитать текст с помощью 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 в качестве другого подхода.Но я хочу сделать программу более чувствительной, изменив эталон для принятия.моя функция?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете просто использовать 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
0 голосов
/ 29 ноября 2018

Я написал следующий код.попытайся.Я определил 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))
...