Вопрос-Ответ

Find the similarity metric between two strings

Найти метрику сходства между двумя строками

Как мне получить вероятность того, что строка похожа на другую строку в Python?

Я хочу получить десятичное значение, например 0.9 (что означает 90%) и т.д. Предпочтительно со стандартным Python и библиотекой.

например

similar("Apple","Appel") #would have a high prob.

similar("Apple","Mango") #would have a lower prob.
Переведено автоматически
Ответ 1

Есть встроенный.

from difflib import SequenceMatcher

def similar(a, b):
return SequenceMatcher(None, a, b).ratio()

Используя ее:

>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
Ответ 2

Решение № 1: встроенный Python

используйте SequenceMatcher из difflib

плюсы: встроенная библиотека python, не нужен дополнительный пакет.

минусы: слишком ограниченный, существует так много других хороших алгоритмов для определения сходства строк.

пример :
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75

Решение №2: библиотека jellyfish

это очень хорошая библиотека с хорошим охватом и небольшим количеством проблем. она поддерживает:


  • Расстояние Левенштейна

  • Расстояние Дамерау-Левенштейна

  • Расстояние Jaro

  • Расстояние Яро-Винклера

  • Сравнение подходов к оценке соответствия

  • Расстояние Хэмминга

плюсы: простота в использовании, широкий спектр поддерживаемых алгоритмов, проверено.

минусы: отсутствует встроенная библиотека.

пример:

>>> import jellyfish
>>> jellyfish.levenshtein_distance(u'jellyfish', u'smellyfish')
2
>>> jellyfish.jaro_distance(u'jellyfish', u'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance(u'jellyfish', u'jellyfihs')
1
Ответ 3

Я думаю, возможно, вы ищете алгоритм, описывающий расстояние между строками. Вот некоторые, на которые вы можете сослаться:


  1. Расстояние Хэмминга

  2. Расстояние Левенштейна

  3. Расстояние Дамерау–Левенштейна

  4. Расстояние Яро–Винклера

Ответ 4

TheFuzz это пакет, который реализует расстояние Левенштейна на python с некоторыми вспомогательными функциями, помогающими в определенных ситуациях, когда вы можете захотеть, чтобы две разные строки считались идентичными. Например:

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100
python