¿Cómo obtengo la probabilidad de que una cadena sea similar a otra cadena en Python?
Quiero obtener un valor decimal como 0.9 (que significa 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.
python
probability
similarity
metric
tenstar
fuente
fuente
Respuestas:
Hay un construido en.
Utilizándolo:
fuente
SequenceMatcher
vspython-Levenshtein
módulo. stackoverflow.com/questions/6690739/…get_close_matches
incorporado, aunque me pareciósorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
más confiable, consorted(... .get_matching_blocks())[-1] > min_match
controles personalizadosget_closest_matches
). Es una función de conveniencia que puede ser lo que está buscando, ¡también conocido como los documentos! En mi aplicación en particular, estaba haciendo algunas comprobaciones básicas de errores / informes al usuario que proporcionaban datos incorrectos, y esta respuesta me permite informarles las posibles coincidencias y cuál era la "similitud". Sin embargo, si no necesitas mostrar la similitud, definitivamente echa un vistazoget_closest_matches
Creo que tal vez estás buscando un algoritmo que describa la distancia entre cadenas. Aquí hay algunos a los que puede referirse:
fuente
Solución # 1: Python incorporado
use SequenceMatcher de difflib
pros : biblioteca nativa de python, no necesita paquete adicional.
ejemplo :contras : demasiado limitado, existen muchos otros buenos algoritmos para la similitud de cadenas.
Solución # 2: medusa biblioteca de
Es una muy buena biblioteca con buena cobertura y pocos problemas. admite:
- Distancia de Levenshtein - Distancia de
Damerau-Levenshtein
- Distancia de
Jaro - Distancia de Jaro-Winkler
- Comparación del enfoque de clasificación de partidos
- Distancia de Hamming
Pros : fácil de usar, gama de algoritmos compatibles, probado.
contras : biblioteca no nativa.
ejemplo :
fuente
Fuzzy Wuzzy
es un paquete que implementa la distancia de Levenshtein en python, con algunas funciones de ayuda para ayudar en ciertas situaciones en las que es posible que desee que dos cadenas distintas se consideren idénticas. Por ejemplo:fuente
Puedes crear una función como:
fuente
if self.similar(search_string, item.text()) > 0.80:
funciona por ahora. Gracias,La distancia del paquete incluye la distancia de Levenshtein:
fuente
La construcción
SequenceMatcher
es muy lenta en entradas grandes, así es como se puede hacer con diff-match-patch :fuente
Tenga en cuenta que
difflib.SequenceMatcher
solo encuentra la subsecuencia de coincidencia contigua más larga, esto a menudo no es lo que se desea, por ejemplo:Encontrar la similitud entre dos cadenas está estrechamente relacionado con el concepto de alineación de secuencia por pares en bioinformática. Hay muchas bibliotecas dedicadas para esto, incluyendo biopython . Este ejemplo implementa el algoritmo Needleman Wunsch :
El uso de biopython u otro paquete de bioinformática es más flexible que cualquier parte de la biblioteca estándar de python, ya que hay muchos esquemas y algoritmos de puntuación diferentes disponibles. Además, puede obtener las secuencias coincidentes para visualizar lo que está sucediendo:
fuente
Puede encontrar la mayoría de los métodos de similitud de texto y cómo se calculan en este enlace: https://github.com/luozhouyang/python-string-similarity#python-string-similarity Aquí algunos ejemplos;
Normalizado, métrico, similitud y distancia.
Similitud y distancia (normalizadas)
Distancias métricas
fuente