221 votes

Bons modules Python pour la comparaison floue de chaînes de caractères ?

Je suis à la recherche d'un module Python capable d'effectuer des comparaisons simples et floues de chaînes de caractères. Plus précisément, j'aimerais obtenir un pourcentage de la similarité des chaînes de caractères. Je sais que c'est potentiellement subjectif et j'espérais donc trouver une bibliothèque capable de faire des comparaisons positionnelles ainsi que des correspondances de chaînes similaires les plus longues, entre autres choses.

En gros, j'espère trouver quelque chose qui soit assez simple pour donner un pourcentage unique tout en étant suffisamment configurable pour que je puisse spécifier le type de comparaison à effectuer.

235voto

nosklo Points 75862

difflib peut le faire.

Exemple tiré de la documentation :

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']

Vérifiez-le. Il possède d'autres fonctions qui peuvent vous aider à construire quelque chose de personnalisé.

153voto

Pete Skomoroch Points 1861

Extension Python et bibliothèque C de Levenshtein.

https://github.com/ztane/python-Levenshtein/

Le module d'extension Python C de Levenshtein contient des fonctions permettant d'effectuer des opérations rapides de calcul rapide de la - distance (d'édition) de Levenshtein, et des opérations d'édition - la similarité des chaînes de caractères - la médiane approximative des chaînes de caractères, et généralement la moyenne des chaînes de caractères - la similarité des séquences et des ensembles de chaînes Il prend en charge les chaînes de caractères normales et Unicode.

$ pip install python-levenshtein
...
$ python
>>> import Levenshtein
>>> help(Levenshtein.ratio)
ratio(...)
    Compute similarity of two strings.

    ratio(string1, string2)

    The similarity is a number between 0 and 1, it's usually equal or
    somewhat higher than difflib.SequenceMatcher.ratio(), becuase it's
    based on real minimal edit distance.

    Examples:
    >>> ratio('Hello world!', 'Holly grail!')
    0.58333333333333337
    >>> ratio('Brian', 'Jesus')
    0.0

>>> help(Levenshtein.distance)
distance(...)
    Compute absolute Levenshtein distance of two strings.

    distance(string1, string2)

    Examples (it's hard to spell Levenshtein correctly):
    >>> distance('Levenshtein', 'Lenvinsten')
    4
    >>> distance('Levenshtein', 'Levensthein')
    2
    >>> distance('Levenshtein', 'Levenshten')
    1
    >>> distance('Levenshtein', 'Levenshtein')
    0

65voto

Edi H Points 688

Comme nosklo dit, utilisez le difflib de la bibliothèque standard de Python.

Le module difflib peut renvoyer une mesure de la similarité des séquences en utilisant la fonction ratio() méthode d'un SequenceMatcher() objet. La similarité est renvoyée sous la forme d'une valeur flottante comprise entre 0,0 et 1,0.

>>> import difflib

>>> difflib.SequenceMatcher(None, 'abcde', 'abcde').ratio()
1.0

>>> difflib.SequenceMatcher(None, 'abcde', 'zbcde').ratio()
0.80000000000000004

>>> difflib.SequenceMatcher(None, 'abcde', 'zyzzy').ratio()
0.0

34voto

timv Points 341

Méduse est un module Python qui prend en charge de nombreuses mesures de comparaison de chaînes de caractères, y compris la correspondance phonétique. Les implémentations purement Python de la distance d'édition de Levenstein sont assez lentes par rapport à l'implémentation de Jellyfish.

Exemple d'utilisation :

import jellyfish

>>> jellyfish.levenshtein_distance('jellyfish', 'smellyfish')
2 
>>> jellyfish.jaro_distance('jellyfish', 'smellyfish')
0.89629629629629637
>>> jellyfish.damerau_levenshtein_distance('jellyfish', 'jellyfihs')
1
>>> jellyfish.metaphone('Jellyfish')
'JLFX'
>>> jellyfish.soundex('Jellyfish')
'J412'
>>> jellyfish.nysiis('Jellyfish')
'JALYF'
>>> jellyfish.match_rating_codex('Jellyfish')
'JLLFSH'`

18voto

Steven Points 10243

Il y a aussi le propre Google google-diff-match-patch ("Actuellement disponible en Java, JavaScript, C++ et Python").

(Je ne peux pas faire de commentaires à ce sujet, car je n'ai moi-même utilisé que la difflib de python).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X