Levenshtein

Proposition de mots lors de la recherche.

La principale vocation du plugin Levenshtein est de proposer des corrections de mots lors de la recherche.

Dépendance

Pour fonctionner le plugin a besoin d’un lexique dans lequel faire les recherches et comparaisons.

Pour cela, il dispose du pipeline levenshtein_calculer.

Ce pipeline fournit 2 paramètres :

  • mot : les mots qui sont candidats à être des corrections du mot.
  • term : le mot à rechercher.

Exemple dans le plugin Vocabulaire :

function vocabulaire_levenshtein_calculer($flux) {
	$get_lev = sql_allfetsel('mot', 'spip_vocabulaires', 'SOUNDEX(mot) = SOUNDEX('.sql_quote($flux['term']).')');
	$flux['mot'] = array_merge($flux['mot'], $get_lev);
	return $flux;
}

Ensuite, le plugin va calculer la distance de levenshtein et filtrer pour ne garder que les mots les plus proches.

L’affichage

L’affichage des propositions de correction se fait via la balise #LEVENSHTEIN. Si aucun paramètre n’est passé à la balise, elle utilisera automatiquement le contenu de la recherche (_request(’recherche’)).

Si un paramètre est passé à la balise, il sera utilisé à la place de ’recherche’ (_request(’mon_truc’))

Les SOUNDEX

L’utilisation des SOUNDEX de mysql est un précieux allié quand on travaille sur les corrections de mots.
Le plugin Vocabulaire référence 336531 mots français. Impossible de tester chaque mots avec la distance de Levenshtein, les serveurs classiques ne le supporteraient pas.

C’est là qu’interviennent les SOUNDEX, cela filtre les mots d’une base de donnée pour renvoyer les mots qui « sonne » comme les autres. Cela fait directement moins de mots à tester.

Ce plugin est installé sur le moteur de recherche de mon site personnel. N’hésitez pas à jouer avec !

Un merci spécial à Vladimir Levenshtein pour sa découverte mathématique et à PHP pour offrir une fonction levenshtein out of the box.

Discussion

4 discussions

  • 3

    Bonjour,

    J’obtiens cette erreur sur la page de configuration en spip3.1 :

    1 Filtre levenshtein_spip non défini ../plugins/auto/levenshtein/v1.0.1/prive/squelettes/contenu/configurer_levenshtein.html

    ainsi qu’un string(8) « broeutte »

    Je réinstalle pour voir si dès fois...

    Répondre à ce message

  • Merci pour ce plugin. Toutefois, puis-je suggerer de calculer la distance Levenshtein entre les mots en lowercase ? Car pour ma part, j’aime avoir les mots en lowercase dans mon URL (surtout que mon terme se trouve dans le path de l’URL et non pas en parametre), mais les titres des mots ont la premiere lettre en majuscules dans ma base de donnees.

    exemple d’URL :

    /recherche/toto/

    Et mon titre dans la table spip_mots :

    Toto

    Ce cas donne une distance Levenshtein de 1, donc le plugin suggere a nouveau la recherche actuelle.

    Aussi j’ai du modifier le code pour l’adapter a mon systeme d’URL. Un petit pipeline pour definir soi-meme les URLs a creer pour la suggestion serait pratique.

    Répondre à ce message

  • 3

    Bonne nouvelle, Je ne savais pas que soundex avait une version française.
    Quand je l’utilisais sous oracle, le résultat était assez cocasse, la prononciation anglaise étant différente de la française pour une même orthographe .
    On a fini par me demander de l’enlever de mes programmes.

    • J’avoue que je ne me suis pas trop posé la question, j’ai testé soundex sur la base de donnée FR et ça fonctionnait, j’en ai fait un plugin.

      Après c’est peut être simplement que MySQL supporte mieux soundex que Oracle... Ou alors ça fonctionne juste parce que j’ai de la chance :)

    • En faite, tu as complètement raison, les soundex MySQL ne fonctionnent bien qu’avec l’Anglais : http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_soundex

      Du coup, l’utilisation de Soundex est discutable, il faudrai un autre moyen de filtrer les mots...

      Crotte !

    • Du coup, c’est moi qui suis déçu :-)
      Après, comme tu as pu le constater, cela fonctionne quand même.
      Il faut juste que l’utilisateur accepte de n’avoir -parfois- que des résultats sans rapport avec la saisie.

    Répondre à ce message

  • 1

    Hello,

    bravo pour cette initiative qui promet !

    Là je galère un peu : j’ai installé les deux plugins : Levenshtein et Vocabulaire, importé fr.txt.

    Mais le plugin ne semble pas prendre en compte la base installée dans spip_vocabulaires.
    Du coup, à des fins de tests, j’ai désinstallé Vocabulaire et j’ai exactement les mêmes propositions
    Qu’est ce que j’ai raté ?

    Peetdu
    ps : Et je n’ai pas compris comment / où utiliser la balise #LEVENSHTEIN ?

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom