2009-02-22 27 views
10

Estoy tratando de determinar cuál es la mejor manera de encontrar variaciones de un nombre en una base de datos. Por ejemplo, busco Bill Smith. Me gustaría que devuelva "Bill Smith", obviamente, pero también me gustaría que devuelva "William Smith", o "Billy Smith", o incluso "Willy Smith". Mi idea inicial fue construir una jerarquía de primer nombre, pero no sé dónde podría obtener esos datos, si es que existe.Variaciones de nombre en una base de datos

Dado que los usuarios pueden buscar en el directorio, pensé que esta sería una característica clave. Por ejemplo, las personas con las que fui a la escuela me llamaron Joe, pero siempre voy por Joseph ahora. Por lo tanto, estaba buscando hacer una búsqueda fonética sobre el apellido, ya sea con NYSIIS o Double Metaphone y luego buscar el nombre con esta jerarquía. ¿Existe alguna forma mejor de hacerlo? ¿Tal vez algún tipo de relevancia gradual usando una búsqueda de texto completo con el nombre completo en lugar de una búsqueda de dos partes con el nombre y apellido? Una parte de mí piensa que si almacenara un nombre como un valor único en lugar de valores múltiples, podría facilitar más opciones de búsqueda a expensas de poder dirigirse a un usuario por el primer nombre.

En cuanto a la plataforma, estoy usando SQL Server 2005; sin embargo, no tengo problemas para cambiar parte de la coincidencia en el código; por ejemplo, preseleccionar las claves fonéticas para un usuario, ya que no cambiarían.

Cualquier pensamiento u orientación sería apreciado. Innumerables búsquedas han aparecido vacías. ¡Gracias!

Editar: Parece que hay dos campos muy distintos en la funcionalidad y definitivamente estoy sentado en el medio en este momento. Pude ver el argumento de una búsqueda de texto completo, muy probablemente con la falta de normalización de datos, y un enfoque de varias partes que usa diferentes criterios para diferentes partes del nombre.

En última instancia, el problema se reduce a la intención del usuario. El ejemplo de Bill/William es bueno, porque muestra la mutación de un primer nombre basado en la formalidad del uso. Creo que construir una jerarquía de nombres es la solución más precisa (y extensible), pero va a ser mucho más compleja. El enfoque de búsqueda difusa es más fácil de implementar a expensas de la precisión. ¿Es esta una comparación justa?

Resolución: Al realizar algunas pruebas, he decidido aplicar un enfoque donde el registro inicial tomará un nombre completo y lo dividiré en múltiples campos (nombre, apellido, centro, sufijo, etc.) Como estoy seguro de que no será perfecto, permitiré al usuario editar las "partes", incluido agregar una doncella o un nombre alternativo. En cuanto a la búsqueda, con cualquiera de las soluciones tendré que mantener las variaciones existentes, ya sea en una tabla de base de datos o como un diccionario de sinónimos. Ninguno tiene una ventaja sobre el otro en este caso. Creo que se reducirá al rendimiento, y tendré que ejecutar algunos puntos de referencia para determinar cuál es el mejor. ¡Gracias a todos por su aporte!

+0

Algo que quizás deba tener en cuenta es que no todas las personas hablan inglés y no todos los nombres cumplen con las mismas reglas de denominación. Este fuera de curso depende de cuán amplio sea tu público objetivo, etc. –

+0

Definitivamente lo he tenido en cuenta. Desde el punto de vista de la presentación, el producto inicialmente estará en inglés solamente. Si el producto sobrevive y la demanda lo exige, me extenderé a otros lenguajes y algoritmos según sea necesario. ¡Gracias! –

Respuesta

0

No, las búsquedas de texto completo no ayudarán a resolver su problema.

creo que es posible que desee echar un vistazo a algunos de los siguientes enlaces: (divertido, nadie mencionó SoundEx hasta ahora)

Básicamente SoundEx le permite evaluar el nivel de similitud en palabras que suenan similares. La función también está disponible en SQL 2005.

Como una cuestión secundaria, en lugar de devolver resultados similares, podría resultar más intuitivo para el usuario utilizar un script basado en AJAX para entregar nombres de sonido similares antes de que el usuario inicie su buscar. De esta forma, puede mostrarle al usuario los tipos de datos de "nombres similares" o "¿quiso decir ...?".

+0

Gracias. He usado SoundEx antes y estoy considerando otros algoritmos fonéticos, a saber, el doble metafonía y NYSIIS. Lo que es interesante es cómo el enfoque que usaré dictará la estructura de datos, es decir, una implementación fonética usaría una forma de nombre más normalizada. –

1

Creo que su enfoque básico es sólido. No creo que el texto completo te ayude. Para la siembra, behindthename.com parece tener una gran cantidad de datos que desea.

+0

Definitivamente ese es el tipo de datos que estoy buscando, pero me devuelve a un problema. Al mirar las fuentes para la mayoría de esos datos, se los ubica como usuarios o como libros, lo que significa que hay un gran esfuerzo manual para crearlo y mantenerlo. –

+0

Además, gracias por el enlace. No estaba al tanto de ese sitio antes. (Me quedé sin espacio en mi último comentario.) –

1

¿Está utilizando SQl Server 2005 Express con Advanced Services? Me parece que se beneficiaría de la indexación de texto completo y más específicamente contiene y contiene que puede utilizar con instrucciones específicas aquí es un enlace para los usos de Containstable:

http://msdn.microsoft.com/en-us/library/ms189760.aspx

y aquí está el enlace de descarga para SQL Server 2005 con Servicios avanzados:

http://www.microsoft.com/downloads/details.aspx?familyid=4C6BA9FD-319A-4887-BC75-3B02B5E48A40&displaylang=en

Ho pe esto ayuda,

Andrew

+0

Para mi entorno de desarrollo tengo SQL Server 2005 Enterprise.Tendré que obtener información específica de mi proveedor de hosting sobre su configuración. ¿Cómo se aplica Advanced Services a una edición Standard o Enterprise? ¿Ya están disponibles las funciones? ¡Gracias por los clientes potenciales! –

+0

Sí, esos servicios definitivamente se incluirán en la edición empresarial. Sin embargo, me alegro de que hayan lanzado estos servicios avanzados para la edición express porque los he encontrado demasiado útiles. :-) Me alegra que pueda ser de alguna ayuda! –

1

Puede utilizar el texto de SQL Server de búsqueda y hacer una búsqueda de inflexión.

gusta Básicamente:

SELECT ProductId, ProductName DE ProductModel WHERE CONTAINS (CatalogDescription, 'FORMSOF (Thesaurus, metal)')

Salida: http://en.wikipedia.org/wiki/SQL_Server_Full_Text_Search#Inflectional_Searches http://msdn.microsoft.com/en-us/library/ms345119.aspx http://www.mssqltips.com/tip.asp?tip=1491

+0

¡Gracias! Eso parece prometedor Implicaría que sería más probable que busque un solo "nombre" en lugar de una versión normalizada del nombre, con lo que estoy de acuerdo. –

3

En mi opinión, debe hacer una función a la derecha y hacerlo complete, o debe dejarlo apagado para evitar crear una inteligencia a medias en un programa de computadora que todavía se equivoca la mayor parte del tiempo ("Looks like you're writing a letter", ¿alguien?).

En el caso de los nombres humanos, una computadora se equivocará la mayor parte del tiempo, hacerlo bien y completar es imposible, en mi humilde opinión. Tal vez puedas piratear algo que tenga los nombres en inglés más comunes. Pero, en realidad, la inteligencia para buscar tanto a "Bill" como a "William" está incorporada en casi cualquier persona de habla inglesa. Dejo que ellos sepan conectar los puntos.

+0

+1 para "debes dejarlo para evitar crear una inteligencia a medias en un programa de computadora que todavía se equivoca la mayor parte del tiempo". – MicSim

+0

Aunque estoy de acuerdo en principio, creo que dejar la funcionalidad de sugerencias de primer nombre es vago. No anticipo que sea 100% exacto, pero no estoy seguro de que algo menos que perfecto haga algo a medias. Mientras una persona puede resolverlo, también espera que adivines su intención. Estoy desgarrado. –

+0

Solo digo que probablemente va a implementar algo que solo atrapa la mayoría de los casos. En lo que puedes pensar Y aumentas las posibilidades de falsos positivos, que son mucho más molestos (para mí al menos) que * no explicables *. Creo que el dominio del problema es demasiado pequeño. – Tomalak

1

No estoy seguro de cuál es su aplicación, pero si los usuarios saben en el momento de registrarse que personas del pasado podrían estar buscando en la base de datos para ellos, podría ofrecerles la oportunidad en el perfil de usuario para definir otros nombres que podría ser conocido como (¡incluidos los apellidos, las mujeres cambian todo el tiempo y hace que encontrarlos sea mucho más difícil!) y que quieran que las personas puedan buscar. Almacene estos en una tabla relacionada separada. Luego busca en eso. Simplemente haga que la estructura sea tal que pueda definir un nombre como nombre principal (el que usa para todo excepto para la búsqueda).

+0

Ese es un buen punto. Al observar el modelo de Facebook, parece que toman un nombre completo y lo analizan, luego le permiten cambiar las partes, incluido agregar un alias para los nombres anteriores que se usa solo para buscar. –

0

Aquí hay una idea para encontrar automáticamente "nombres sinónimos" como Bill/William. Ese problema ha sido estudiado en el contexto más amplio de sinónimos en general: induciéndolos a partir de estadísticas de las cuales las palabras aparecen comúnmente en los mismos contextos en un corpus de texto grande como la web. Podría intentar combinar ese enfoque con una lista de nombres como Moby Names; No sé si ya se hizo antes.

Here are some pointers.

1

Usted encontrará que usted está incursionando en una zona conocida como "procesamiento del lenguaje natural" y que tendrá que hacer varias cosas, la mayoría de los cuales se pueden encontrar en el tema de stemming.

Simplistic stemming simplemente rompe la palabra aparte, pero los algoritmos más avanzados asocian palabras que significan lo mismo - por ejemplo, Google podría usar stemming para convertir "gato" y "gatito" en "felino" y buscar los tres, pesaje la palabra real provista por el usuario como ligeramente más pesada para que las coincidencias exactas regresen antes de las coincidencias marcadas.

Es un problema conocido y hay open source stemmers disponible.

-Adam

+0

Este ejercicio tiene muy poco que ver con PNL. "Stemming" se refiere únicamente a extraer el tallo de una palabra. Esto es útil en los motores de búsqueda para mapear decir filosofía, filósofo y filosófico en un solo grupo. Se realiza (al menos en inglés) aplicando reglas de transformación (por ejemplo, eliminación de sufijos conocidos) al final de la palabra. Esto tiene una aplicación limitada a los primeros nombres (por ejemplo, Bobbie/Bobby -> Bob) y usa un conjunto (pequeño) de reglas que NO es el mismo que el conjunto completo utilizado en una lectora de texto en inglés (más general). –

+0

(continúa) No aborda el problema de Bob vs Robert [a] o Ron [nie] vs Veronica/Ronald, que necesita un diccionario de alias/apodos, ni trata el problema de error tipográfico/reado/spello/thinko, ni con la tendencia de los inmigrantes a Anglicise dar nombres por ejemplo Karl -> Carl -> Charles o Guglielmo/Guillaume/Uiliami convirtiéndose en Bill :-) –

1

El término que busca es hypocorism:

http://en.wikipedia.org/wiki/Hypocorism

Y Wikipedia enumera muchos de ellos. Podrías sacar un poco de Python o Perl para raspar esa página y ponerla en un db.

Me gustaría ir con una estructura como esta:

create table given_names (
    id int primary key, 
    name text not null unique 
); 

create table hypocorisms (
    id int references given_names(id), 
    name text not null, 

    primary key (id, name) 
); 

insert into given_names values (1, 'William'); 
insert into hypocorisms values (1, 'Bill'); 
insert into hypocorisms values (1, 'Billy'); 

entonces se podría escribir una función/procedimiento almacenado para normalizar un nombre:

normalize_given_name('Bill'); --returns William 

Una de las cuestiones que se enfrentará es que los diferentes nombres pueden tiene el mismo hipocorismo (Albert -> Al, Alan -> Al)

Cuestiones relacionadas