[MYSQL] Implémentation d'un correcteur d'orthographe en bdd

WRInaute discret
Salut,

Je viens de lancer un site (celui en www) qui est un site de dictionnaire donc avec définitions ( hé logique!) et je travaille actuellement sur la problématique de la recherche avec des mots mal orthographiés.

Pour l'instant, j'ai implémenté une recherche en FULL TEXT. Ainsi si vous chercher par exemple 'club', vous ne trouverez pas de définitions mais un lien vers 'in this club' qui lui est défini.

Par contre, évidemment, cela ne marche pas avec les fautes d'orthographes, ainsi 'cllub' ne renvoie pas vers 'in this club'. J'ai fait une recherche et je suis tombé sur un post d'un blog où on propose un Soundex Français ( car le soundex intégré à MYSQL et PHP ne marche qu'en anglais :( ).

D'où ma question : pensez-vous qu'une bonne solution serait de stocker en base le soundex de chaque mot et plutôt que de faire une recherche FULL TEXT sur le mot non trouvé, de la faire sur son soundex ?

Si vous avez d'autres idées ou des commentaires, n'hésitez pas, je suis sûr que ceci peut être utille pour tous ceux qui font des recherches sur des mots :)

Merci!

EDIT: Voici le lien vers le post
http://blog.mymind.fr/post/2007/03/15/Soundex-Francais
 
WRInaute accro
D'après ce que j'y connais :
- SOUNDEX n'est pas très adapté aux fautes de frappes mais plutôt à "ceux qui écrivent comme ils causent"
- pour les fautes de frappes, je préfère analyser la chaine avec des distances ( ex : http://fr.php.net/levenshtein ou http://fr.php.net/manual/fr/function.similar-text.php )

Si tu réussi à trouver un bon algo pour ton cas, ce qui n'est pas vraiment le problème, tu risque vite d'être confronté à un problème de volume chargé en mémoire : les calculs se font en PHP et pas directement en MySQL.

Donc ce que je ferais personnellement :
- tu utilise FULL TEXT par défaut
- Si tu n'a pas de réponse, tu pars sur une recherche avec correction orthographique.


Si tu par sur ce type de recherche, à l'avenir tu va être obligé de créer des systèmes de cache car pour le moment, ton site a peu de contenu mais j'imagine que celui-ci va grandir assez vite.
 
WRInaute discret
blman a dit:
Si tu réussi à trouver un bon algo pour ton cas, ce qui n'est pas vraiment le problème, tu risque vite d'être confronté à un problème de volume chargé en mémoire : les calculs se font en PHP et pas directement en MySQL.

Justement non, je me disais que je pourrais créer dans ma table de mots une colonne soundex pour ainsi pouvoir stocker le soundex de chaque mot.

Ainsi, l'idée serait lors d'une recherche qui s'avère nulle, de générer son soundex et ensuite d'en faire une recherche en FULL TEXT sur la colonne soundex de ma table de mots.
 
WRInaute passionné
Oui dans le cas de soundex tu peux le pré-calculer.

Maintenant à voir si c'est vraiment ce qu'il y a de plus adapté pour tes recherches.
 
WRInaute accro
Comme tu veux, mais la majorité des cas que j'ai pu constater ne se règle pas avec un SOUNDEX car les fautes de frappes changent aussi la phonétique. Mais en tout cas, ce serait déjà un bon début ;)
 
WRInaute discret
Oui bien sûr, pour levenshtein ou similar-text, il faudrait calculer en direct.. Sans cache, cela deviendrait vite ingérable..

Je pense que je ne perds rien à essayer soundex pour voir ce que ça donne. Mais déjà je vois un problème, j'ai des expressions en partie anglaises donc ça va sûrement compliquer les choses d'avantage en ce qui concerne soundex..

blman, tu as l'air d'avoir déjà été confronté à ce problème. As-tu implémenté un levenshtein ou similar-text ? Avec ou sans système de cache? Si tu avais des retours d'expérience que tu souhaites partager, cela pourrait beaucoup m'aider :)
 
WRInaute accro
Mon cas est un peu différent car ma problématique n'était pas que de la correction orthographique. Ca fait pas mal de temps que je suis sur la problématique d'un moteur de recherche pour des catalogues en ligne, avec bdd en MySQL.

J'ai travaillé moi même de mon côté en analysant la structure de base de données PHPDig, puis en faisant mes 1er tests de mon côté. Ensuite, j'ais confié ce projet à 2 étudiants de Polytech' à Nantes. Et il n'est toujours pas implémenté :( Bon voici le topic de l'époque : https://www.webrankinfo.com/forum/t/developper-un-moteur-de-recherche-en-php.41650/ mais dommage que spidetra ait effacé ses posts quand il a quitté WRI car ils étaient vraiment interressants

En tout cas, les fonctions de correction orthographique utilisent les 2 fonctions PHP. Pas de système de cache super élaborées dans mon cas puisque le volume de recherche ne dépassent pas les 7000-8000 keywords.

Tu va être confronté à d'autres problèmes : singulier/pluriel, synonyme, etc...
 
WRInaute discret
Ok, c'est vrai qu'il s'agit juste de correction orthographique dans mon cas.

J'essaie de regarder du côté de levenshtein en mysql car il me semble que c'est la meilleure méthode pour moi, bien meilleure que le soundex.

Je suis tombé sur :
http://www.sqlteam.com/forums/topic.asp ... hichpage=1

Après, je n'ai jamais eu affaire à des fonctions persos MYSQL donc cela ne me parle pas vraiment en terme de perfs.

J'imagine juste que la meilleure solution serait de mettre en cache le résultat pour une durée fixe si c'est vraiment consommateur.
 
WRInaute occasionnel
Sur le site http://www.mapeo.fr/ il y a un moteur de recherche qui utilise Xapian ( http://xapian.org/ ) comme ça, je me pose pas de problème d'implémentation des corrections orthographiques.

En effet, chaque location en base de données mysql est aussi présente dans une base Xapian pour la recherche texte...

Quand on fait une recherche sur mapeo, la recherche est faite dans la base Xapian, qui me retourne l'id en bdd des objets qui matchent. Ensuite je travaille en base de données tout betement...
 
WRInaute discret
J'ai fait quelques essais et ça n'a pas l'air terrible :eek:
Carnak ne donne rien pour Carnac
Rrnnes pour Rennes

J'ai peut-être mal compris ?
 
WRInaute discret
Bon j'ai pris les devants, je viens d'ajouter FUNCTION LEVENSHTEIN, une fonction stockée à MYSQL. Je vais faire quelques tests et je vous redis ça.

EDIT ( pour éviter de me répondre encore une fois :roll: )
C'est concluant ! Enfin, il faut que j'affine ma requête mais c'est déja pas mal :

http://www.keskiladi.com/definitions/a+veveloued
propose bien à bebeloued comme suggestion :D

Seul problème que je vois pour le moment est que je considère les expressions dans leur ensemble. Cad que j'ai demandé les mots dont le LEV est inférieur à 3.
Du coup : 'cllub' ne renvoie pas in 'this club' car il y a trop de différence.

Mais pour l'instant, ça corrige bien les petites fautes de frappes :)
 
Discussions similaires
Haut