Pregunta

El problema es que hay una base de datos con alrededor de 20 mil registros de clientes y quiero hacer un mejor esfuerzo para evitar entradas duplicadas. La base de datos es Microsoft SQL Server 2005, la aplicación que mantiene esa base de datos es Microsoft Dynamics / SL. Estoy creando un servicio web ASP.NET que interactúa con esa base de datos. Mi servicio puede insertar registros de clientes en la base de datos, leer registros de ellos o modificar esos registros. Ya sea en mi servicio web, a través de MS Dynamics o en el servidor Sql, me gustaría dar una lista de posibles coincidencias antes de que un usuario confirme la adición de un nuevo registro.

Por lo tanto, el usuario enviaría un registro, si parece ser único, el registro guardará y devolverá una nueva ID. Si hay posibles duplicaciones, el usuario puede volver a enviar con un mensaje de confirmación que dice "sí, veo los posibles duplicados, este es un nuevo registro, y quiero enviarlo".

Esto es fácil si es solo una cuestión de puntuación o espacio (por ejemplo, si ingresa " Compañía, Inc. " y hay un " Compañía Inc " en la base de datos, pero ¿qué pasa si hay cambios leves? como "Company Corp." en lugar de "Company Inc" o si hay un error ortográfico, como "Cmpany, Inc." ¿Es posible devolver registros como ese en la lista? Absolutamente no es posible, me ocuparé de lo que tengo. Simplemente causa más trabajo más adelante, si los registros deben combinarse debido a duplicaciones.

¿Fue útil?

Solución

Los detalles específicos de los cuales algoritmo serán el mejor trabajo para usted depende en gran medida de su dominio, por lo que le sugiero que experimente con algunos diferentes; incluso es posible que necesite combinar algunos para obtener resultados óptimos. Es posible que las abreviaturas, especialmente las específicas de dominio, también deban preprocesarse o estandarizarse.

Para los nombres, probablemente sería mejor con un algoritmo fonético , que tiene en cuenta la pronunciación. Estos anotarán a Smith y Schmidt juntos, ya que son fáciles de confundir cuando dice las palabras. Double Metaphone es una buena primera opción.

Para los dedos gordos, probablemente estarías mejor con un algoritmo de distancia - lo que da una " diferencia " entre 2 palabras. Estos anotarían a Smith y Smoth juntos, aunque el 2 puede deslizarse a través de la búsqueda fonética.

T-SQL tiene SOUNDEX y DIFFERENCE - pero son bastante pobre Una variante Levenshtein es la opción canónica, pero hay otras buenas opciones, la mayoría de las cuales son bastante fáciles. para implementar en C #, si no puede encontrar una implementación con licencia adecuada.

Todo esto será mucho más fácil de codificar / usar desde C # que T-SQL (aunque encontré doble metáfono en un terrible abuso de T-SQL que puede funcionar en SQL).

Aunque este ejemplo está en Access (y en realidad nunca miró el código, o usó la implementación) la presentación incluida da una idea bastante buena de lo que probablemente necesitará hacer. El código probablemente vale la pena verlo, y quizás un puerto de VBA.

Otros consejos

Busque en SOUNDEXing dentro de SQL Server. Creo que te dará la confusión de las posibles coincidencias que estás buscando.

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

Si es posible integrar Lucene.NET en tu solución, definitivamente deberías intentarlo fuera.

Puedes intentar usar la búsqueda de texto completo con las funciones FreeText (o FreeTextTable) para tratar de encontrar posibles coincidencias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top