6 votes

Calculer le score uniquement en fonction des documents ayant plus d'occurrences du terme dans Lucene

Je suis en train de travailler sur le composant de récupération de CV (document) basé sur le moteur lucene.net. Cela fonctionne bien, et il récupère le document et l'évalue en fonction de la

l'idée derrière le VSM est que plus de fois qu'un terme de requête apparaît dans un document par rapport au nombre de fois que le terme apparaît dans tous les documents de la collection, plus pertinant ce document est pour la requête.

La fonction de score pratique de Lucene est dérivée de ce qui suit.

score(q,d)=coord(q,d)·queryNorm(q)· ( tf(t in d) ·idf(t)2 · t.getBoost() · norm(t,d) ) 
                                  t in q

dans ceci

  • tf(t in d) correspond à la fréquence du terme, définie comme le nombre de fois où le terme t apparaît dans le document actuellement évalué d. Les documents ayant plus d'occurrences d'un terme donné reçoivent un score plus élevé
  • idf(t) signifie Inverse Document Frequency. Cette valeur correpond à l'inverse de docFreq (le nombre de documents dans lesquels le terme t apparaît). Cela signifie que les termes plus rares contribuent davantage au score total.

Ceci est très bon en effet dans la plupart des situations, mais en raison du calcul de la fieldnorm le résultat n'est pas précis

fieldnorm alias valeur de la "longueur du champ" représente la longueur de ce champ dans ce doc (donc les champs plus courts sont automatiquement boostés).

À cause de cela, nous n'obtenons pas les résultats précis. Par exemple, si j'ai 10000 documents parmi lesquels 3000 documents contiennent le mot-clé java et oracle. Et le nombre de fois où cela apparaît varie d'un document à l'autre.

  • supposons que le doc A contient 10 fois java et 20 fois oracle parmi 1000 mots et le doc B contient 2 fois java et 2 fois oracle parmi 50 mots
  • si je recherche une requête "java and oracle", lucene renvoie le doc B avec un score élevé en raison de la normalisation de la longueur.

En raison de la nature de l'activité, nous devons récupérer en premier les documents contenant le plus d'occurrences de mots-clés de recherche, la longueur du document ne nous importe pas vraiment.

À cause de cela, une personne avec un long CV contenant de nombreux mots-clés est déplacée vers le bas dans les résultats et certains courts CV remontent.

Pour éviter cela, j'ai besoin de désactiver la normalisation de la longueur. Quelqu'un peut-il m'aider avec cela??

J'ai attaché l'image du résultat de Luke pour votre référence.

Dans cette image, le document avec java 50 fois et oracle 6 fois est descendu à la 11e position.

texte alternatif

Mais ce document avec java 24 fois et oracle 5 fois est en tête du classement en raison de la fieldnorm.

texte alternatif

J'espère avoir transmis les informations clairement... Sinon, n'hésitez pas à me demander plus d'informations

9voto

Shashikant Kore Points 3419

Vous pouvez désactiver la normalisation de la longueur avec Field.setOmitNorms(true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X