python - font - Encuentra la similitud entre dos cadenas
subplot python title (7)
¿Cómo obtengo la probabilidad de que una cadena sea similar a otra cadena en Python?
Quiero obtener un valor decimal como 0.9 (es decir, 90%), etc. Preferiblemente con Python y biblioteca estándar.
p.ej
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
Solución n. ° 1: Python incorporado
usa SequenceMatcher de difflib
pros : biblioteca nativa de python, no necesita paquete adicional.
Contras : demasiado limitado, hay tantos otros buenos algoritmos para la similitud de cuerdas.
>>> from difflib import SequenceMatcher
>>> s = SequenceMatcher(None, "abcd", "bcde")
>>> s.ratio()
0.75
Solución # 2: biblioteca de jellyfish
es una muy buena biblioteca con buena cobertura y pocos problemas. admite:
- Distancia Levenshtein
- Distancia Damerau-Levenshtein
- Jaro Distancia
- Distancia Jaro-Winkler
- Comparación del Enfoque de Calificación del Partido
- Hamming Distancia
pros : fácil de usar, gama de algoritmos compatibles, probados.
Contras : biblioteca no nativa.
ejemplo :
>>> 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
Creo que tal vez estés buscando un algoritmo que describa la distancia entre cadenas. Estos son algunos de los que puede consultar:
El SequenceMatcher
incorporado es muy lento en la entrada grande, así es cómo se puede hacer con el 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
Hay un built in
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
Utilizándolo:
>>> similar("Apple","Appel")
0.8
>>> similar("Apple","Mango")
0.0
La distance paquete incluye la distancia de Levenshtein:
import distance
distance.levenshtein("lenvestein", "levenshtein")
# 3
Puede crear una función como:
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))
Fuzzy Wuzzy
es un package que implementa la distancia de Levenshtein en python, con algunas funciones de ayuda para ayudar en ciertas situaciones en las que puede desear que dos cadenas distintas se consideren idénticas. Por ejemplo:
>>> 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