Найти процент совпадения между двумя строками, также учитывая порядок слов - Python
Я ищу способ вывода процента совпадения между двумя строками (например, именами), но также с учетом того, что они могут быть одинаковыми, но со словами в другом порядке. Я попытался использовать SequenceMatcher(), но результаты лишь частично удовлетворяют:
a = "john doe"
b = "jon doe"
c = "doe john"
d = "jon d"
e = 'john do'
s = SequenceMatcher(None, a, b)
s.ratio()
0.9333333333333333
s = SequenceMatcher(None, a, c)
s.ratio()
0.5
s = SequenceMatcher(None, a, d)
s.ratio()
0.7692307692307693
s = SequenceMatcher(None, a, e)
s.ratio()
0.9333333333333333
Я в порядке со всеми, кроме второго результата. Я замечаю, что не принимается во внимание, что c содержит те же слова, что и a, но в другом порядке.
Есть ли другой способ сопоставить строки и получить более высокий процент соответствия в случае, который я упоминал выше. Следует также учитывать, что имена могут содержать более двух слов.
Спасибо!
2 ответа
Это зависит от того, что вы ожидаете от расширенного соответствия. Если вы думаете, что второй должен быть 1.0, то все просто: разбить строку на слова, отсортировать слова, затем применить SM (SequenceMatcher
). Если вы хотите получить штраф за совпадение при сортировке, вы можете использовать любую из функций преобразования, чтобы измерить расстояние между двумя списками слов, и использовать его как фактор возможного совпадения.
Это помогает вам двигаться вперед?
Вы могли бы пойти с другими алгоритмами сходства строк. Выбор алгоритма подобия широко осуществляется на основе использования. Тщательно выбирайте!
Итак, библиотека textdistance имеет множество алгоритмов расстояния текста. Лучшим в вашем случае было бы использовать сходство костей Соренсена или сходство с Жакаром.
Код:
import textdistance as td
a = "john doe"
c = "doe john"
print(td.sorensen.normalized_similarity(a,c))
Выход:
1.0