Мера подобия для строк в Python

1

Я хочу измерить сходство между двумя словами. Идея состоит в том, чтобы прочитать текст с 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%).

Есть ли еще одна хорошая мера, которую я мог бы использовать, или у вас есть идеи по улучшению моей функции?

Теги:
measure
similarity

2 ответа

2
Лучший ответ

Вы можете просто использовать 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
    Спасибо за идею. Это помогает мне с первой проблемой, но проблема с короткими словами остается открытой без ответа. Есть еще идеи по этому поводу?
  • 0
    Я не совсем уверен, почему вы хотите более высокое значение для трехбуквенного слова. Вы говорите, что интуитивно ожидали более высокого сходства. Строго говоря, из трех символов один отличается между строками, что делает их похожими на 66%. Можете ли вы уточнить, каким должен быть ваш ожидаемый результат и почему?
Показать ещё 5 комментариев
-1

Я написал следующий код. попытайся. Я определил 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))
  • 0
    спасибо, что поделились своим кодом. Это похоже на то, что я пробовал в первую очередь. Вы получаете аналогичные результаты с этой функцией, как я. Основная проблема, которую я вижу, состоит в том, что вы потеряете много информации, когда будете вырезать строку str3=str2[0:len(str1)] .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню