Нечеткое объяснение реализовано с использованием расстояния Левенштейна. Из википедии :
Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных правок (вставок, удалений или подстановок), необходимых для замены одного слова на другое.
EDIT
Как было отмечено @ dennis-golomazov. Между token_sort_ratio и token_set_ratio есть важные различия в деталях.
token_sort_ratio имеет четыре шага:
- Разбить строку на токены
- Сортировка токенов
- Назовите коэффициент Левенштейна от https://github.com/ztane/python-Levenshtein на отсортированных токенах.
- Возвращаем соотношение * 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, так как он учитывает тот факт, что кукуруза находится в обеих строках и может соответствовать соответственно