Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Hacer matching de nombres

Estas en el tema de Hacer matching de nombres en el foro de Mysql en Foros del Web. Buenas, Tengo un problema, necesito hacer matching y no sé qué emplear, si una base de datos o usar arrays, yo creo que lo más ...
  #1 (permalink)  
Antiguo 03/01/2011, 05:24
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Hacer matching de nombres

Buenas,

Tengo un problema, necesito hacer matching y no sé qué emplear, si una base de datos o usar arrays, yo creo que lo más óptimo sería usar una base de datos, por este motivo estoy aquí jeje pero me gustaría saber vuestra opinión.


El problema es la siguiente, estoy leyendo nombres de equipos de fútbol de diferentes webs y cada web pone nombres diferentes al mismo equipo.
Tengo que unificar estos nombres, es decir, el equipo Barcelona es el mismo se llame F.C. Barcelona, FC Barcelona, Barça, Barsa...

Yo había pensado en una tabla tipo

identificador | equipo | parecidos
1 | Barcelona | F.C. Barcelona, FC Barcelona, Barça, Barsa

Qué pensáis? es la manera más óptima?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 03/01/2011, 05:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Hacer matching de nombres

Cita:
El problema es la siguiente, estoy leyendo nombres de equipos de fútbol de diferentes webs y cada web pone nombres diferentes al mismo equipo.
Primero: La mayoría de las webs están hechas por aficionados, por lo que no es una buena fuente de información para ese tipo de datos. Es mejor acudir a la fuente original (página del equipo), o en su defecto atenerse al nombre oficial.
Piensalo de este modo: Cuando pones el nombre de las personas, no pones los apodos como nombre, por más que se le conozca más de ese modo.
Lo que si puedes poner es un campo para el alias del equipo, o bien un campo que unifique los diferentes alias que posea para faciliatar una búsqueda por otras opciones, pero el campo nombre_equipo sólo tiene un único dominio: el nombre oficial.

Ahora bien, lo que pongas en la página web es opcional. Depende del uso que le quieras dar, de todos modos la seleccionarás la gestionarás en la capa de negocios, lo que hará que el usuario bien puede elegir "Barça" e internamente seleccionarse "F.C. Barcelona" si es el caso, y el usuario nunca se enterará.
Lo que jamás debes dejar es que datos como esos, datos de esa relevancia sean ingresados directamente por los usuarios, porque ellos ponen cualquier cosa. Los datos de ese tipo son siempre responsabilidad del DBA, el usuario simplemente debe elegir entre las opciones provistas por el sistema, y si fuese necesario ingresar uno nuevo, solamente debería poder enviar la petición, pero no ingresar la registración de un club nuevo a la base.
¿Se entiende? El punto más fragil y que siempre causa problemas, es el usuario (la interfase silla-teclado, como decía un amigo mío).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/01/2011, 06:46
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Hacer matching de nombres

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Primero: La mayoría de las webs están hechas por aficionados, por lo que no es una buena fuente de información para ese tipo de datos. Es mejor acudir a la fuente original (página del equipo), o en su defecto atenerse al nombre oficial.
Piensalo de este modo: Cuando pones el nombre de las personas, no pones los apodos como nombre, por más que se le conozca más de ese modo.
Lo que si puedes poner es un campo para el alias del equipo, o bien un campo que unifique los diferentes alias que posea para faciliatar una búsqueda por otras opciones, pero el campo nombre_equipo sólo tiene un único dominio: el nombre oficial.

Ahora bien, lo que pongas en la página web es opcional. Depende del uso que le quieras dar, de todos modos la seleccionarás la gestionarás en la capa de negocios, lo que hará que el usuario bien puede elegir "Barça" e internamente seleccionarse "F.C. Barcelona" si es el caso, y el usuario nunca se enterará.
Lo que jamás debes dejar es que datos como esos, datos de esa relevancia sean ingresados directamente por los usuarios, porque ellos ponen cualquier cosa. Los datos de ese tipo son siempre responsabilidad del DBA, el usuario simplemente debe elegir entre las opciones provistas por el sistema, y si fuese necesario ingresar uno nuevo, solamente debería poder enviar la petición, pero no ingresar la registración de un club nuevo a la base.
¿Se entiende? El punto más fragil y que siempre causa problemas, es el usuario (la interfase silla-teclado, como decía un amigo mío).
Gracias gnzsoloyo,

Quizás me expresé mal, pero no me refería a que el usuario pudiese escoger esos nombres sino todo lo contrario, el usuario ve el nombre que yo quiero que vea y en este caso corresponderá a la columna "equipo", el resto son alias que he ido anotando de cómo llaman el resto de webs al mismo equipo y poder hacer comparaciones.

Diferentes webs me proporcionan datos de equipos de fútbol, pero cada web los llama de la forma que quieren. Yo llamaré al equipo de la forma oficial de ahí la siguiente tabla

identificador | equipo | parecidos
1 | Barcelona | F.C. Barcelona, FC Barcelona, Barça, Barsa

El nombre que yo daré al equipo será Barcelona y no los alias que recopilo de otras webs. Pero sí tengo que saber que cuando recopilo un alias de un equipo de otra web, realmente estoy haciendo referencia (en este caso al Barcelona)

De ahí mi duda de sí montar esta tabla es la manera correcta. Y en caso de que sí sea, cómo harías las búsquedas para buscar esas coincidencias? utilizarías un simple like?

Muchas gracias de antemano
  #4 (permalink)  
Antiguo 03/01/2011, 07:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Hacer matching de nombres

Cita:
De ahí mi duda de sí montar esta tabla es la manera correcta. Y en caso de que sí sea, cómo harías las búsquedas para buscar esas coincidencias? utilizarías un simple like?
A mi me parece que sería mejor crear un índice FULLTEXT y usar MATCH() AGAINST() para ello, considerando las muchas variaciones que puede haber.
El problema sería que los FULLTEXT sólo funcionan con tablas MyISAM y no con las InnoDB, por lo que hay que ver la viabilidad del asunto.
Si no resulta práctico usar tablas MyISAM, por ejemplo si usas foreign keys o transactions, entonces sólo quedaría usar LIKE con expresiones regulares.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/01/2011, 08:57
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Hacer matching de nombres

Cita:
Iniciado por gnzsoloyo Ver Mensaje
A mi me parece que sería mejor crear un índice FULLTEXT y usar MATCH() AGAINST() para ello, considerando las muchas variaciones que puede haber.
El problema sería que los FULLTEXT sólo funcionan con tablas MyISAM y no con las InnoDB, por lo que hay que ver la viabilidad del asunto.
Si no resulta práctico usar tablas MyISAM, por ejemplo si usas foreign keys o transactions, entonces sólo quedaría usar LIKE con expresiones regulares.
Parto de la base que esta tabla, llámala tabla diccionario, porque está actuando de una forma similar a un diccionario, yo busco una palabra en la columna parecidos, q(ue me gusta mas llamarla alias como bien has sugerido) :D y me tiene que devolver el nombre del equipo que corresponde columna equipo.

Las tablas MyISAM aunque no tengan claves foraneas como tal si que se pueden emular, no? si yo creo tablas con sus identificadores y quiero que esten relacionadas, siempre podré hacer un where y juntar los dos identificadores como si de una tabla relacionada se tratase no?

El uso que le voy a dar es el siguiente:
La usaré para hacer la consulta por cada equipo que lea del XML, serán consultas masivas ya que estamos hablando de eventos deportivos con miles y miles de partidos, se trataría de comparar los dos equipos que se enfrentan en esta tabla y devolver el equipo correspondiente que aparece en la tabla.

Qué opinas? ;)

Muchas gracias de antemano!
  #6 (permalink)  
Antiguo 03/01/2011, 09:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Hacer matching de nombres

Cita:
Las tablas MyISAM aunque no tengan claves foraneas como tal si que se pueden emular, no? si yo creo tablas con sus identificadores y quiero que esten relacionadas, siempre podré hacer un where y juntar los dos identificadores como si de una tabla relacionada se tratase no?
Las consulta seguirán operando correctamente con tablas MyISAM; el problema que dan es que la integridad relacional hay que mantenerla por programación, lo que significa validar datos contra la base antes de cada inserción.
En otras palabras, lo que se complica son los ABMS de datos, que insumen más programación.
Cita:
La usaré para hacer la consulta por cada equipo que lea del XML, serán consultas masivas ya que estamos hablando de eventos deportivos con miles y miles de partidos, se trataría de comparar los dos equipos que se enfrentan en esta tabla y devolver el equipo correspondiente que aparece en la tabla.
A mi entender, puede darte buenos resultados, especialmente si los datos son muchos y con mucha dispersión de escritura.
Pruebalo y veamos la performance, pero creo que te andará bien.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 03/01/2011, 11:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Hacer matching de nombres

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Las consulta seguirán operando correctamente con tablas MyISAM; el problema que dan es que la integridad relacional hay que mantenerla por programación, lo que significa validar datos contra la base antes de cada inserción.
En otras palabras, lo que se complica son los ABMS de datos, que insumen más programación.

A mi entender, puede darte buenos resultados, especialmente si los datos son muchos y con mucha dispersión de escritura.
Pruebalo y veamos la performance, pero creo que te andará bien.
Cuando dices ver la performance... te refieres a medir lo que tarda en ejecutarse el script o te refieres tipo slow querys?
  #8 (permalink)  
Antiguo 03/01/2011, 11:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Hacer matching de nombres

El término abarca todo, la performance se mide respecto al total y luego a cada subsistema, considerando separadamente lo que hace la aplicación, lo que tarda la web y lo que hace el MySQL... La base de datos es una parte del sistema, pero no es ni por lejos lo central ni lo único.
Lo que respecta a las consultas, es tema de MySQL, donde existen muchas formas de optimizar una misma consulta.
Cuando te encuentras con una baja performance global (la que ve el usuario), la depuración raras veces empieza por la base. Generalmente lo primero que hay que mirar es la aplicación, luego el hardware, después las comunicaciones, luego el servicio de web y finalmente la base. Nunca al revés.
Los programadores tienden a culpar a la base de los problemas, pero es más fácil que lo que haya sean llamadas recursivas o innecesarias a la base, y no que las sentencias de consulta estén mal pensadas. A mi me ha pasado encontrarme con una función que invocaba a la base para leer un mismo registro... 35 veces...
Eso no es error de diseño de consultas ni de performance de la base. Es un error de diseño de procesos, y los procesos son asunto de la aplicación.
Precisamente por eso la dirección de análisis va de afuera hacia adentro y no al revés.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 03/01/2011, 11:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Hacer matching de nombres

neodani,
tienes otra opción, aunque tendrías que incluir todos los nombres, también el oficial. Se trata de crear una tabla llamada nombres con la siguiente estructura
idnombre, idequipo, nombre
1 | 1 | F. C. Barcelona
2 | 1 | Barça
3 | 1 | Barcelona
debidamente indexado ese campo y efectuando la consulta sobre el mismo, no tendrías problemas, creo de llegar al idequipo, el 1, que es del F. C. Barcelona, por poner el ejemplo que tú has usado. Existen más soluciones. Yo no considero oportuno poner nombres erróneos, ej. Barsa, y tampoco errores gráficos como FC Barcelona o F C Barcelona. Las palabras que habría que poder buscar son Barcelona y Barça en este caso. Mediante funciones podrías ayudar a la búsqueda, es decir, podrías quitar F. C. o usar funciones para búsqueda de escrituras fonéticas, pero buscando el más cercano y proponiendo el enlace, sería fácil llegar a los datos.

Última edición por jurena; 03/01/2011 a las 12:01

Etiquetas: nombres
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:28.