Bündelung einer langen Liste von Zeichenfolgen (Wörtern) in Ähnlichkeitsgruppen


31

Ich habe das folgende Problem zur Hand: Ich habe eine sehr lange Liste von Wörtern, möglicherweise Namen, Nachnamen usw. Ich muss diese Wortliste so gruppieren, dass ähnliche Wörter, zum Beispiel Wörter mit ähnlichem Bearbeitungsabstand (Levenshtein), in der Liste angezeigt werden gleichen Cluster. Zum Beispiel sollten "Algorithmus" und "Alogrithmus" hohe Chancen haben, im selben Cluster zu erscheinen.

Mir sind die klassischen, nicht überwachten Clustering-Methoden wie k-means clustering und EM clustering in der Literatur zur Mustererkennung bekannt. Das Problem hierbei ist, dass diese Methoden auf Punkten arbeiten, die sich in einem Vektorraum befinden. Ich habe hier Saitenworte zur Hand. Es scheint, dass die Frage, wie man Strings in einem numerischen Vektorraum darstellt und das "Mittel" von String-Clustern berechnet, nach meinen bisherigen Umfrageanstrengungen nicht ausreichend beantwortet ist. Ein naiver Ansatz, um dieses Problem anzugehen, wäre die Kombination von k-Means-Clustering mit Levenshtein-Abstand, aber die Frage bleibt immer noch "Wie soll man" Mittel "von Zeichenketten darstellen?". Es gibt ein Gewicht, das als TF-IDF-Gewicht bezeichnet wird, aber es scheint, dass es hauptsächlich mit dem Bereich des "Textdokument" -Clusterings zusammenhängt, nicht mit dem Clustering einzelner Wörter. http://pike.psu.edu/cleandb06/papers/CameraReady_120.pdf

Meine Suche in diesem Bereich dauert noch an, aber ich wollte auch hier Anregungen bekommen. Was würden Sie in diesem Fall empfehlen, kennt jemand Methoden für diese Art von Problem?


1
Ich habe etwas über die Existenz einer Variante von K-Mitteln mit dem Namen "K-Medoide" erfahren. en.wikipedia.org/wiki/K-medoids Es funktioniert nicht mit L2-Euklidischen Entfernungen und benötigt keine Mittelwertberechnung. Es verwendet den Datenpunkt, der den anderen in einem Cluster am nächsten ist, als "Medoid".
Ufuk Can Bicici

1
It seems that there are some special string clustering algorithms. Wenn Sie aus einem bestimmten Text-Mining-Bereich stammen und nicht aus Statistiken / Datenanalysen, ist diese Aussage berechtigt. Wenn Sie jedoch lernen, Clustering Branch zu lernen, werden Sie feststellen, dass es keine "speziellen" Algorithmen für String-Daten gibt. Das "Besondere" ist, wie Sie solche Daten vorverarbeiten, bevor Sie sie in eine Clusteranalyse eingeben.
TTNPHNS


Beachten Sie den Unterschied zwischen Affinitätsausbreitung und K-Means-Clustering und wie sich dies auf die Rechenzeit auswirkt. quora.com/…
Gabriel Alon

Antworten:


37

Empfehlung von Seconding @ mican zur Affinitätsvermehrung .

Aus der Zeitung: L Frey, Brendan J. und Delbert Dueck. "Clustering durch Weiterleiten von Nachrichten zwischen Datenpunkten." science 315, 5814 (2007): 972–976. .

Es ist super einfach über viele Pakete zu bedienen. Es funktioniert auf alles, was Sie die paarweise Ähnlichkeit definieren können. Was Sie durch Multiplizieren der Levenshtein-Distanz mit -1 erhalten können.

Ich habe ein kurzes Beispiel zusammengestellt und dabei den ersten Absatz Ihrer Frage als Eingabe verwendet. In Python 3:

import numpy as np
import sklearn.cluster
import distance

words = "YOUR WORDS HERE".split(" ") #Replace this line
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])

affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

Ausgabe war (Beispiele in Kursivschrift links vom Cluster, für die sie beispielhaft sind):

  • haben: Chancen, bearbeiten, Hand, haben, hoch
  • folgend: folgend
  • Problem: Problem
  • I: Ich, eine, bei, etc, in, Liste, von
  • möglicherweise: möglicherweise
  • Cluster: Cluster
  • wort: Für und für lange brauchen, sollten, sehr, wort, worte
  • ähnlich: ähnlich
  • Levenshtein: Levenshtein
  • entfernung: entfernung
  • das: das, das, das, mit
  • Same: Beispiel, Liste, Namen, Same, solche, Nachnamen
  • Algorithmus: Algorithmus, Algorithmus
  • Erscheinen: Erscheinen, erscheint

Ausführen auf einer Liste von 50 zufälligen Vornamen :

  • Diane: Deana, Diane, Gerald, Irina, Lisette, Minna, Nicki, Ricki
  • Jani: Clair, Jani, Jason, Kimi, Lang, Marcus, Maxima, Randi, Raul
  • Verline: Schicksal, Kellye, Marylin, Mercedes, Sterling, Verline
  • Glenn: Elenor, Glenn, Gwenda
  • Armandina: Armandina, Augustina
  • Shiela: Ahmed, Estella, Milissa, Shiela, Thresa, Wynell
  • Laureen: Herbst, Haydee, Laureen, Lauren
  • Alberto: Albertha, Alberto, Robert
  • Überlieferung: Ammie, Doreen, Eura, Josef, Überlieferung, Lori, Porter

Sieht für mich ziemlich gut aus (das hat Spaß gemacht).


Ist es möglich, denselben Algorithmus nur mit sklearn zu verwenden? oder scipy.spatial.distance mit hamming benutzen? Was ist der Vorteil von Levenshtein? Ich denke, ich muss versuchen, diese Frage zu verwenden: stackoverflow.com/questions/4588541/…
Pierre

1
@pierre Levenshtein ist das, was ich als "Rechtschreibdistanz" bezeichnen würde. Es ist ein guter Ersatz für die Möglichkeit eines menschlichen Rechtschreibfehlers. Damerau Levenshtein könnte noch besser sein. Ich weiß nicht, dass Hamming Distance für Zeichenfolgen ungleicher Länge definiert ist. Es erlaubt nur Swaps, keine Insertionen. Es ist fast so schwer zu bestimmen, wie die Saite am sinnvollsten aufzufüllen / zuzuschneiden ist, wie die Levenshtein-Distanz zu berechnen. Solltest du den Start auffüllen / zuschneiden? Das Ende? Einige aus der Mitte?
Lyndon White

Wenn Sie wirklich die Abhängigkeit von Entfernungen vermeiden wollten. Sie könnten die Rossetta-Code-Implementierung verwenden
Lyndon White

Beim Lesen der en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance kann ich sehen, wie die Umsetzung den Unterschied speziell für Tippfehler ausmachen kann, und Python hat ein brandneues Paket dafür. Ich kann sehen, wie ich das gegen eine Liste von Wörtern verwenden kann und das "nächste" erhalte, aber möglicherweise nicht das wichtigste. Ich muss meine Liste bekommen und mit der tf-idf abklären. Cool, danke
Pierre

1
@dduhaime mit ziemlicher Sicherheit. Im Allgemeinen funktioniert die Affinitätsvermehrung für nicht-symmetrische Perferenzen, aber da dies symmetrisch ist, fahren Sie fort. Ich bin sicher, dass etwas in SciPy einen dreieckigen Matrixtyp hat, der sich als vollständige Matrix ausgibt. Ich war zu lange in Julia Lang und kann mich nicht erinnern, wie das in Python gemacht wird. (In Julia, die Sie verwenden würden Symmetric)
Lyndon White

5

Verwenden Sie Graph-Clustering-Algorithmen wie Louvain-Clustering, RNSC (Restricted Neighborhood Search Clustering), APC (Affinity Propgation Clustering) oder MCL (Markov-Cluster-Algorithmus).


Was ist mit der K-Medoids-Methode, die ich gefunden habe? Ich muss diese Lösung so schnell wie möglich implementieren, daher schien es mir eine gute Lösung zu sein. Mir ist die Existenz dieser graphbasierten Methoden bekannt, aber ich fürchte, ich kann mir nicht die Zeit leisten, die ich brauche, um diese zu verstehen und umzusetzen.
Ufuk Can Bicici

Für alle von ihnen ist Software mit nicht einschränkenden Lizenzvereinbarungen wie der GNU GPL erhältlich. Ich bin kein großer Fan des k-mediods-Algorithmus, hauptsächlich wegen des k-Parameters, aber es liegt ganz bei Ihnen. Wenn Sie eine interne Implementierung benötigen, sind APC und MCL wahrscheinlich am einfachsten zu implementieren. Wenn Sie das tun sollten, probieren Sie sie natürlich zuerst aus.
Micans

2

Sie können das Vektorraummodell mit den n-Gramm der Wörter als Vektorraumeinträge ausprobieren. Ich denke, Sie müssten in diesem Fall ein Maß wie Cosinus-Ähnlichkeit verwenden, anstatt Abstand zu bearbeiten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.