Pergunta

Eu tenho um site que pode ser pesquisado usando Lucene. Tenho notado a partir de registros que os usuários às vezes não encontrar o que estão procurando, porque eles entram em um termo singular, mas apenas a versão plural desse termo é usado no site. Eu gostaria que a busca para encontrar usos de outras formas de uma palavra bem. Este é um problema que eu tenho certeza que foi resolvido muitas vezes, então o que são as melhores práticas para isso?

Por favor nota:. Este site só tem conteúdo Inglês

Algumas abordagens Pensei:

  1. Procure a palavra em algum tipo de dicionário de sinônimos arquivo para determinar formas alternativas de uma determinada palavra.
    • Alguns exemplos:
      • Pesquisas para "carro", também adicionar "carros" para a consulta.
      • Pesquisas para "carry", também adicionar "carrega" e "levado" para a consulta.
      • Pesquisas para o "pequeno", também adicionar "menor" e "menor" para a consulta.
      • Pesquisas para "pode", também adicionar "não pode", "não pode", "latas", e "enlatados" para a consulta.
      • e ele deve funcionar no sentido inverso (ou seja, procurar "carrega" deve adicionar "carry" e "realizado").
    • Desvantagens:
      • não funciona para muitas palavras novas técnicas, a menos que o dicionário / enciclopédia é atualizado com freqüência.
      • Não tenho certeza sobre o desempenho de pesquisar o arquivo de dicionário de sinônimos.
  2. Gerar as formas alternativas de algoritmos, com base em algumas heurísticas.
    • Alguns exemplos:
      • Se as extremidades da palavra no "s" ou "es" ou "ed" ou "er" ou "est", solte o sufixo
      • Se as extremidades da palavra no "s" ou "ied" ou "ier" ou "IEST", convertido ao "y"
      • Se as extremidades da palavra no "y", convertido ao "s", "IED", "ier", e "IEST"
      • Tente adicionar "s", "es", "ER" e "est" à palavra.
    • Desvantagens:
      • Gera lotes de não-palavras para a maioria das entradas.
      • Se sente como um hack.
      • parece com algo que você encontraria em TheDailyWTF.com. :)
  3. Algo muito mais sofisticado?

Eu estou pensando em fazer algum tipo de combinação das duas primeiras abordagens, mas não tenho certeza de onde encontrar um arquivo de dicionário de sinônimos (ou o que é chamado, como a "enciclopédia" não é muito justo, mas também não é "dicionário").

Foi útil?

Solução

Considere incluindo o PorterStemFilter em seu pipeline de análise. Certifique-se de executar a mesma análise sobre consultas que é usado durante a criação do índice.

Eu também usei o Lancaster decorrentes algoritmo com bons resultados. Usando o PorterStemFilter como um guia, é fácil de integrar com Lucene.

Outras dicas

Word decorrentes obras OK para Inglês, no entanto para as línguas em que palavra decorrente é quase impossível (como a minha) opção # 1 é viável. Eu sei de pelo menos um tal implementação para a minha língua (islandês) para Lucene que parece funcionar muito bem.

Alguns dos parecido com idéias bastante puro. Pessoalmente, gostaria apenas de acrescentar algumas tags para a consulta (transformação de consulta) para torná-lo confuso, ou você pode usar o builtin FuzzyQuery , que utiliza distâncias editar levenshtein, o que ajudaria para mispellings.

Usando pesquisa difusa ' consulta etiquetas ', Levenshtein também é usado. Considere uma pesquisa para 'carro'. Se você alterar a consulta para 'car ~', ele vai encontrar 'carro' e 'carros' e assim por diante. Há outras transformações para a consulta que deve lidar com quase tudo que você precisa.

Se você estiver trabalhando em um campo especializado (Eu fiz isso com horticultura) ou com uma linguagem que o jogo does't bem com métodos resultantes normais, você poderia usar o log de consulta para criar um manual mesa decorrentes.

Basta criar uma palavra ->-tronco mapeamento para todas as incompatibilidades que você pode pensar / as pessoas estão procurando, então, quando a indexação ou busca substituir qualquer palavra que ocorre na tabela com a haste apropriada. Graças à consulta cache esta é uma solução muito barato.

Stemming é uma forma bastante normal para resolver este problema. Descobri que o stemmer Porter é maneira de agressivo para busca padrão palavra-chave. Ele acaba confundindo palavras juntas que têm significados diferentes. Experimente o algoritmo KStemmer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top