nombre - sql count group by
Variaciones de nombres en una base de datos (9)
¿Está utilizando SQl Server 2005 Express con Advanced Services? En mi opinión, se beneficiaría de la indexación de texto completo y, más concretamente, de Contains y Containstable, que puede utilizar con instrucciones específicas. Aquí hay 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:
Espero que esto ayude,
Andrés
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.
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 de nombres. ¿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 utiliza diferentes criterios para diferentes partes del nombre.
El problema en última instancia 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 hacer algunas pruebas, he decidido aplicar un enfoque en el que 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!
Creo que tu 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.
En mi opinión, debes hacer una función correcta y completarla , o debes dejarla para evitar crear una inteligencia a medias en un programa de computadora que todavía se equivoca la mayor parte del tiempo ( "Parece que estás escribiendo una carta " , ¿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.
No estoy seguro de cuál es su aplicación, pero si los usuarios saben en el momento de registrarse que las personas de su 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ían conocer como (incluidos los apellidos, las mujeres cambian todo el tiempo y hace que encontrarlos sea mucho más difícil) y que quieren 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).
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: (Es curioso, 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 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 búsqueda. De esta forma, puede mostrarle al usuario los tipos de datos de "nombres similares" o "¿quiso decir ...?".
Puede usar la búsqueda de texto completo de SQL Server y hacer una búsqueda flexional.
Básicamente como:
SELECCIONAR ProductId, ProductName FROM ProductModel WHERE CONTAINS (CatalogDescription, ''FORMSOF (THESAURUS, metal)'')
Consulte: 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
Aquí hay una idea para encontrar automáticamente "sinónimos de nombre" 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.
Descubrirás que estás incursionando en un área conocida como "Procesamiento del lenguaje natural" y necesitarás hacer varias cosas, la mayoría de las cuales puedes encontrar en el tema de la derivación .
La derivación simplista simplemente rompe la palabra, pero los algoritmos más avanzados asocian palabras que significan lo mismo, por ejemplo, Google podría utilizar la derivación para convertir "gato" y "gatito" en "felino" y buscar los tres, ponderando la palabra real proporcionada por el usuario como ligeramente más pesado para que las coincidencias exactas regresen antes de las partidas de tallo.
Es un problema conocido, y hay stemmers de código abierto disponibles.
-Adán
El término que estás buscando es hipopotismo:
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 una base de datos.
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 podrías escribir una función / sproc para normalizar un nombre:
normalize_given_name(''Bill''); --returns William
Un problema que enfrentará es que diferentes nombres pueden tener el mismo hipocorismo (Albert -> Al, Alan -> Al)