Concepto de búsqueda difusa de base de datos

13

Pensé en esto, y he estado tratando de encontrar soluciones sobre cómo realizar búsquedas difusas en una base de datos, si, por ejemplo, un usuario escribe un error ortográfico. ¿Algún problema evidente con la lógica detrás de esto? ¿Funcionará y se ha hecho antes?

Nuestra mesa que deseamos buscar:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Por lo tanto, almacenamos el cuerpo del texto sin formato para su visualización física. Las otras 2 columnas se usan para búsquedas que se calculan de la siguiente manera:

Soundex

El cuerpo se divide en sus palabras y se traduce a su versión soundex. IE, el cuerpo resultante podría ser algo como:

H252 B54 C23 E33... etc

Entonces alguien podría ingresar 'dinosore', y el cuerpo del artículo lee 'dinosaurio', ambos evalúan a B26. Luego ejecutamos un LIKE en el valor soundex del término de búsqueda.

Carácter codificado

Dado un mapeo de caracteres que asigna caracteres a números primos, 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

Si un usuario quisiera escribir 'hola' pero cambiara dos o más caracteres, por ejemplo, 'hola', evaluaría el mismo número. Divida el cuerpo sin formato en palabras, codifique con certeza cada palabra y almacénelo en la base de datos para obtener un campo similar al siguiente:

330 6825 330 1050... etc

Entonces, podemos buscar en este valor para que coincida con los tipos erróneos.

Beneficios

  • Errores tipográficos protegidos contra
  • Ortografía fonética incorrecta protegida contra
  • Más amigable que no habla inglés nativo
  • Funcionará en cualquier idioma (donde funciona soundex)

Comentarios y pensamientos? Una especie de búsqueda multicapa. Por supuesto, puede ponderar los valores de retorno para hacerlo aún mejor (es decir, una coincidencia de cuerpo de texto literal vale más), pero ¿es esta una buena solución para los errores de ortografía y las personas que no hablan inglés nativo haciendo búsquedas?

Tom
fuente
Sería interesante ver cómo esto se compara con Trigram Search.
Rich
Me encantaría tener algo así para WordPress ...
Kit Menke
¿El uso de números primos para la función de hash hace que sea imposible tener colisiones de palabras que no incluyan métodos idénticos? Parece que debería ser posible tener una palabra larga con muchas letras de bajo valor que tenga el mismo valor que una palabra corta con algunas letras de alto valor, pero no conozco mucha teoría de números probablemente esté bien probado de una forma u otra ...
glenatron 03 de
1
@Glen Afaik multiplicando primos juntos siempre genera un número único. Sin embargo, los anagramas colisionarán, pero no sé cuánto de ese problema es, ese es básicamente el objetivo de encontrar anagramas rápidamente.
Tom
@Glen: Vea el teorema de factorización único para la unicidad.
Steven Evers

Respuestas:

2

Hay varios otros algoritmos de búsqueda. Smith-Waterman es uno de los mejores para el texto humano, mientras que BLAST es (hasta ahora) el mejor para buscar secuencias de ADN. Cuando se le presenta texto con varios errores de ortografía, como en hleplugar de help, entonces está buscando la distancia mínima de edición .

Para que una biblioteca implemente varias de estas funciones en CLR en SQL Server 2005 (y versiones posteriores), mire el proyecto de falsificación de origen SimMetrics . Publicación de blog sobre SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex se desarrolló porque las diferencias principales entre las variaciones regionales del habla se dieron casi exclusivamente en las vocales, razón por la cual arroja las vocales. No es bueno para hacer frente a las letras transpuestas.

Tangurena
fuente
2

Apache Solr, admite sinónimos y correcciones ortográficas, aunque todavía es un poco tosco.

Las búsquedas difusas se pueden implementar usando Ngrams,

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

y una base de datos de idiomas como http://wordnet.princeton.edu/

... pero proyectos como Xapian y Solr manejan mucho de esto por usted.

Si desea construir su propio motor de búsqueda / análisis de términos de búsqueda de palabras, le sugiero que coloque los tokens o términos que genere en una base de datos existente diseñada para realizar búsquedas de idiomas.

Ben DeMott
fuente
1

Hice algo así hace un tiempo para las direcciones que verificarían cuántos cambios se necesitarían para transformar una cadena en otra cadena, y devolver un valor numérico entre 0 y 1 en cuanto a qué tan cerca coincidían los dos.

Funcionó muy bien, ya que devolvería un alto valor para elementos como N / Norte, St / Street, EastMain / MainEast, etc. La idea surgió de este enlace CodeProject

Rachel
fuente
¿El código que escribió para la dirección coincide con el código abierto?
Esto importa
@Thismatters No tengo acceso al código, pero el enlace en mi respuesta debería proporcionar la lógica para ello. Básicamente lo que desea es ver la cantidad de cambios que se necesitaría para hacer una cadena en el otro, y los menos cambios luego cuanto más cerca están
Rachel
0

Si está haciendo coincidir nombres, personas o lugares, una lista de sinónimos puede funcionar mucho mejor.

Soundex no coincidirá con "Dick == Richard" "Kit == Christopher" o "Ms. == Mrs."

Martin Beckett
fuente