Je construis actuellement un petit moteur de recherche interne basé sur Apache Lucene. Son objectif est simple - basé sur certains mots clés, il proposera des articles rédigés en interne au sein de notre entreprise. J'utilise un score TF-IDF assez standard comme métrique de base et j'ai construit mon propre mécanisme de score dessus. Tous ces éléments semblent fonctionner parfaitement, à l'exception de certains cas de coin où le classement semble foiré.
Donc, ce que je prévois de faire, c'est d'ajouter un petit lien pertinent / non pertinent à la page de résultats de recherche afin que les utilisateurs puissent cliquer sur l'un d'entre eux en fonction de leur perception de savoir si ce résultat aurait dû être inclus en premier lieu.
Mon idée
- Traitez ces éléments pertinents / non pertinents comme des étiquettes et créez des données de formation.
- Utilisez ces données pour former un classificateur (tel que SVM)
- Incorporer ce modèle dans le moteur de recherche, c'est-à-dire que chaque nouveau résultat passera par le classificateur et se verra attribuer une étiquette indiquant s'il est pertinent ou non.
Cette approche me semble intuitive mais je ne sais pas si elle fonctionnera dans la pratique. J'ai deux questions spécifiques:
- Quelles sont les fonctionnalités à extraire?
- Existe-t-il un meilleur moyen d'intégrer le composant d'apprentissage automatique dans le moteur de recherche? Mon objectif final est «d'apprendre» la fonction de classement en fonction à la fois de la logique métier et des commentaires des utilisateurs.
Réponses:
Tout d'abord, sachez que vous ne classifiez pas de documents. Vous êtes en train de classer des paires (document, requête), vous devez donc extraire des fonctionnalités qui expriment leur adéquation.
L'approche standard pour apprendre à classer consiste à exécuter la requête sur diverses configurations de moteur de recherche (par exemple, tf-idf, BM-25, etc.), puis à former un modèle sur les scores de similitude, mais pour une petite SE spécifique au domaine, vous pourriez avoir des fonctionnalités telles que
Il s'agit d'une question très large, et la réponse dépend de l'effort que vous souhaitez consacrer. La première amélioration qui vient à l'esprit est que vous devez utiliser non pas les jugements de pertinence binaire du classificateur, mais sa fonction de décision à valeur réelle, afin que vous puissiez réellement faire un classement au lieu de simplement filtrer. Pour un SVM, la fonction de décision est la distance signée à l'hyperplan. Les bons packages d'apprentissage automatique ont une interface pour obtenir la valeur de cela.
Au-delà de cela, examinez l'apprentissage par paire et par liste pour classer; ce que vous proposez, c'est l'approche dite point par point. L'IIRC, en binôme, fonctionne beaucoup mieux en pratique. La raison en est qu'avec le classement par paire, vous avez besoin de beaucoup moins de clics: au lieu de demander aux utilisateurs d'étiqueter les documents comme pertinents / non pertinents, vous ne leur donnez que le bouton "pertinent". Ensuite, vous apprenez un classificateur binaire sur les triplets (document1, document2, requête) qui indique si document1 est plus pertinent pour la requête que document2, ou vice versa. Lorsqu'un utilisateur nomme, disons, le document 4 du classement comme pertinent, cela vous donne six exemples à tirer des enseignements suivants:
vous obtenez donc les négatifs gratuitement.
(Ce ne sont que des suggestions, je n'ai rien essayé de tout cela. Il se trouve que j'ai travaillé dans un groupe de recherche où les gens ont étudié l'apprentissage du classement. J'ai fait une fois une présentation du document de quelqu'un d'autre pour un groupe de lecture, peut-être le les diapositives peuvent être utiles.)
la source