Atualmente, estou construindo um pequeno mecanismo de pesquisa interno baseado no Apache Lucene. Seu objetivo é simples - com base em algumas palavras-chave, ele sugerirá alguns artigos escritos internamente em nossa empresa. Estou usando uma pontuação TF-IDF bastante padrão como métrica básica e construí meu próprio mecanismo de pontuação sobre ela. Tudo isso parece estar funcionando bem, exceto em alguns casos em que o ranking parece confuso.
Então, o que pretendo fazer é adicionar um pequeno link Relevante / Não Relevante à página de resultados da pesquisa, para que os usuários possam clicar em um deles, dependendo da percepção de se esse resultado deveria ter sido incluído.
Minha ideia
- Trate esses Relevantes / Não Relevantes como rótulos e crie dados de treinamento.
- Use esses dados para treinar um classificador (como SVM)
- Incorpore esse modelo ao mecanismo de pesquisa, ou seja, todos os novos resultados passarão pelo classificador e receberão um rótulo para saber se é relevante ou não.
Essa abordagem parece intuitiva para mim, mas não tenho certeza se funcionará na prática. Eu tenho duas perguntas específicas:
- Quais recursos devo extrair?
- Existe uma maneira melhor de integrar o componente de aprendizado de máquina ao mecanismo de pesquisa? Meu objetivo final é "aprender" a função de classificação com base na lógica de negócios e no feedback do usuário.
Respostas:
Primeiro, perceba que você não está classificando documentos. Você está classificando pares (documento, consulta) e, portanto, deve extrair recursos que expressem quão bem eles correspondem.
A abordagem padrão para aprender a classificar é executar a consulta em várias configurações de mecanismos de pesquisa (por exemplo, tf-idf, BM-25 etc.) e, em seguida, treinar um modelo nas pontuações de similaridade, mas para um pequeno SE específico de domínio, você poderia ter recursos como
Essa é uma pergunta muito ampla e a resposta depende de quanto esforço você deseja colocar. A primeira melhoria que vem à mente é que você deve usar não os julgamentos de relevância binária do classificador, mas sua função de decisão com valor real, para que você possa realmente classificar em vez de apenas filtrar. Para um SVM, a função de decisão é a distância assinada para o hiperplano. Bons pacotes de aprendizado de máquina têm uma interface para obter o valor disso.
Além disso, procure aprender em pares e em lista para classificar; o que você está sugerindo é a chamada abordagem pontual. IIRC, em pares funciona muito melhor na prática. O motivo é que, na classificação aos pares, você precisa de muito menos cliques: em vez de fazer com que os usuários rotulem os documentos como relevantes / irrelevantes, você fornece apenas o botão "relevante". Em seguida, você aprende um classificador binário em triplos (documento1, documento2, consulta) que informa se o documento1 é mais relevante para a consulta do que o documento2 ou vice-versa. Quando um usuário rotula, digamos, o documento 4 na classificação como relevante, você fornece seis exemplos para aprender:
para que você obtenha os negativos de graça.
(Essas são apenas sugestões, eu não tentei nada disso. Acabei de trabalhar em um grupo de pesquisa em que as pessoas investigaram aprender a classificar. Eu fiz uma apresentação do artigo de outra pessoa para um grupo de leitura uma vez, talvez o slides podem ser úteis.)
fonte