Pergunta

Caso de uso

Quando um usuário vai ao meu site, ele será confrontado com uma caixa de pesquisa como assim. Eles podem procurar resultados usando o texto do plano. ".NET PERGUNTAS", "Questões fechadas", ".NET e Java", etc. A pesquisa funcionará um pouco diferente que, na medida em que tentará o máximo possível do esquema do banco de dados em vez de um Pesquisa de texto completo reto. Então ". As perguntas retornarão perguntas relacionadas a .NET e Java e nada mais.

Problema

Não estou muito familiarizado com as palavras, mas basicamente quero fazer uma palavra -chave na pesquisa acionada por SQL. Conheço o esquema do banco de dados e também posso datar o banco de dados. Quero saber quaisquer abordagens atuais que já existam antes de tentar implementar isso. Eu acho que essa pergunta é para o que é um bom design para o problema declarado.

Proposto

Minha solução proposta até agora se parece com isso

  1. Limpe a entrada. Basta remover quaisquer caracteres especiais
  2. Analise a entrada em pedaços de dados. Quebre uma entrada de "C# java" em C# e Java também lida com casos especiais como "C# java 'perguntas" em' c# java 'e "questões".
  3. Construir uma árvore a partir da entrada
  4. Vincular os dados em metadados. Portanto, converta coisas como perguntas fechadas e relacione -as na coluna isclosed de uma tabela.
  5. Converta a árvore em uma consulta SQL.

Pensamentos/sugestões/links?

Foi útil?

Solução

Eu executei uma loja de música digital com uma "pesquisa única" que pesa palavras -chave com base em suas ocorrências e no esquema em que os produtos aparecem, por exemplo. com colunas diferentes como "Artista", "Title" ou "Publisher".

Os produtos também estão relacionados a álbuns e listas de reprodução, mas, para uma explicação mais simples, apenas elaborarei a indexação e a consulta das palavras -chave dos produtos.

Esquema de banco de dados

Keywords Tabela - Uma tabela ponderada para cada palavra que poderia ser pesquisada (portanto, é referenciada em algum lugar) com os seguintes dados para cada registro:

  • ID de palavra -chave (não a palavra),
  • A própria palavra,
  • Um valor alfa do som para a palavra
  • Peso

ProductKeywords Tabela - Uma tabela ponderada para cada palavra -chave referenciada por qualquer um dos campos de um produto (ou colunas) com os seguintes dados para cada registro:

  • ID do produto,
  • ID de palavra -chave,
  • Peso

Ponte de palavra -chave

O valor da ponderação é uma indicação de com que frequência as palavras ocorre. As palavras -chave correspondentes com um peso mais baixo são "mais exclusivas" e têm maior probabilidade de ser o que está sendo pesquisado. Dessa maneira, as palavras que ocorrem geralmente são automaticamente "ponderadas para baixo", por exemplo. "The", "A" ou "I". No entanto, é melhor retirar as ocorrências atômicas dessas palavras comuns antes da indexação.

Eu usei números inteiros para ponderação, mas o uso de um valor decimal oferecerá mais versatilidade, possivelmente com classificação um pouco mais lenta.

Indexação

Sempre que qualquer campo de produto é atualizado, por exemplo. Artista ou título (que não acontece com tanta frequência), um gatilho de banco de dados re-indexos as palavras-chave do produto como So dentro de uma transação:

  1. Todas as palavras -chave do produto são desassociadas e excluídas se não for mais referenciadas.
  2. Cada campo de campo indexado (por exemplo, artista) é armazenado/recuperado como uma palavra -chave na íntegra e relacionada ao produto no ProductKeywords Tabela para uma correspondência direta.
  3. O peso da palavra -chave é então incrementado por um valor que depende da importância do campo. Você pode adicionar, subtrair o peso com base na importância do campo. Se o artista é mais importante que o título, subtraia 1 ou 2 de seu ProductKeyword Ajuste de peso.
  4. Cada valor de campo indexado é despojado de quaisquer caracteres não alfanuméricos e dividido em grupos de palavras separados, por exemplo. "Billy Joel" se torna "Billy" e "Joel".
  5. Cada grupo de palavras separado para cada valor de campo éexado e armazenado/recuperado como palavra -chave e associado ao produto da mesma maneira que na etapa 2. Se uma palavra -chave já foi associada a um produto, seu peso será simplesmente ajustado.

Consulta

  1. Pegue a sequência de pesquisa de consulta de entrada na íntegra e procure uma palavra -chave correspondente direta. Recupere todas as palavras do ProductKey para a palavra-chave em uma tabela de memória junto com o peso da palavra-chave (diferente do peso do ProductKeyword).
  2. Retire todos os caracteres não alfanuméricos e divida a consulta em palavras-chave. Recupere todas as palavras -chave existentes (apenas algumas correspondem). Junte-se ao ProductKeyWords para corresponder palavras-chave com a tabela de memória junto com o peso da palavra-chave, que é diferente do peso do ProductKeyword.
  3. Repita a etapa 2, mas use os valores do SoundEx, ajustando os pesos para ser menos relevante.
  4. Junte -se a PRODORDKEY PRODORDS ENGRESENTES EM SEUS PRODUTOS RELACIONADOS e recupere as vendas de cada produto, o que é uma medida de popularidade.
  5. Classifique os resultados por peso -chave, peso do ProductKeyword e vendas. A soma/classificação final e/ou ponderação depende da sua implementação.
  6. Limite os resultados e retorne os resultados da pesquisa do produto ao cliente.

Outras dicas

O que você está procurando é Processamento de linguagem natural. Estranhamente isso usado a ser incluído grátis como Consulta em inglês no SQL Server 2000 e antes. Mas se foi agora

Algumas outras fontes são:

O conceito é um meta -dados dicionário de mapeamento de palavras para tabela, colunas, relacionamentos etc. e um analisador de frases em inglês combinado para converter uma frase em inglês (ou apenas algumas palavras -chave) em uma consulta real

Algumas pessoas, até mesmo, consulta inglesa do usuário com reconhecimento de fala por algumas demos muito legais, nunca a viram usada com raiva!

Se você estiver usando o SQL Server, você pode simplesmente usar seu Pesquisa de texto completo Recurso, que foi projetado especificamente para resolver seu problema.

Você pode usar uma abordagem híbrida, seguir os resultados de pesquisa de texto completos e filtrá -los com base nos meta -dados do seu #4. Para algo mais inteligente, você pode criar uma solução simples de aprendizado supervisionada, rastreando o que vincula o usuário depois da pesquisa e armazenar essa opção com as principais palavras de pesquisa em uma árvore de decisão. As pesquisas seriam então extraídas desta árvore de decisão

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