2017-08-14 25 views
2

Ich versuche, tfidf aus einem Dokument zu bekommen. Aber ich denke nicht, dass es mir korrekte Werte gibt oder ich etwas falsch mache. Bitte vorschlagen. Code und eine Ausgabe:Ist das korrekt tfidf?

Update 1: (Wie juanpa.arrivillaga vorgeschlagen)

vectorizer = TfidfVectorizer(smooth_idf=False) 

Ausgang:

script - 0.269290317245 
wordcount - 0.269290317245 
by - 0.269290317245 
read - 0.269290317245 
be - 0.269290317245 
to - 0.269290317245 
book - 0.209127954024 
first - 0.354084405732 
is - 0.269290317245 
this - 0.269290317245 
there - 0.354084405732 
hello - 0.354084405732 
information - 0.0 
... 

Output nach dem Update 1:

script - 0.256536760895 
wordcount - 0.256536760895 
by - 0.256536760895 
read - 0.256536760895 
be - 0.256536760895 
to - 0.256536760895 
book - 0.182528018244 
first - 0.383055542114 
is - 0.256536760895 
this - 0.256536760895 
there - 0.383055542114 
hello - 0.383055542114 
information - 0.0 
... 

Nach meinem Verständnis ist tfidf = t f * idf. Und die Art, wie ich es manuell als Beispiel berechne:

Dokument 1: "Hallo, das ist das erste Buch von Wordcount Skript gelesen werden." Dokument 2: "Dies ist das zweite Buch, das vom Wordcount-Skript gelesen werden soll. Es enthält einige zusätzliche Informationen." Dokument 3: "nur drittes Buch."

TFIDF für Hallo:

tf= 1/12(total terms in document 1)= 0.08333333333 
idf= log(3(total documents)/1(no. of document with term in it))= 0.47712125472 
0.08333333333*0.47712125472= 0.03976008865 

, die von unten abweicht (hallo - ,354084405732).

manuelle Berechnung nach dem Update 1:

tf = 1 
idf= log(nd/df) +1 = log (3/1) +1= 0.47712125472 + 1= 1.47712 
tfidf = tf*idf = 1* 1.47712= 1.47712 

(nicht identisch mit Codeausgabe "Hallo - ,383055542114" nach idf Glättung)

Jede Hilfe zu verstehen, was sehr .. geschätzt los ist

+5

Sie können genau sehen, was verwendet wird ("hier in der Dokumentation") (http://scikit-learn.org/stable/modules/feature_extraction.html#tfidf-term-weighting). Beachten Sie, dass Sie keine IDF-Glättung durchführen, was der 'TfidfVectorizer' standardmäßig tut. –

+0

Auch die Dokumente scheinen zu implizieren, dass Begriff Frequenz eine rohe Term-Frequenz ist, nicht durch Dokumentlänge normalisiert –

+0

@ juanpa.arrivillaga, können Sie Ihren Kommentar in eine Antwort verwandeln - dies könnte helfen Menschen suchen/fragen das gleiche .. – MaxU

Antwort

2

Hier ist ein Ausgang ohne Glättung oder Normalisierung:

In [2]: from sklearn.feature_extraction.text import TfidfVectorizer 
    ...: books = ["Hello there this is first book to be read by wordcount script.", "This is second book to be read by wordcount sc 
    ...: ript. It has some additionl information.", "just third book."] 
    ...: vectorizer = TfidfVectorizer(smooth_idf=False, norm=None) 
    ...: response = vectorizer.fit_transform(books) 
    ...: feature_names = vectorizer.get_feature_names() 
    ...: for col in response.nonzero()[1]: 
    ...: print(feature_names[col], '-', response[0, col]) 
    ...: 
hello - 2.09861228867 
there - 2.09861228867 
this - 1.40546510811 
is - 1.40546510811 
first - 2.09861228867 
book - 1.0 
to - 1.40546510811 
be - 1.40546510811 
read - 1.40546510811 
by - 1.40546510811 
wordcount - 1.40546510811 
script - 1.40546510811 
this - 1.40546510811 
is - 1.40546510811 
book - 1.0 
to - 1.40546510811 
be - 1.40546510811 
read - 1.40546510811 
by - 1.40546510811 
wordcount - 1.40546510811 
script - 1.40546510811 
second - 0.0 
it - 0.0 
has - 0.0 
some - 0.0 
additionl - 0.0 
information - 0.0 
book - 1.0 
just - 0.0 
third - 0.0 

betrachten also das Ergebnis für "hello":

hello - 2.09861228867 

nun manuell:

In [3]: import math 

In [4]: tf = 1 

In [5]: idf = math.log(3/1) + 1 

In [6]: tf*idf 
Out[6]: 2.09861228866811 

das Problem bei der manuellen Berechnung ist, dass Sie log Basis verwenden, aber Sie müssen die natürliche verwenden Logarithmus.

Wenn Sie immer noch den brennenden Wunsch verspüren, die Glättungs- und Normalisierungsschritte zu durchlaufen, sollten Sie dies richtig einstellen.

+0

Vielen Dank für Ihre Hilfe. Ich bekomme es jetzt ... können Sie auch vorschlagen, wie Warnung, die ich mit dem gleichen Code wie "VisibleDeprecationWarning bekommen:" Rang "ist veraltet, verwenden Sie die" ndim "Attribut oder Funktion statt." – Manvi

+0

@Manvi Ich habe keine Ahnung, woher diese Warnung kommt. Es scheint, als ob Sie eine andere Frage stellen sollten, aber es scheint auch ziemlich selbsterklärend zu sein - verwenden Sie nicht das Argument 'rank' für die Funktion, die Ihnen diese Warnung gibt, verwenden Sie stattdessen" ndim "oder eine Funktion ... –

+0

@Manvi Es scheint, als käme das von der zugrunde liegenden 'slearn'-Implementierung, die eine veraltete' scipy'-Funktion verwendet. Wahrscheinlich wurde das behoben - ich bekomme keine Warnung. Versuchen Sie, 'sklearn' zu aktualisieren –