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?
Respuestas:
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
hlep
lugar dehelp
, 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.
fuente
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.
fuente
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
fuente
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."
fuente