Créer un moteur de recherche interne qui trouve les fautes d'orthographe

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Hey :)

Pour mon projet de fin d'année, je dois réaliser un site, mais incluant dedans un moteur de recherche interne, je me suis dis que j'aimerai le développer un peu plus pour qu'il cherche et corrige les fautes d'orthographe (au lieu d'écrire pomme on écrit pome, et bah le script "vois" pomme quand même ;) ) le soucis est que j'ai tenté une méthode assez abracadabrante qui arrive facilement à la limite du max_execution_time.

Mon script c'est que je récupère le mot qui n'a aucune correspondance, et je lui enlève une lettre pour voir si j'ai une occurrence, si j'en ai pas, je lui enlève une seconde lettre et je regarde, ce qui fait qu'avec un mot qui n'existe pas, le script se coupe :/ Avez vous une idée sur l'algo qui faudrait utiliser ou même une idée sur le fonctionnement (j'ai pensé à un annuaire mais ça risque d'être balaise à parser à la fin)

Merci d'avance et bon week end :)

(PS: j'aurai bien utilisé tntsearch mais il est compatible PHP 5.5, hors l'IUT nous brides à PHP 5.3 :( )

Un projet de gestion de container sur Zds | dryWamp une page d'accueil pour Wamp

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

D'un point de vue technique, ça peut être assez fun, mais d'un point de vue pratique, ce n'est pas une bonne idée. Si je m'appelle Jean Grosnez, ton algorithme risque d'ajouter automatiquement un espace, ou de mettre grognez comme le propose mon correcteur d'orthographe. Si j'écris hiuret, c'est-à-dire huitre en étant très fatigué (mais ça m'arrive :-° ), mon correcteur veux mettre chiure. Et ainsi de suite…

D'un point de vue pratique, procéder en tester les différentes façon d'enlever ou d'ajouter une lettre me semble long et peu efficace. Exemple simple : aps. Est-ce pas avec deux lettre inversée ou laps avec le l qui n'est pas passé ? Ça implique de plus de tester les 26 lettres à chacun des emplacements, à deux reprises (ajouter deux lettres), soit très vite beaucoup beaucoup.

Il existe des modules d'orthographe et de grammaire (en libre et français, il y a grammalecte). Il serait plus simple de les réutiliser (ou au moins de voir comment ils fonctionnent). Le niveau de base consisterai à remplacer les mots mal orthographiés par le mot le plus probable. Le niveau avancé vérifierai que le résultat est correcte grammaticalement parlant, et essayerai les solutions suivantes si non.

Hier, dans le parc, j'ai vu une petite vieille entourée de dinosaures aviens. Je donne pas cher de sa peau.

+1 -0

Hello :)

J'avais fait un script d’auto complétion. J'avais trouvé une liste de mots en français (~300 000). J'avais trouvé une algorithme permettant "d'évaluer" la différence entre 2 mot, avec en retour un nombre. J’exécutais cette pour chaque mot du dictionnaire, avec le mot. Avec un pc basique, ça mettais quelques centaines de millisecondes, bien que ça soit un peu une usine à gaz.

Bonjour coupain. Va voir mon Blog, et dit moi par mp ce que tu en pense

+1 -0
Auteur du sujet

Merci @Gabbro, donc l'idée de regarder virer et ajouter une lettre ça vire (c'est vrai que c'est utile dans le cas de "pome" :p "
@Drulac j'avous que j'aimerai tout faire à la main :p
Mais le soucis avec les techniques que vous me proposez, c'est le dictionnaire. Il sera hyper lourd à la fin :/

M1ce koi, pk lé jen fon dé fot d'ortograf ?! x)

Un projet de gestion de container sur Zds | dryWamp une page d'accueil pour Wamp

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

L'idée de générer plein de variantes localement puis faire plein de requêtes pour voir s'il y a un résultat n'est pas une très très bonne idée.

Les deux idées qui me viennent tête sont les suivantes, tu peux soit

  • comparer comment les mots "sonnent" et proposer des mots qui "sonnent" similaire (par exemple avec soundex), ou
  • proposer des mots qui sont "proches" d'autres mots en calculant une distance entre ces deux mots (par exemple avec la distance de Levenstein).

Tu n'as pas dit quelle base de donnée tu comptais utiliser, partons du principe que c'est MySQL.

  • MySQL propose une fonction SOUNDEX, tu peux donc l'utiliser.
  • Il est aussi possible dans MySQL d'implémenter tes propres fonctions, voici un exemple d'implémentation de la distance de Levenstein pour MySQL: http://stackoverflow.com/a/4671557/4359369

Édité par victor

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+1 -0
Auteur du sujet

Je compte bien utiliser MySQL ;)
Donc en sommes, je vais toujours devoir posséder un dictionnaire c'est bien ça ? Sinon je serai obliger de parser chaque titre dans MySQL non ?

Un projet de gestion de container sur Zds | dryWamp une page d'accueil pour Wamp

+0 -0
Staff

Un dictionnaire ? Pour quoi faire ? Demande plutôt à mysql de faire le boulot à la volée, c'est fait pour. Je sais pas combien de texte tu auras dans ta base de données, mais à moins de quelques centaines de millions t'es tranquille.

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+0 -0
Auteur du sujet

La fonction SOUNDEX (par exemple) calcul au mot (j'ai testé la fonction dans une requête, elle comparait une chaine et un mot et le résultat était nul (logique tu me dira ^^ ) À moins que je sois "obligé" de faire une table comportant tout les mots justes ? (et pour l'occas' j'ai bossé dans une boite où il avait 75 000 données dans la base de donnée et elle galérais… Bon, les serveurs étaient aussi puissant que des poneys unijambiste mais voilà, avec trop de mot les performances seront grandement impacté non ?) :)

Un projet de gestion de container sur Zds | dryWamp une page d'accueil pour Wamp

+0 -0

Cette réponse a aidé l'auteur du sujet

Personnellement j'avais mis 300 000 d'entrées sur une base de donnée MySQL. Ça ne mettait que quelques dizaines de millisecondes pour faire le calcul de distance et de me donner les 10 mots les plus près, alors que j'y faisait en PHP (un test par mot présent dans la DB…). Et tout ça sur un pc lambda. Donc je pense que niveau performance ça devrait aller.

Bonjour coupain. Va voir mon Blog, et dit moi par mp ce que tu en pense

+1 -0
Staff

La fonction SOUNDEX (par exemple) calcul au mot (j'ai testé la fonction dans une requête, elle comparait une chaine et un mot et le résultat était nul (logique tu me dira ^^ )

Pas sûr de bien comprendre ce que tu expliques ici. Un mot est une chaîne de caractères.

Si tu as ton texte dans une colonne dont les champs texte contiennent plusieurs mots, tu peux directement demander à MySQL de te découper ça en mots. C'est très bien foutu, ça exclut même automatiquement les stop words. Plus d'infos ici : http://dev.mysql.com/doc/refman/5.7/en/fulltext-stopwords.html

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+0 -0
Auteur du sujet

FULLTEXT a grandement réduit mon script (et il est moins bourrin ^^ ) Le hic (faut toujours qu'il y en ai un ^^ ) je n'arrive pas à demander à MySQL de me séparer tout ça en mot ^^ (j'utilise ça : sql SELECT SUBSTR(title, " ") as titre mais ça me renvoie des lignes sans valeur Et les méthodes proposé ne préviennes pas d'un oublie de lettre (passer de responsable à responsble n'est plus la même chose pour soundex) (sauf si je fais une comparaison et si la différence entre les deux soundex est inférieur à (je vais dire une bêtise) 10 alors on fait des recherches sur le mot… Bon, j'ai plus qu'à la traduire en SQL :p

Édité par Dryusdan

Un projet de gestion de container sur Zds | dryWamp une page d'accueil pour Wamp

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte