2013-08-25 8 views
7

Ich habe diesen Code für die Berechnung der Textähnlichkeit mit TF-IDF.TFIDF-Algorithmus für Python

from sklearn.feature_extraction.text import TfidfVectorizer 

documents = [doc1,doc2] 
tfidf = TfidfVectorizer().fit_transform(documents) 
pairwise_similarity = tfidf * tfidf.T 
print pairwise_similarity.A 

Das Problem ist, dass dieser Code nimmt als Eingabe blanke Saiten und ich mag die Dokumente zur Vorbereitung von Stoppwörtern, entwickelt werden und tokkenize entfernen. Also wäre die Eingabe eine Liste. Der Fehler, wenn ich die documents = [doc1,doc2] mit den tokkenized Dokumente nennen ist:

Traceback (most recent call last): 
    File "C:\Users\tasos\Desktop\my thesis\beta\similarity.py", line 18, in <module> 
    tfidf = TfidfVectorizer().fit_transform(documents) 
    File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\feature_extraction\text.py", line 1219, in fit_transform 
    X = super(TfidfVectorizer, self).fit_transform(raw_documents) 
    File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\feature_extraction\text.py", line 780, in fit_transform 
    vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary) 
    File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\feature_extraction\text.py", line 715, in _count_vocab 
    for feature in analyze(doc): 
    File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\feature_extraction\text.py", line 229, in <lambda> 
    tokenize(preprocess(self.decode(doc))), stop_words) 
    File "C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\feature_extraction\text.py", line 195, in <lambda> 
    return lambda x: strip_accents(x.lower()) 
AttributeError: 'unicode' object has no attribute 'apply_freq_filter' 

Gibt es eine Möglichkeit, den Code zu ändern und die Liste machen akzeptieren oder habe ich wieder die tokkenized Dokumente in Strings zu ändern?

+0

Sieht aus, als ob Sie die eigentliche Fehlermeldung (Sie haben die Traceback enthalten, aber nicht den Fehler, der ausgelöst wurde) fehlt. –

+0

Hoppla. Ich bearbeite es. – Tasos

+0

@Tasos Hat meine Antwort funktioniert, oder haben Sie immer noch Probleme? Können Sie ein minimales Beispiel für "doc1"/"doc2" geben, wenn meine Lösung nicht funktioniert hat? – chlunde

Antwort

5

Versuchen Vorverarbeitung Überspringen Sie Ihre eigenen „nop“ tokenizer in Kleinbuchstaben und liefern:

tfidf = TfidfVectorizer(tokenizer=lambda doc: doc, lowercase=False).fit_transform(documents) 

Sie auch andere Parameter wie stop_words sollten überprüfen, Ihre Vorverarbeitung zu vermeiden duplizieren.