Comment obtenir la probabilité qu'une chaîne soit similaire à une autre chaîne en Python?
Je veux obtenir une valeur décimale comme 0,9 (ce qui signifie 90%), etc. De préférence avec Python et bibliothèque standard.
par exemple
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
python
probability
similarity
metric
tenstar
la source
la source
Réponses:
Il y a un intégré.
En l'utilisant:
la source
SequenceMatcher
vs. stackoverflow.com/questions/6690739/…python-Levenshtein
get_close_matches
intégré, bien que je trouvesorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
plus fiable, avec dessorted(... .get_matching_blocks())[-1] > min_match
vérifications personnaliséesget_closest_matches
). C'est une fonction pratique qui peut être ce que vous cherchez, AKA a lu les documents! Dans mon application particulière, je faisais quelques vérifications / rapports d'erreurs de base à l'utilisateur fournissant une mauvaise entrée, et cette réponse me permet de leur signaler les correspondances potentielles et la "similitude". Si vous n'avez pas besoin d'afficher la similitude, consultez absolumentget_closest_matches
Je pense que vous cherchez peut-être un algorithme décrivant la distance entre les cordes. En voici quelques-unes auxquelles vous pouvez vous référer:
la source
Solution # 1: Python intégré
utiliser SequenceMatcher de difflib
avantages : bibliothèque native python, pas besoin de paquet supplémentaire.
exemple :inconvénients : trop limité, il existe tellement d'autres bons algorithmes pour la similitude des chaînes.
Solution # 2: bibliothèque de méduses
c'est une très bonne bibliothèque avec une bonne couverture et peu de problèmes. il prend en charge:
- Distance Levenshtein - Distance
Damerau-Levenshtein
- Distance Jaro
Jaro - la Jaro-Winkler
- la comparaison de l'approche d'évaluation des correspondances
- la distance de Hamming
avantages : facile à utiliser, gamme d'algorithmes pris en charge, testé.
inconvénients : pas de bibliothèque native.
exemple :
la source
Fuzzy Wuzzy
est un package qui implémente la distance de Levenshtein en python, avec quelques fonctions d'assistance pour vous aider dans certaines situations où vous pouvez souhaiter que deux chaînes distinctes soient considérées comme identiques. Par exemple:la source
Vous pouvez créer une fonction comme:
la source
if self.similar(search_string, item.text()) > 0.80:
fonctionne pour l'instant. Merci,La distance du forfait comprend la distance Levenshtein:
la source
La fonction intégrée
SequenceMatcher
est très lente sur les grandes entrées, voici comment cela peut être fait avec diff-match-patch :la source
Remarque,
difflib.SequenceMatcher
ne trouve que la sous-séquence de correspondance contiguë la plus longue, ce n'est souvent pas ce qui est souhaité, par exemple:Trouver la similitude entre deux chaînes est étroitement lié au concept d'alignement de séquence par paire en bioinformatique. Il existe de nombreuses bibliothèques dédiées à cela, y compris le biopython . Cet exemple implémente l' algorithme Needleman Wunsch :
L'utilisation de biopython ou d'un autre package bioinformatique est plus flexible que n'importe quelle partie de la bibliothèque standard de python car de nombreux schémas et algorithmes de notation différents sont disponibles. En outre, vous pouvez réellement obtenir les séquences correspondantes pour visualiser ce qui se passe:
la source
Vous pouvez trouver la plupart des méthodes de similitude de texte et comment elles sont calculées sous ce lien: https://github.com/luozhouyang/python-string-similarity#python-string-similarity Voici quelques exemples;
Normalisé, métrique, similitude et distance
Similitude et distance (normalisées)
Distances métriques
la source