Ответ 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
Как получить вероятность того, что строка будет похожа на другую строку в Python?
Я хочу получить десятичное значение, например 0,9 (что означает 90%) и т.д. Предпочтительно со стандартным Python и библиотекой.
например.
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
Есть встроенный.
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
Используя его:
>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
Я думаю, возможно, вы ищете алгоритм, описывающий расстояние между строками. Вот некоторые из них, на которые вы можете ссылаться:
Fuzzy Wuzzy
представляет собой пакет , который реализует расстояние Levenshtein в 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
используйте SequenceMatcher из difflib
профи: встроенная библиотека python, нет необходимости в дополнительном пакете.
минус: слишком ограниченный, существует так много других хороших алгоритмов для сходства строк.
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
его очень хорошая библиотека с хорошим охватом и несколькими проблемами.
он поддерживает:
- Левенштейн Расстояние
- Дамеру-Левенштейн Расстояние
- 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
Вы можете создать такую функцию, как:
def similar(w1, w2):
w1 = w1 + ' ' * (len(w2) - len(w1))
w2 = w2 + ' ' * (len(w1) - len(w2))
return sum(1 if i == j else 0 for i, j in zip(w1, w2)) / float(len(w1))
Пакет distance включает расстояние Левенштейна:
import distance
distance.levenshtein("lenvestein", "levenshtein")
# 3
Встроенный SequenceMatcher
очень медленный на большом входе, вот как это можно сделать с помощью diff-match-patch:
from diff_match_patch import diff_match_patch
def compute_similarity_and_diff(text1, text2):
dmp = diff_match_patch()
dmp.Diff_Timeout = 0.0
diff = dmp.diff_main(text1, text2, False)
# similarity
common_text = sum([len(txt) for op, txt in diff if op == 0])
text_length = max(len(text1), len(text2))
sim = common_text / text_length
return sim, diff