2012-08-11 8 views
12

Okay, so habe ich die folgenden zwei Beiträge auf IDF TF * bin aber wenig verwirrt: http://css.dzone.com/articles/machine-learning-text-featureTF * IDF für Suchanfragen

Grundsätzlich möchte ich eine Suchabfrage erstellen, die Suche durch mehrere Dokumente enthält. Ich würde gerne das Scikit-lernen-Toolkit sowie die NLTK-Bibliothek für Python verwenden

Das Problem ist, dass ich nicht sehe, wo die beiden TF * IDF-Vektoren herkommen. Ich brauche eine Suchanfrage und mehrere Dokumente zu suchen. Ich dachte mir, dass ich die TF * IDF-Scores jedes Dokuments für jede Abfrage berechnen und die Kosinusähnlichkeit zwischen ihnen ermitteln und sie dann ordnen werde, indem ich die Scores in absteigender Reihenfolge sortiere. Der Code scheint jedoch nicht mit den richtigen Vektoren zu kommen.

Immer wenn ich die Abfrage auf nur eine Suche reduziere, gibt es eine riesige Liste von Nullen zurück, die wirklich seltsam ist. Hier

ist der Code:

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from nltk.corpus import stopwords 

train_set = ("The sky is blue.", "The sun is bright.") #Documents 
test_set = ("The sun in the sky is bright.") #Query 
stopWords = stopwords.words('english') 

vectorizer = CountVectorizer(stop_words = stopWords) 
transformer = TfidfTransformer() 

trainVectorizerArray = vectorizer.fit_transform(train_set).toarray() 
testVectorizerArray = vectorizer.transform(test_set).toarray() 
print 'Fit Vectorizer to train set', trainVectorizerArray 
print 'Transform Vectorizer to test set', testVectorizerArray 

transformer.fit(trainVectorizerArray) 
print transformer.transform(trainVectorizerArray).toarray() 

transformer.fit(testVectorizerArray) 

tfidf = transformer.transform(testVectorizerArray) 
print tfidf.todense() 
+0

Ich frage mich, ob Sie den Kosinus mit der endgültigen Matrix berechnet haben, die Sie von print tfidf.todense() bekommen, wenn ja, wie machen Sie das? –

+1

Hey eine Sekunde ... Ill post ein Beispiel bald. – tabchas

+0

Danke das wäre fantastisch. Würdest du hier einen Link setzen? Das ist sogar noch besser. –

Antwort

13

Sie train_set und test_set als Tupel definieren, aber ich denke, dass sie Listen sein sollte:

train_set = ["The sky is blue.", "The sun is bright."] #Documents 
test_set = ["The sun in the sky is bright."] #Query 

Mit diesem der Code scheint gut laufen.

+0

Awesome. Danke für den Rat. Gibt es einen Grund, warum es nicht mit Tupeln funktioniert? – tabchas

+2

Es ist codiert, um Listen als Eingabe zu nehmen :). Diese Listen werden intern in NumPy-Arrays konvertiert (Sie können auch ein NumPy-Array direkt übergeben). – Sicco

Verwandte Themen