2008-11-27 26 views
7

Tengo una base de datos de empresas. Mi aplicación recibe datos que hacen referencia a una empresa por su nombre, pero es posible que el nombre no coincida exactamente con el valor de la base de datos. Necesito hacer corresponder los datos entrantes con la compañía a la que se refiere.Coincidencia de nombres de compañías inexactas en Java

Por ejemplo, mi base de datos puede contener una empresa con el nombre "A. B. Widgets & Co Ltd." mientras que mis datos entrantes podrían hacer referencia a "AB Widgets Limited", "A.B. Widgets and Co", o "A B Widgets".

Algunas palabras en el nombre de la empresa (A B Widgets) son más importantes para la coincidencia que otras (Co, Ltd, Inc, etc.). Es importante evitar coincidencias falsas.

El número de empresas es lo suficientemente pequeño para que pueda mantener un mapa de sus nombres en la memoria, es decir. Tengo la opción de usar Java en lugar de SQL para encontrar el nombre correcto.

¿Cómo harías esto en Java?

Respuesta

0

Su base de datos puede suport el uso de expresiones regulares (regex) - ver más abajo para algunos tutoriales en Java - aquí está el enlace a la documentación de MySQL (como ejemplo):

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

es probable desea almacenar en la base de datos una declaración expresa regular bastante compleja para cada compañía que abarque las variaciones en la ortografía que pueda anticipar, o los subelementos del nombre de la compañía que le gustaría considerar importante.

también puede utilizar la biblioteca de expresiones regulares en Java

JDK 1.4.2
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

JDK 1.5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html

El uso de expresiones regulares en Java
http://www.regular-expressions.info/java.html

Explicación de la API Java Regex
http://www.sitepoint.com/article/java-regex-api-explained/

También puede ser que desee para ver si su base de datos soporta capacidades de Soundex (por ejemplo, ver el siguiente enlace para MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

2

Se puede utilizar un algoritmo LCS para anotar ellos.

Hago esto en mi photo album para que sea más fácil enviar fotos por correo electrónico y hacer que caigan en las categorías de seguridad correctamente.

0

Usted podría utilizar Lucene para indexar su base de datos, a continuación, consulta el índice Lucene. Hay varios motores de búsqueda construidos encima de Lucene, incluido Solr.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. –

+0

Gracias por los comentarios, he hecho que mi respuesta sea más como una respuesta. –

1

Eche un vistazo a Lucene.Es una biblioteca de código abierto de búsqueda de texto completo de Java con capacidades de "coincidencia cercana".

3

Puede estandarizar los formatos tanto como sea posible en su entrada DB/map & (es decir, convertir a mayúsculas/minúsculas), luego use Levenshtein (edit) distance metric desde la programación dinámica para calificar la entrada con todos sus nombres conocidos.

Puede hacer que el usuario confirme la coincidencia & si no le gusta, déle la opción de ingresar ese valor en su lista de nombres conocidos (pensándolo bien, podría ser demasiado poder dar un usuario ...)

+1

Hace apenas 6 meses que descubrí este algoritmo, ¡pero me ha ido increíblemente bien desde entonces! También me hace parecer inteligente cuando digo "oh, solo use una distancia Levenshtein". :-) – Aidos

2

Haría LCS ignorando espacios, signos de puntuación, mayúsculas y minúsculas en "co", "llc", "ltd", etc.

0

voto hasta 1 voto por

puede utilizar un algoritmo LCS para anotar ellos.

Hago esto en mi álbum de fotos para que sea fácil enviar fotos por correo electrónico y hacer que caigan en las categorías de seguridad correctamente.

* LCS code 
* Example usage (guessing a category based on what people entered) 

Para ser más precisos, mejor que menos subsecuencia común, menos subcadena común debe ser más preciso que el orden de los caracteres es importante.

3

pesar de que este hilo es un poco viejo, hace poco hicieron una investigación sobre la eficacia de la distancia métrica cadena de nombre coincidente y encontré esta biblioteca:

https://code.google.com/p/java-similarities/

Si no quiere gastar años en implementar algoritmos de distancia de cuerdas, recomiendo probarlo como primer paso, hay ~ 20 algoritmos diferentes ya implementados (incluyendo algoritmos Levenshtein, Jaro-Winkler, Monge-Elkan, etc.) y su código está estructurado lo suficientemente bien que no tiene que entender toda la lógica en profundidad, pero puede comenzar a usarla en minutos.

(Por cierto, no soy el autor de la biblioteca, así que felicitaciones para sus creadores.)

Cuestiones relacionadas