2016-12-17 3 views
0

Hallo ich zwei Arrays haben, die wie folgt aussehen:Wie kann der Aufbau des folgenden Wörterbuchs optimiert werden?

print("list of clusters",y_pred[:10] 
print("list of comments",listComments[:10]) 

Ausgang:

list of comments ['hello This', 'Fabiola hello', 'I am using', ... 

list of clusters [ 2 11 2 2 11 2 2 2 2 2] 

die Liste der Cluster wurde, wird builded KMeans jedem Kommentar der „Liste der Kommentare“ so diese beiden Anwendung Liste die gleiche Länge:

y_pred = kmeans.predict(tfidf) 
print("length list comments",len(listComments)) 
print("length list clusters",len(y_pred)) 

Ausgabe:

length list comments 17223 
length list clusters 17223 

Dann möchte ich alle Kommentare, die zu einer bestimmten Nummer gehören, gruppieren, um beispielsweise ein Wörterbuch mit der Nummer des Clusters als Schlüssel und der Liste aller Kommentare, die zu diesem spezifischen Cluster gehören, wie folgt zu erstellen:

myDict = {2: ['hello This', 'I am using',...], 11: ['Fabiola hello', ...], ... } 

für dieses Beispiel, da das erste Etikett von Cluster 2 ist, wird der erste Kommentar zu meinem Wörterbuch zugewiesen und dann da das Etikett 11 in der Liste der Cluster ist der folgende Kommentar zum Cluster 11 das Etikett dann zugeordnet ist 2 also der Kommentar 'Ich benutze' ist der Liste von Cluster 2 zugeordnet:

Ich habe versucht, dies als zu erreichen folgt:

dict_clusters2 = {} 
for i in range(0,len(y_pred)): 
    #print(kmeans.labels_[i]) 
    #print(listComments[i]) 
    if not y_pred[i] in dict_clusters2: 
     dict_clusters2[y_pred[i]] = [] 
    dict_clusters2[y_pred[i]].append(listComments[i]) 
print("dictionary constructed") 

aber dieser Ansatz viel Zeit aus diesem Grund zu berechnen nimmt Ich mag würde einen Vorschlag zu schätzen, diesen Prozess zu optimieren, vielen Dank für die Aufmerksamkeit und Unterstützung,

die Version von python, die ich verwende ist die folgende:

3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] 
3.5.2 

Antwort

1

Sie viel Indizierung für beide Listen verwenden, die ihre Komplexität O (N) und einige andere Operationen ist. Stattdessen können Sie zip Funktion verwenden, um einen Generator enthält Paare von Zahlen und Kommentare dann collections.defaultdict() verwenden, um zu erstellen, um Ihre erwartete Wörterbuch zu erstellen (was der Fall ist genau das, was diese Funktion für ist):

from collections import defaultdict 
pairs = zip(y_pred, listComments) 

dict_clusters2 = defaultdict(list) 

for num, comment in pairs: 
    dict_clusters2[num].append(comment) 
+0

Thanks a viel für die Erklärung, aber ich bekomme einen Fehler, was würde der Parameter "Liste" sein? Das ist der Fehler, ich erhalte: Traceback (jüngste Aufforderung zuletzt): Datei "C: /Users/acamagon/CleanFile.py", Linie 133, in dict_clusters2 = defaultdict (Liste) Typeerror: erste Argument muss aufrufbar sein oder Keine – neo33

+0

@ neo33 Es scheint, dass Sie den eingebauten Namen 'list' beschattet haben, vielleicht indem Sie ihn als Namen einer Variablen verwenden. Wenn es so ist, bitte korrigieren Sie das. – Kasramvd

+0

@ Kasramvd, ja, ich habe diesen Namen für eine andere Liste verwendet, aber es wurde vielen Dank für Ihre Unterstützung und Komplexität erklärt. – neo33

Verwandte Themen