Question

J'ai un site qui est consultable en utilisant Lucene. Je l'ai remarqué à partir des journaux que les utilisateurs parfois ne trouvent pas ce qu'ils cherchent parce qu'ils entrent dans un terme singulier, mais seulement la version plurielle de ce terme est utilisé sur le site. Je voudrais que la recherche pour trouver des utilisations d'autres formes d'un mot aussi bien. Ceci est un problème que je suis sûr a été résolu plusieurs fois, alors quelles sont les meilleures pratiques pour cela?

S'il vous plaît noter:. Ce site a seulement contenu en anglais

Quelques approches que j'ai pensé:

  1. Recherchez le mot dans une sorte de fichier thésaurus pour déterminer d'autres formes d'un mot donné.
    • Quelques exemples:
      • Recherches pour « voiture », ajoutez également « voitures » à la requête.
      • recherches pour « porter », ajoutez également « porte » et « porté » à la requête.
      • recherches pour « petit », ajoute aussi « petit » et « plus petit » à la requête.
      • recherches pour « peut », ajouter aussi « ne peut pas », « ne peut pas », « boîtes », et « en boîte » à la requête.
      • Et il devrait fonctionner en sens inverse (à savoir la recherche de « porte » devrait ajouter « porter » et « porté »).
    • Inconvénients:
      • ne fonctionne pas pour beaucoup de nouveaux mots techniques à moins que le dictionnaire / thésaurus est mis à jour fréquemment.
      • Je ne suis pas sûr de la performance de la recherche du fichier thésaurus.
  2. Générer les autres formes Algorithmiquement, basé sur des heuristiques.
    • Quelques exemples:
      • Si le mot se termine par "s" ou "es" ou "ed" ou "er" ou "est", laissez tomber le suffixe
      • Si le mot se termine par "s" ou "ied" ou "ier" ou "iest", convertir en "y"
      • Si le mot se termine par "y", convertir en "s", "ied", "ier" et "iest"
      • Essayez d'ajouter "s", "es", "er" et "est" au mot.
    • Inconvénients:
      • Génère beaucoup de non-mots pour la plupart des entrées.
      • Ressenti comme un hack.
      • On dirait que quelque chose que vous pouvez trouver sur TheDailyWTF.com. :)
  3. Quelque chose de beaucoup plus sophistiqué?

Je pense à faire une sorte de combinaison des deux premières approches, mais je ne suis pas sûr où trouver un fichier thésaurus (ou ce qu'il appelle, comme « thésaurus » n'est pas tout à fait raison, mais ce ne est "dictionnaire").

Était-ce utile?

La solution

Pensez à inclure PorterStemFilter dans votre pipeline d'analyse. Assurez-vous d'effectuer la même analyse sur les requêtes qui sont utilisées lors de la construction de l'indice.

Je l'ai aussi utilisé le Lancaster issue algorithme avec de bons résultats. Utilisation de la PorterStemFilter comme guide, il est facile d'intégrer Lucene.

Autres conseils

mot issu de l'anglais fonctionne bien, mais pour les langues où mot issu est presque impossible (comme le mien) l'option 1 est viable. Je connais au moins une telle mise en œuvre de ma langue (islandaise) pour Lucene qui semble fonctionner très bien.

Certains de ceux qui ressemblent à des idées assez nettes. Personnellement, je voudrais juste ajouter quelques balises à la requête (transformation de requête) pour la rendre floue, ou vous pouvez utiliser la fonction interne FuzzyQuery , qui utilise des distances d'édition Levenshtein, ce qui aiderait à fautes d'orthographe.

Utiliser la recherche floue ' balises de requête ', Levenshtein est également utilisé. Pensez à une recherche de « voiture ». Si vous changez la requête « voiture ~ », il trouvera « voiture » et « voitures » et ainsi de suite. Il existe d'autres transformations à la requête qui doit gérer presque tout ce dont vous avez besoin.

Si vous travaillez dans un domaine spécialisé (je l'ai fait avec l'horticulture) ou avec une langue qui does't jouer bien avec des méthodes issues normales, vous pouvez utiliser la journalisation des requêtes pour créer une table issue manuelle.

Il suffit de créer un mot -> mapping souches pour tous les discordances que vous pouvez penser / les gens recherchent, puis lors de l'indexation ou la recherche remplacer un mot qui se produit dans la table avec la tige appropriée. Merci d'interroger la mise en cache c'est une solution pas cher.

Découlant est une façon assez standard pour résoudre ce problème. J'ai trouvé que l'égrappoir Porter est une façon de agressive pour la recherche de mot-clé standard. Il finit par mots amalgamant ensemble qui ont des significations différentes. Essayez l'algorithme KStemmer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top