Comment utiliser SequenceMatcher pour trouver la similarité entre deux chaînes?

StackOverflow https://stackoverflow.com/questions/4802137

  •  22-10-2019
  •  | 
  •  

Question

import difflib

a='abcd'
b='ab123'
seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower())
seq=difflib.SequenceMatcher(a,b)
d=seq.ratio()*100
print d

I utilisé le code ci-dessus, mais la production obtenue est de 0,0. Comment puis-je obtenir une réponse valide?

Était-ce utile?

La solution

Vous avez oublié le premier paramètre à SequenceMatcher.

>>> import difflib
>>> 
>>> a='abcd'
>>> b='ab123'
>>> seq=difflib.SequenceMatcher(None, a,b)
>>> d=seq.ratio()*100
>>> print d
44.4444444444

http://docs.python.org/library/difflib.html

Autres conseils

A partir de la documentation:

La classe SequenceMatcher a ce constructeur:

class difflib.SequenceMatcher(isjunk=None, a='', b='', autojunk=True)

Le problème dans votre code est que, en faisant

seq=difflib.SequenceMatcher(a,b)

vous passez a comme valeur de isjunk et b comme valeur de a, laissant la valeur par défaut pour '' b. Il en résulte un rapport de 0.0.

Une façon de surmonter ce (déjà mentionné par Lennart) est de passer explicitement None en tant que premier paramètre supplémentaire de sorte que tous les arguments mot clés assignés les valeurs correctes.

Cependant, je viens de découvrir, et je voulais mentionner une autre solution, qui ne touche pas l'argument isjunk mais utilise la méthode set_seqs() pour spécifier les différentes séquences.

>>> import difflib
>>> a = 'abcd'
>>> b = 'ab123'
>>> seq = difflib.SequenceMatcher()
>>> seq.set_seqs(a.lower(), b.lower())
>>> d = seq.ratio()*100
>>> print d
44.44444444444444
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top