name font python probability similarity metric

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.

ejemplo :

>>> 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



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