11
votes

Comment intégrer "Avez-vous voulu dire" fonctionnalité dans des rails?

Comment pouvez-vous implémenter "Avez-vous voulu dire:" Comme Google le fait dans certaines Queries de recherche ?

ps: J'utilise Sphinx dans mon produit. Pouvez-vous suggérer comment puis-je mettre en œuvre cela? Tous les guides ou suggestions pour d'autres moteurs de recherche qui ont cette fonctionnalité sont les plus accueillis. J'utilise des rails2.3.8, si cela aide

une solution peut être:

Faire un dictionnaire de "mots-clés" ou "phrases" connus, et dans l'action de recherche si rien ne se trouve alors exécutez une requête secondaire dans ce dictionnaire. Mettre à jour ce dictionnaire chaque fois qu'une entrée interrogeable est créée, par exemple, un poteau de blog ou un nom d'utilisateur.

  • Query = "Supreman"

  • Dictionnaire = ["Superman", "Batman", "Hanuman" ...] (dans la table DB)

  • recherche (requête)

  • si aucun résultat, alors

    Rechercher dans le dictionnaire (où "mot-clé" comme requête ou "phrase" comme requête) => "superman"

    Vérification de la documentation Sphinx ou Solr. Ils pourraient avoir une meilleure mise en œuvre de cette requête "comme" qui renvoie une correspondance%.

    • Affichage -> Voulez-vous dire "Superman"?

      Mais le point est de savoir comment le rendre efficace?


0 commentaires

5 Réponses :


1
votes

Je pense que vous recherchez un algorithme de match de chaîne.

Je me souviens Gist Mislav utilisé pour soulever des erreurs lorsque initialiser était légèrement mal orthographié . Cela pourrait être une bonne lecture.

En outre, jetez un coup d'œil à certains articles qu'il suggère:


2 commentaires

N'y a-t-il pas une solution intégrée ou une addon GEM pour les moteurs de recherche de texte complet?


Si je devais mettre en œuvre cela, je commencerais par regarder pg_trgm , puisque la plupart de mes applications utilisent déjà PostgreSQL. Lorsque j'ai vérifié, Sphinx n'a pas de recherche floue comme celle-ci, sauf comme prévu par Stumming.



5
votes

Regardez le Damerau-Levenshtein Algorithme de distance. Il calcule la "distance" entre deux chaînes et détermine le nombre d'étapes qu'il faut pour transformer une chaîne en une autre. Moins les étapes sont les plus proches des deux cordes.

Cet article montre l'algorithme mis en œuvre comme une MySQL stockée fonction.

L'algorithme est tellement meilleur que comme ou Soundex.

Je crois que Google utilise des données sur la foule plutôt qu'un algorithme. C'est-à-dire si un utilisateur Types d'ABCD, clique sur le bouton arrière, puis effectue une recherche immédiatement sur ABD, elle établit une relation entre les deux termes de recherche car l'utilisateur n'était pas satisfait des résultats. Une fois que vous avez une très grande recherche de la communauté, le motif apparaît.


2 commentaires

Lien d'article Retours 404


@ CHCHANAL118 FORMÉ



2
votes

Vous devez jeter un coup d'œil à la théorie réelle de la manière dont Google implémente quelque chose comme ceci: Comment écrire une orthographe Correcteur .

Bien que cet article soit écrit en Python, il existe des liens vers des implémentations dans d'autres langues au bas de l'article. Voici un implémentation de rubis < / a>.


0 commentaires

1
votes

Maintenant, un jour avez-vous signé la fonctionnalité est implémentée sur la base de correcteur phonétique des sorts. Lorsque nous manquons, nous écrivons généralement des mots phonétiquement similaires. Basé sur cette idée correctrice phonétique des sorts recherchent sa base de données pour le mot le plus similaire. Les liens de similarité sont cassés en utilisant le contexte (pour une requête à plusieurs mots, d'autres mots aident également à décider du mot correct) et de la popularité du mot. Si deux mots sont phonétiquement très proches du mot mal orthographié que le mot qui correspond au contexte et est plus fréquemment utilisé dans la vie quotidienne est choisi.


0 commentaires

1
votes

Ceci fonctionne pour moi:

SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%')


1 commentaires

Quoi qu'il en soit, vous pouvez fournir des exemples de ce qui correspond à la correspondance basée sur le terme de recherche? Vous recherchez des choses qui correspondent à des caractères transposés auraient probablement probablement ceci, par exemple: rechercher ALGP au lieu d'ALPG lorsque ALPG et Alfg étaient disponibles pour rechercher.