Conceito de pesquisa difusa de banco de dados


13

Pensei sobre isso e tenho tentado encontrar soluções sobre como pesquisar um banco de dados nebuloso, se, por exemplo, um usuário digitar um erro de ortografia. Algum problema flagrante com a lógica por trás disso? Será que vai funcionar e já foi feito antes?

Nossa tabela queremos pesquisar:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Portanto, armazenamos o corpo do texto bruto para exibição física. As outras 2 colunas são usadas para pesquisas pré-computadas da seguinte maneira:

Soundex

O corpo é dividido em suas palavras e traduzido para sua versão soundex. IE, o corpo resultante pode ser algo como:

H252 B54 C23 E33... etc

Assim, alguém pode entrar em 'dinosore', e o corpo do artigo lê 'dinosaur', que ambos avaliam para B26. Em seguida, executamos um LIKE no valor soundex do termo de pesquisa.

Caractere codificado

Dado um mapeamento de caracteres que mapeia caracteres para números primos, o IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Se um usuário pretender digitar 'olá', mas alternar dois ou mais caracteres, por exemplo, 'hlelo', será avaliado com o mesmo número. Divida o corpo bruto em palavras, codifique primeiro todas as palavras e armazene no banco de dados, oferecendo um campo parecido com:

330 6825 330 1050... etc

Podemos então pesquisar neste valor para corresponder a erros de digitação.

Benefícios

  • Erros de digitação protegidos contra
  • Ortografia incorreta fonética protegida contra
  • Mais amigável para quem não fala inglês nativo
  • Funcionará em qualquer idioma (onde o soundex funciona)

Comentários e pensamentos? Uma espécie de pesquisa em várias camadas. É claro que você pode ponderar os valores de retorno para torná-lo ainda melhor (ou seja, uma correspondência literal do corpo do texto vale mais), mas essa é uma boa solução para erros de ortografia e falantes não nativos de inglês fazendo pesquisas?


Seria interessante ver como isso se compara à Pesquisa do Trigram.
Rich

Eu adoraria ter algo como isto para wordpress ...
Kit Menke

O uso de números primos para sua função de hash torna impossível ter colisões de palavras que não incluam métodos idênticos? Parece que deve ser possível ter uma palavra longa com muitas letras de baixo valor que tenham o mesmo valor que uma palavra curta com algumas letras de alto valor, mas eu não conheço muita teoria dos números. é provavelmente bem provado de uma forma ou de outra ...
glenatron

1
@Glen Afaik multiplicar números primos sempre gera um número único. Os anagramas vão colidir, mas não sei quanto de um problema isso é, esse é basicamente o objetivo de encontrar anagramas rapidamente.
Tom

@ Glen: Veja o teorema da fatoração exclusivo para obter exclusividade.
Steven Evers

Respostas:


2

Existem vários outros algoritmos de pesquisa. Smith-Waterman é um dos melhores para o texto humano, enquanto o BLAST é (até agora) o melhor para pesquisar sequências de DNA. Quando você recebe um texto com vários erros ortográficos, como em hlepvez de help, procura a distância mínima de edição .

Para que uma biblioteca implemente várias dessas funções no CLR no SQL Server 2005 (e posterior), consulte o projeto de forja de origem SimMetrics . Postagem no blog sobre o SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

O Soundex foi desenvolvido porque as principais diferenças entre as variações regionais de fala foram quase exclusivamente nas vogais - e é por isso que as vogais são descartadas. Não é bom em lidar com letras transpostas.


2

O Apache Solr suporta sinônimos e correções ortográficas - embora ainda seja um pouco áspero nas bordas.

Pesquisas difusas podem ser implementadas usando Ngrams,

Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/

e um banco de dados de idiomas como http://wordnet.princeton.edu/

... mas projetos como Xapian e Solr tratam muito disso para você.

Se você deseja criar seu próprio mecanismo de análise / pesquisa de termos de pesquisa por palavras, sugiro colocar os tokens ou termos que você gerar em um banco de dados existente, projetado para executar a pesquisa por idioma.


1

Eu fiz algo parecido há algum tempo para endereços que verificariam quantas alterações seriam necessárias para transformar uma sequência em outra e retornasse um valor numérico entre 0 e 1 para determinar a proximidade entre as duas.

Funcionou muito bem, pois retornaria um valor alto para itens como N / Norte, St / Street, EastMain / MainEast, etc. A idéia veio desse link do CodeProject


O código que você escreveu para o endereço corresponde ao código aberto?
Thismatters

@Thismatters Não tenho acesso ao código, mas o link na minha resposta deve fornecer a lógica para ele. Basicamente, você só quer ver quantas alterações que seria necessário para fazer uma corda para o outro, e as poucas mudanças em seguida, o mais perto que eles são
Rachel

0

Se você estiver combinando nomes, pessoas ou lugares, uma lista de sinônimos poderá funcionar muito melhor.

O Soundex não corresponderá a "Dick == Richard" "Kit == Christopher" ou "Ms. == Mrs."

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.