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

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Chacho, 22 Juillet 2008.

  1. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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
     
  2. blman
    blman WRInaute accro
    Inscrit:
    5 Septembre 2003
    Messages:
    2 719
    J'aime reçus:
    3
    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.
     
  3. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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.
     
  4. Bool
    Bool WRInaute passionné
    Inscrit:
    26 Février 2004
    Messages:
    1 543
    J'aime reçus:
    0
    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.
     
  5. blman
    blman WRInaute accro
    Inscrit:
    5 Septembre 2003
    Messages:
    2 719
    J'aime reçus:
    3
    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 ;)
     
  6. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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 :)
     
  7. blman
    blman WRInaute accro
    Inscrit:
    5 Septembre 2003
    Messages:
    2 719
    J'aime reçus:
    3
    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...
     
  8. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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.
     
  9. ltressens
    ltressens WRInaute occasionnel
    Inscrit:
    2 Avril 2004
    Messages:
    451
    J'aime reçus:
    0
    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...
     
  10. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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 ?
     
  11. Chacho
    Chacho WRInaute discret
    Inscrit:
    16 Septembre 2007
    Messages:
    72
    J'aime reçus:
    0
    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 :)
     
Chargement...
Similar Threads - [MYSQL] Implémentation correcteur Forum Date
[résolu][mysql] faire un "NOT LIKE" sur une chaîne contenant des / Développement d'un site Web ou d'une appli mobile 25 Octobre 2014
[MySQL] Liste (select) avec des lignes au hasard Développement d'un site Web ou d'une appli mobile 23 Octobre 2014
[MySQL] Requête SELECT et INSERT entre 3 tables liées+Aide Développement d'un site Web ou d'une appli mobile 30 Avril 2014
[MySQL] Nombre d'enregistrements sur des horaires précis Développement d'un site Web ou d'une appli mobile 19 Juillet 2013
[MYSQL] Comment remplacer caractères dans tous les champs de toutes les tables d'une base? Développement d'un site Web ou d'une appli mobile 11 Juillet 2013
[MYSQL] Une sorte de "OR JOIN" ? Développement d'un site Web ou d'une appli mobile 5 Juillet 2013
[MySQL] sélectionner la dernière note pour chaque élève en une seule requète ? Développement d'un site Web ou d'une appli mobile 12 Avril 2012
[Mysql] Requête PDO avec variable php Développement d'un site Web ou d'une appli mobile 16 Février 2012
[Mysql] Requête PDO aléatoire Développement d'un site Web ou d'une appli mobile 7 Février 2012
[MYSQL] Tri par date Développement d'un site Web ou d'une appli mobile 7 Septembre 2011
[MySQL] rechercher une valeur dans un champ sérialisé Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] Requête SELECT entre 3 tables liées Développement d'un site Web ou d'une appli mobile 10 Août 2011
[MySQL] addslashes et stripslashes Développement d'un site Web ou d'une appli mobile 9 Août 2011
[résolu] [mysql] Conditions WHERE avec AND et OR Développement d'un site Web ou d'une appli mobile 13 Mai 2011
[mysql] trier les résultats d'une requête selon une table non liée à la requête Développement d'un site Web ou d'une appli mobile 15 Avril 2011
[résolu] [mysql] passer un champ à une valeur donnée pour tous les enregistrements Développement d'un site Web ou d'une appli mobile 25 Mars 2011
[MySQL] INSERT / UPDATE conditionnel Développement d'un site Web ou d'une appli mobile 1 Février 2011
[mysql] LIMIT utile sur un champ indexé ? Développement d'un site Web ou d'une appli mobile 8 Décembre 2010
[mySQL] Découper une table et gagner en performance ? Développement d'un site Web ou d'une appli mobile 9 Janvier 2010
[MySQL] Récupérer la première ligne d'un GROUP BY Développement d'un site Web ou d'une appli mobile 14 Décembre 2009