Нечеткие оценки для предложений без перекрывающихся слов выше, чем с некоторыми совпадениями? - PullRequest
0 голосов
/ 05 июля 2018

Я использую fuzzywuzzy, чтобы вычислить сходство между двумя предложениями. Вот некоторые результаты, которые не имеют смысла для меня:

from fuzzywuzzy import fuzz

s1 = "moist tender pork loin chop"
s2 = "corn bicolor"
fuzz.token_sort_ratio(s1,s2)

Это дает мне 41 балл. С другой стороны:

s1 = "store cut sweet yellow corn tray"
s2 = "corn bicolor"
fuzz.token_sort_ratio(s1,s2)

дает мне 18 баллов.

Как может оценка между двумя предложениями, у которых действительно есть перекрывающееся слово (в данном случае "кукурузой"), быть ниже, чем оценка для предложений без перекрывающихся слов?

Спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

Нечеткое объяснение реализовано с использованием расстояния Левенштейна. Из википедии :

Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных правок (вставок, удалений или подстановок), необходимых для замены одного слова на другое.

EDIT Как было отмечено @ dennis-golomazov. Между token_sort_ratio и token_set_ratio есть важные различия в деталях.

token_sort_ratio имеет четыре шага:

  1. Разбить строку на токены
  2. Сортировка токенов
  3. Назовите коэффициент Левенштейна от https://github.com/ztane/python-Levenshtein на отсортированных токенах.
  4. Возвращаем соотношение * 100

Обратите внимание, что этот алгоритм не заботится о частичных совпадениях

Когда эти шаги выполняются в вашей строке, код по существу становится:

from Levenshtein import StringMatcher as sm

s1 = "chop loin moist tender pork"
s2 = "bicolor corn"

m = sm.StringMatcher(None, s1, s2)
print(int(m.ratio() * 100))

s1 = "corn cut store sweet tray yellow"
s2 = "bicolor corn"

m = sm.StringMatcher(None, s1, s2)
print(int(m.ratio() * 100))

Вы заметите, что эти соотношения соответствуют тем, которые вы видели в вашем тестовом примере.

Итак, вы определенно захотите использовать fuzz.token_set_ratio, так как он учитывает тот факт, что кукуруза находится в обеих строках и может соответствовать соответственно

...