PDA

Ver la Versión Completa : Algoritmo para comparacion de cadenas


danilo_candales
14-11-2007, 03:10:48
Saludos a todos.

Aunque llevo mucho tiempo entrando a este foro, investigando en el tan completo histórico de respuestas, nunca me había decidido a darme de alta. Me da hasta un poco de pena intentar responder algo entre tantos gurús....

Pero ahora tengo una gran necesidad acerca de un algoritmo y apelo a ustedes para que me den cualquier idea.

Programo con Delphi7 y SQL Server 2005. Y el asunto es el siguiente:

Los pongo en antecedentes:
Tengo una tabla MARCADOS con un campos Nombre nChar(200) (No se puede separar el nombre en apellidos ni nada, debe ser así porque es información que viene de fuente externa). En este campo tengo nombres en distinos idiomas, incluso indios, árabes, etc Ej: "Thiha Thura Tin Aung Myint"

En un archivo texto me entregan una lista de nombres (subí esa lista a otra tabla para guardar esos nombres). Así que tengo otra tabla INVESTIGADOS con campos Nombre nchar(200) igual que la anterior.... y un campo Existe bit donde marco si el registro de INVESTIGADOS existe en MARCADOS.

Con estos antecedentes mi problema está en que la comparación no es exacta, debo seguir estas reglas, que les voy a dar con un ejemplo:

Si en MARCADOS está el nombre "ossama bin laden" y en INVESTIGADOS viene como "sama laden" debe marcarse el campo Existe como True..

Cualquier idea será muy bien recibida. Muchas gracias a todos.

BuenaOnda
14-11-2007, 03:49:48
Hola..

Podrias utilizar el operador LIKE, para realizar eso...Solo deberias preguntar si la sub-cadena, en este caso correpondiente a parte del nombre, existe, entonces actualizas ese campo como marcado.

mira este hilo http://technet.microsoft.com/es-es/library/ms179859.aspx.

Espero haberte ayudado en algo...

danilo_candales
14-11-2007, 04:18:52
Muchas gracias.

Creo que si me sirve mucho lo que me dices.
A ver esta idea que te parece... Es cuestión que después que la implemente funcione bien... ya los pondré al tanto.

Bueno. Se me ocurre tomar el campo Investigados.Nombre y crear tantas cadenas como palabras existen en nombre: Ej:
"Thiha Thura Tin Aung Myint" daría como resultado 5 cadenas de caracteres

Fabricar la sentencia select con tantos likes como cadenas resultaron, algo así:

Select nombre
FROM Marcados
WHERE (Nombre LIKE '%cadena1%') AND (nombre LIKE '%cadena2%') etc...

Funcionará? Les parece bien? Por favor comenten lo que se les ocurra...
Gracias de nuevo.

fide
14-11-2007, 05:45:00
Esa idea no esta mala. Pero cuidado a la hora de redactar tu consulta. Ademas tratare de ayudarte para buscar una mejor forma de hacer lo que dices!

Lepe
14-11-2007, 12:22:56
Vas a tener muchos falsos positivos, pero en fin....

En lugar de "LIKE" usa "CONTAINS (http://technet.microsoft.com/es-es/library/ms187787.aspx)" parece más versatil.

Pero no te atañas a lo dicho aquí, en esa web puedes mirar otras opciones.

Saludos

danilo_candales
14-11-2007, 16:38:47
Muchas gracias nuevamente.

Estuve con el tema de utilizar CONTAINS, pero me marca este error:

"No se puede usar el predicado CONTAINS o FREETEXT en tabla o vista indizada 'marcador', porque no está indizado por texto.

Sugerencias?

Lepe
14-11-2007, 21:41:31
Por lo visto tienes que crear un índice en la base de datos por el campo donde vas a usar contains.... qué se le va a hacer ... ;)

Saludos

egostar
14-11-2007, 21:49:06
Muchas gracias.

Creo que si me sirve mucho lo que me dices.
A ver esta idea que te parece... Es cuestión que después que la implemente funcione bien... ya los pondré al tanto.

Bueno. Se me ocurre tomar el campo Investigados.Nombre y crear tantas cadenas como palabras existen en nombre: Ej:
"Thiha Thura Tin Aung Myint" daría como resultado 5 cadenas de caracteres

Fabricar la sentencia select con tantos likes como cadenas resultaron, algo así:

Select nombre
FROM Marcados
WHERE (Nombre LIKE '%cadena1%') AND (nombre LIKE '%cadena2%') etc...

Funcionará? Les parece bien? Por favor comenten lo que se les ocurra...
Gracias de nuevo.


Esto me parece adecuado siempre y cuando las cadenas que estas colocando en los LIKE coincidan al 100% con el nombre, pero, si quieres que el nombre contenga al menos una de las cadenas necesitas usar el OR en lugar del AND.

Por lo del CONTAINS, no tengo idea de como hacerlo, pero ya Lepe te ha dado un tip.

Salud OS

danilo_candales
17-11-2007, 17:23:14
Bueno. Muchas gracias a todos, hayan o no participado porque sé que el que no contestó es porque vió que ya el curso a seguir estaba dado.

Para cerrar el asunto les cuento que me fuí con la variante de BuenaOnda, crear tantos LIKE como cadenas tiene el nombre a buscar. Intenté con CONTAINS pero, por las características de la aplicación, es bastante enredoso eso de crear el índice compuesto y el catálogo, y después distribuirlo, mantenerlo actualizado, etc, etc....

Por otra parte no supe como hacer que CONTAINS o FREETEXT me compararan solo una parte de la cedena, utilizando el * como comodín solo me sirve para las terminaciones. Ej: Marcel* me localiza todos los registros con prefijo "Macel", pero esto *arcel* no funciona.....

En fin, esto es solo una historia corta para agradecerles nuevamente y asunto terminado, a entrarle a algo nuevo ahora.