2016-05-24 12 views
-1

Ich möchte meine Wortliste in einige Cluster unterteilen mit Levenshtein Distance.Levenshtein Entfernung für eine Liste

Aber als ich Schleife über Liste laufen einige Cluster wiederholt werden. Bitte helfen Sie mir, dieses Problem zu sortieren

Antwort

0

Wenn Sie nur Zeichenfolgen haben, warum nicht ein Set verwenden?

Target = set(Target_Column.tolist()) 

Sie können auch einen Standardwert eines Satzes für die Zuordnung verwenden:

clusters = defaultdict(set) 

Aber dies erfordert list.append-set.add in der Schleife zu ändern.


Es gibt jedoch eine pythischere Alternative zu Ihrem Code.

Ich würde wahrscheinlich eine Zuordnung von Wörtern zum Satz ihrer Verbindungen im laufenden Betrieb generieren.

Hier ist ein Beispiel unter der Annahme, words ein set aller Worte ist:

clusters = {w1: set(w2 for w2 in words if distance(w1, w2) <= threshold) for w1 in words} 

anschauliches Beispiel:

>>> distance = lambda x, y: abs(len(x) - len(y)) 
>>> words = set("abc def abcd abcdefghijk abcdefghijklmnopqrstuv".split()) 
>>> threshold = 3 
>>> for cluster, values in clusters.items(): 
...  print cluster, ": ", ", ".join(values) 
... 
abcd : abcd, abc, def 
abc : abcd, abc, def 
abcdefghijk : abcdefghijk 
abcdefghijklmnopqrstuv : abcdefghijklmnopqrstuv 
def : abcd, abc, def 

Steigende Schwelle bekommen wir einen großen "Cluster" für alle Worte:

>>> threshold = 100 
>>> clusters = {w1: set(w2 for w2 in words if distance(w1, w2) <= threshold) for w1 in words} 
>>> for cluster, values in clusters.items(): 
...  print cluster, ": ", ", ".join(values) 
... 
abcd : abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def 
abc : abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def 
abcdefghijk : abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def 
abcdefghijklmnopqrstuv : abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def 
def : abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def 
+0

Angenommen ich habe eine Liste mit 6 Wörtern Ziel = ('Ajay', 'Baum', 'Mann', 'Tiger', 'Ajad', 'Trend') Der Loop beginnt mit dem ersten Wort und erstellt Cluster mit dem for-Loop-Cluster 1 ist 'Ajay', 'Ajac', aber wenn der Loop den 4. Index erreicht, wird wieder ein Cluster mit den Wörtern 'Ajac' erstellt. Ajay '. Eine Option ist das Löschen dieses Wortes nach dem Hinzufügen zu 1 Cluster, aber es wird mir Fehler-Index außerhalb des Bereichs geben. –

+0

@AjayJadhav Ich habe ein Beispiel hinzugefügt. –

+0

** Ich nehme Abstand von Levenshtein **
von Levenshtein Import Entfernung –