2010-11-13 7 views
5

asumir dos juegos de cuerdas:cadenas coincidentes disímiles

[ "Mr. Jones", "O'Flaherty", "Bob", "Rob Jenkins" ] 
[ "Maxwell O'Flaherty", "Robert Jenkins", "Mrs. Smith" ] 

Es obvio que estos dos conjuntos tienen Maxwell O'Flaherty y Robert Jenkins en común.

¿Hay algún algoritmo que nos permita hacer tal coincidencia programáticamente? Estoy pensando en escribir algo que recorra cada elemento en una serie de cadenas e intente encontrar cualquier subcadena que sea única y no contenida en ningún otro elemento en ninguno de los conjuntos y luego usar eso como una especie de hash de cada elemento para unir los dos conjuntos.

+1

Debe revelar, qué nombres deben tratarse como iguales. Como no estoy familiarizado con los nombres en inglés, no es obvio para mí que "esos dos conjuntos tienen en común a Maxwell O'Flaherty y Robert Jenkins". Y no es obvio para el compilador de C#. En cuanto a usted, no es obvio que "Sasha Ivanov" y "Alexandr Petrovich Ivanov" sean lo mismo, pero no lo mismo que "Alexey Ivanov". – Vovanium

+0

Estoy de acuerdo, una computadora tendría tan pocas posibilidades de emparejar a Sasha y Alexandr como lo haría con Richard y Dick. El problema no son los apellidos, sino simplemente hacer coincidir cadenas similares. – devprog

+0

Probablemente un duplicado de: [http://stackoverflow.com/questions/83777/are-there-any-fuzzy-search-or-string-similarity-functions-libraries-written-for-c](http:/ /stackoverflow.com/questions/83777/are-there-any-fuzzy-search-or-string-similarity-functions-libraries-written-for-c) –

Respuesta

1

Puede encontrar la distancia Levenshtein útil. Si está haciendo mucho de esto donde no está claro qué tan precisa es la información, hay bibliotecas para la desambiguación de cuerdas. (No es "obvio" que Rob y Robert son idénticos; de hecho, el primero podría ser Robin.

+0

Estoy buscando en las distancias levenshtein según la primera respuesta. Sin embargo, considero que solo pueden decirle cuán cerca están los hilos y no pueden garantizar que el significado humano de Rob sea Robert en lugar de Robin. Voy a tener que encontrar una forma de comparar distancias entre todos los elementos de un conjunto para establecer un significado debajo del cual algo no se puede considerar una coincidencia. – devprog

0

Si esto es un ejemplo del mundo real y necesita una coincidencia exacta en nombre o apellido, entonces analice todas las cadenas en la segunda matriz y cree nueva matriz con todas las subcadenas analizadas e índice de la tienda a los elementos originales de la matriz de los que la subcadena forma parte:

[{"Maxwell", 0}, {"O'Flaherty", 0}, {"Robert", 1} , { "Jenkins", 1}, { "señora", 2}, { "Smith", 2}]

Ahora usted puede encontrar coincidencia exacta, y saber a qué persona se refiere.

+0

El nombre y el elemento de apellido es solo un ejemplo, podrían ser cualquier cadena, por lo que no quería confiar en la identificación de componentes individuales como nombres y apellidos. Gracias por tu respuesta. – devprog

0

Uno enfoque I'v Usado en el pasado para tratar problemas como Robert vs Bob es haciendo consultas a fuentes de Internet que pueden identificar las similitudes.

Por ejemplo, no conozco la política de búsqueda automatizada de Wolfram Alpha (aunque creo que estaban trabajando en una API en algún momento), pero una búsqueda de Robert (http://www.wolframalpha.com/input/?i=robert) identificaría que debería coincidir con el nombre "Rob".

Además, esto no es para nada programático, pero descubrí que el uso inteligente de Mechanical Turk de Amazon funciona de maravilla para este tipo de problema si su conjunto de datos está razonablemente limitado de tamaño.

Cuestiones relacionadas