Tengo a mano el siguiente problema: tengo una lista muy larga de palabras, posiblemente nombres, apellidos, etc. Necesito agrupar esta lista de palabras, de modo que palabras similares, por ejemplo palabras con una distancia de edición similar (Levenshtein) aparezcan en el mismo grupo Por ejemplo, "algoritmo" y "alogritmo" deberían tener altas posibilidades de aparecer en el mismo grupo.
Conozco los métodos clásicos de agrupación no supervisada, como la agrupación k-means, la agrupación EM en la literatura de reconocimiento de patrones. El problema aquí es que estos métodos funcionan en puntos que residen en un espacio vectorial. Tengo palabras de cuerdas en mi mano aquí. Parece que la pregunta de cómo representar cadenas en un espacio vectorial numérico y calcular "medias" de grupos de cadenas no está suficientemente respondida, según los esfuerzos de mi encuesta hasta ahora. Un enfoque ingenuo para atacar este problema sería combinar el agrupamiento de k-medias con la distancia de Levenshtein, pero la pregunta sigue siendo "¿Cómo representar" medios "de cuerdas?". Hay una ponderación denominada ponderación TF-IDF, pero parece que está relacionada principalmente con el área de agrupación de "documentos de texto", no para la agrupación de palabras individuales. http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf
Mi búsqueda en esta área aún continúa, pero también quería obtener ideas de aquí. ¿Qué recomendaría en este caso? ¿Alguien conoce algún método para este tipo de problema?
fuente
It seems that there are some special string clustering algorithms
. Si proviene específicamente del campo de minería de texto, no de estadísticas / análisis de datos, esta declaración está garantizada. Sin embargo, si aprende la rama de agrupación tal como está, encontrará que no existen algoritmos "especiales" para los datos de cadena. El "especial" es cómo preprocesar dichos datos antes de ingresarlos en un análisis de clúster.Respuestas:
Recomendación de @ mican para la propagación de afinidad .
Del documento: L Frey, Brendan J. y Delbert Dueck. "Agrupación al pasar mensajes entre puntos de datos". Science 315.5814 (2007): 972-976. .
Es super fácil de usar a través de muchos paquetes. Funciona en cualquier cosa que pueda definir la similitud por pares. Lo que puedes obtener multiplicando la distancia de Levenshtein por -1.
Creé un ejemplo rápido usando el primer párrafo de su pregunta como entrada. En Python 3:
La salida fue (ejemplos en cursiva a la izquierda del clúster del que son ejemplares):
Ejecutándolo en una lista de 50 nombres aleatorios :
Se ve muy bien para mí (eso fue divertido).
fuente
Symmetric
)Utilice algoritmos de agrupación de gráficos, como la agrupación de Lovaina, la agrupación de búsqueda de vecindad restringida (RNSC), la agrupación de propagación de afinidad (APC) o el algoritmo de agrupación de Markov (MCL).
fuente
Puede probar el modelo de espacio vectorial con los n-gramos de las palabras como entradas de espacio vectorial. Creo que tendría que usar una medida como la similitud de coseno en este caso en lugar de editar la distancia.
fuente