Ci-dessous, les différences entre deux révisions de la page.
— |
mots_similaires [2015/02/27 08:30] (Version actuelle) tyrtamos créée |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Trouver des mots similaires dans une liste avec SequenceMatcher ====== | ||
+ | J'ai une liste de noms saisis au clavier, et qui peut donc comporter des fautes de frappes. | ||
+ | |||
+ | Par exemple: [" | ||
+ | |||
+ | Et je cherche si j'ai " | ||
+ | |||
+ | Dans les modules livrés avec Python, il y une fonction qui fait ça très bien: **SequenceMatcher** (module difflib). Voyons l' | ||
+ | |||
+ | <code python> | ||
+ | from difflib import SequenceMatcher | ||
+ | |||
+ | mots =[" | ||
+ | ratio = 0.8 | ||
+ | resultat = [mot for mot in mots if SequenceMatcher(None, | ||
+ | print(resultat) | ||
+ | [' | ||
+ | </ | ||
+ | |||
+ | J'ai donc trouvé un nom " | ||
+ | |||
+ | Vous voyez que j'ai utilisé un ratio=0.80. En changeant ce ratio, on va pouvoir accepter plus ou moins d' | ||
+ | * Avec ratio = 1.0: je n' | ||
+ | * Avec ratio = 0.0: j' | ||
+ | |||
+ | D' | ||
+ | * ratio = 0.5 => [' | ||
+ | * ratio = 0.6 => [' | ||
+ | * ratio = 0.7 => [' | ||
+ | * ratio = 0.8 => [' | ||
+ | * ratio = 0.9 => [] | ||
+ | |||
+ | Mais je ne trouve pas " | ||
+ | |||
+ | <code python> | ||
+ | import unicodedata | ||
+ | |||
+ | def majuscsa(chaine): | ||
+ | """ | ||
+ | """ | ||
+ | # convertit en majuscule avec conservation des accents éventuels | ||
+ | chaine = chaine.upper() | ||
+ | # supprime les accents éventuels qui restent | ||
+ | chnorm = unicodedata.normalize(' | ||
+ | return "" | ||
+ | </ | ||
+ | |||
+ | Et dans ce cas, on va créer une fonction qui va contenir notre SequenceMatcher et qui permettra d' | ||
+ | |||
+ | <code python> | ||
+ | from difflib import SequenceMatcher | ||
+ | |||
+ | def simil(mot1, mot2, ratio, okmajusc=True): | ||
+ | """ | ||
+ | si okmajusc=True, | ||
+ | """ | ||
+ | if okmajusc: | ||
+ | mot1, mot2 = majuscsa(mot1), | ||
+ | return SequenceMatcher(None, | ||
+ | </ | ||
+ | |||
+ | Avec ces 2 fonctions, et sans tenir compte de la casse, on trouveras: | ||
+ | * ratio = 0.5 => [' | ||
+ | * ratio = 0.6 => [' | ||
+ | * ratio = 0.7 => [' | ||
+ | * ratio = 0.8 => [' | ||
+ | * ratio = 0.9 => [' | ||
+ | |||
+ | Et, cerise sur le gâteau, si on utilise une base de données relationnelle sqlite3 avec le pilote Python, on peut ajouter ces 2 fonctions Python pour pouvoir les **utiliser directement dans les requêtes SQL**! Avec une connexion ouverte cnx, on va faire simplement: | ||
+ | |||
+ | <code python> | ||
+ | # fonction ' | ||
+ | cnx.create_function(" | ||
+ | |||
+ | # fonction ' | ||
+ | cnx.create_function(" | ||
+ | </ | ||
+ | |||
+ | J' | ||
+ | |||
+ | Amusez-vous bien! | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <style type=" | ||
+ | <!-- | ||
+ | body {background-image: | ||
+ | --> | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | </ | ||
+ | </ |