2017-05-31 7 views
1

Ich habe einen großen Korpus als Diktat von 25 Listen gespeichert, die ich mit SKLearns TfidfVectorizer analysieren möchte. Jede Liste enthält viele Zeichenfolgen. Jetzt interessiere ich mich sowohl für die gesamte Begriffshäufigkeit (tf) im gesamten Korpus als auch für die einzigartigsten Begriffe in jeder Liste der 25 Zeichenfolgen (idf). Das Problem ist, ich habe keine Möglichkeit gefunden, diese Art von Objekt an den TfidfVectorizer zu übergeben. Übergeben der Diktat nur Vektorisiert die Schlüssel, die Übergabe der Werte ergibt eine AttributeError: 'list' object has no attribute 'lower' (ich denke, es erwartet eine Zeichenfolge.)Verwenden von TfidfVectorizer auf einem Verzeichnis von Listen

Vielen Dank im Voraus.

Update: Jetzt ist mein Vorverarbeitungsschritt einschließlich, die ein dict der Fläche verwendet, ID-Paare genannt buckets

for area in buckets: 
    area_docs = [] 
    for value in buckets[area]: 
     if 'filename_%s.txt' % value in os.listdir(directory): 
      fin = open(directory+'/filename_%s.txt' % value, 'r').read() 
      area_docs.append(fin) 
      buckets[area] = area_docs 



corpus = buckets.values() 
vectorizer = TfidfVectorizer(min_df=1, stop_words='english') 
X = vectorizer.fit_transform(corpus) 
idf = vectorizer.idf_ 
d = dict(zip(vectorizer.get_feature_names(), idf)) 
sorted_d = sorted(d.items(), key=operator.itemgetter(1)) 
sorted_d[:50] 
+1

'TfidfVectorizer' wird verwendet, um" eine Sammlung von Rohdokumenten in eine Matrix von TF-IDF-Features zu konvertieren ". Es möchte eine Sequenz von Dokumenten. Ihr Wörterbuch scheint irgendwie verarbeitet zu werden, daher ist nicht klar, was Sie von 'TfidfVectorizer' erwarten. –

+0

Danke @ juanpa.arrivillaga. Bearbeitet, um zu reflektieren, dass Listeneinzelteile mehr-Wort Zeichenketten sind (in meinen tatsächlichen Falldokumenten ~ 2000 Wörtern). Die Listen sind im Grunde Subkonzerne. In der Tat möchte ich die markantesten Wörter in einem gegebenen Subcorpus (Liste) kennen. – 6Bacon

Antwort

1

TfidfVectorizer eine Liste von Strings will, in dem jeder String ein Dokument. Ihre area_docs Variable ist bereits eine Liste von Strings. Wenn Sie also buckets.values() aufrufen, erhalten Sie eine Liste von Strings, die zu viele Dimensionen für TfidfVectorizer haben. Sie müssen diese Liste reduzieren. Code unten ist in Python3, mit nur einer Zeile geändert und eine weitere neue Zeile hinzugefügt:

for area in buckets: 
    area_docs = [] 
    for value in buckets[area]: 
     if 'filename_%s.txt' % value in os.listdir(directory): 
      fin = open(directory+'/filename_%s.txt' % value, 'r').read() 
      area_docs.append(fin) 
      buckets[area] = area_docs 

corpus = list(buckets.values()) # Get your list of lists of strings 
corpus = sum(corpus, []) # Good trick for flattening 2D lists to 1D 
vectorizer = TfidfVectorizer(min_df=1, stop_words='english') 
X = vectorizer.fit_transform(corpus) 
idf = vectorizer.idf_ 
d = dict(zip(vectorizer.get_feature_names(), idf)) 
sorted_d = sorted(d.items(), key=operator.itemgetter(1)) 
sorted_d[:50] 

Das sollte es tun!

Verwandte Themen