2017-10-05 2 views
2

Ich habe eine Vokabelliste, die N-Gramm wie folgt enthalten.Berechne TF-IDF mit sklearn für N-Gramm in Python

myvocabulary = ['tim tam', 'jam', 'fresh milk', 'chocolates', 'biscuit pudding'] 

Ich möchte diese Wörter verwenden, um TF-IDF-Werte zu berechnen.

Ich habe auch ein Wörterbuch des Korpus wie folgt (Schlüssel = Rezeptnummer, Wert = Rezept).

corpus = {1: "making chocolates biscuit pudding easy first get your favourite biscuit chocolates", 2: "tim tam drink new recipe that yummy and tasty more thicker than typical milkshake that uses normal chocolates", 3: "making chocolates drink different way using fresh milk egg"} 

Ich verwende derzeit den folgenden Code.

from sklearn.feature_extraction.text import TfidfVectorizer 

tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english') 
tfs = tfidf.fit_transform(corpus.values()) 

jetzt bin ich Druck Tokens oder n-Gramm der Rezeptur 1 in corpus zusammen mit dem TF-IDF-Wert wie folgt.

feature_names = tfidf.get_feature_names() 
doc = 0 
feature_index = tfs[doc,:].nonzero()[1] 
tfidf_scores = zip(feature_index, [tfs[doc, x] for x in feature_index]) 
for w, s in [(feature_names[i], s) for (i, s) in tfidf_scores]: 
    print(w, s) 

Die Ergebnisse, die ich bekomme, ist chocolates 1.0. Mein Code erkennt jedoch keine N-Gramme (Bigramme) wie biscuit pudding bei der Berechnung von TF-IDF-Werten. Bitte lassen Sie mich wissen, wo ich den Code falsch mache.

Ich möchte die TD-IDF-Matrix für myvocabulary Begriffe unter Verwendung der Rezepturdokumente in corpus erhalten. Mit anderen Worten, die Zeilen der Matrix repräsentieren myvocabulary und die Spalten der Matrix repräsentieren die Rezepturdokumente meiner corpus. Bitte hilf mir.

+1

Werfen Sie einen Blick auf 'tokenizer',' token_pattern' und 'ngram_range' params in der TfidfVectorizer. –

Antwort

2

Versuchen Sie, die ngram_range in TfidfVectorizer steigt:

tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english', ngram_range=(1,2)) 

Edit: Der Ausgang des TfidfVectorizer ist die TF-IDF-Matrix in spärlichen Format (oder eigentlich die transponierte es in dem Format, das Sie suchen). Sie können den Inhalt z. dies wie:

feature_names = tfidf.get_feature_names() 
corpus_index = [n for n in corpus] 
rows, cols = tfs.nonzero() 
for row, col in zip(rows, cols): 
    print((feature_names[col], corpus_index[row]), tfs[row, col]) 

die sollte

('biscuit pudding', 1) 0.646128915046 
('chocolates', 1) 0.763228291628 
('chocolates', 2) 0.508542320378 
('tim tam', 2) 0.861036995944 
('chocolates', 3) 0.508542320378 
('fresh milk', 3) 0.861036995944 

ergeben Wenn die Matrix nicht groß ist, könnte es einfacher sein es in dichter Form zu untersuchen. Pandas macht dies sehr praktisch:

import pandas as pd 
df = pd.DataFrame(tfs.T.todense(), index=feature_names, columns=corpus_index) 
print(df) 

Dies

Ergebnisse
     1   2   3 
tim tam   0.000000 0.861037 0.000000 
jam    0.000000 0.000000 0.000000 
fresh milk  0.000000 0.000000 0.861037 
chocolates  0.763228 0.508542 0.508542 
biscuit pudding 0.646129 0.000000 0.000000 
+0

Vielen Dank. Es funktioniert :) Gibt es eine Möglichkeit, meine TF-IDF-Matrix zu sehen? "Ich möchte die TD-IDF-Matrix für meine Vokabularbegriffe erhalten, indem ich die Rezepturdokumente im Korpus verwende. Mit anderen Worten, die Zeilen der Matrix stellen mein Vokabular dar und die Spalten der Matrix stellen die Rezepturdokumente meines Korpus dar." –