2017-08-25 2 views
0

Ich habe eine gruppierte df:TfidfVectorizer Rückkehr 0 für ngrams in Pandas DF mit doppelten IDs

id text 
100 he loves ice cream 
100 she loves ice 
100 i hate avocado 

Ich Extrahieren Bigramme, Frequenzen und TFIDF punktet mit dieser Funktion:

def extractFeatures(groupedDF, textCol): 
    features = pd.DataFrame() 
    for id, group in tqdm(groupedDF): 
      freq = cv.fit_transform(group[textCol]) 
      tfidf = tv.fit_transform(group[textCol]) 
      freq = sum(freq).toarray()[0] 
      tfidf.todense() 
      tfidf = tfidf.toarray()[0] 
      freq = pd.DataFrame(freq, columns=['frequency']) 
      tfidf = pd.DataFrame(tfidf, columns=['tfidf']) 
      dfinner = pd.DataFrame(cv.get_feature_names(), columns=['ngram']) 
      dfinner['id'] = id 
      dfinner = dfinner.join(freq) 
      results = dfinner.join(tfidf) 
      features = features.append(results) 
    return features 

Diese Ergebnisse im folgenden df:

id ngram   frequency tfidf 
100 hate avocado 1   0 
100 he loves  1   .3 
100 i hate  1   0 
100 ice cream  1   .3 
100 loves ice  2   .6 
100 she loves  1   0 

Die Tfidf-Ergebnisse sind erfunden. Also, die Funktion findet die Frequenzen korrekt. Es findet dann tfidf-Ergebnisse für die erste Zeile des gruppierten df (einschließlich für das Bigramm, das in mehreren Zeilen erscheint. Schließlich findet es nicht die tfidf-Bewertungen für Bigramme, die für die zweite und dritte Zeile eindeutig sind.

Zusätzlich Obwohl die Tfidf-Werte konstruiert sind, stimmt es, dass sie für jedes Bigramm, das die gleiche Häufigkeit innerhalb eines bestimmten Dokuments hat, identisch sind, so dass jedes Bigramm mit einer Häufigkeit von 1 in der ersten Zeile den .3-Tfidf-Wert aufweist .. mit einer Frequenz von 1 in einer anderen Zeile könnte eine TFIDF Punktzahl von .24 hat das ist seltsam, weil der Begriff Frequenz jeden Bigramm sicherlich anders ist

Zwei Fragen:

  1. Warum werden die Tfidf-Scores für die zweite und dritte Zeile nicht gefunden?
  2. Warum sind die Tfidf-Werte für ein bestimmtes Bigramm identisch, das in einem bestimmten Dokument mit der gleichen Häufigkeit angezeigt wird?

Vielen Dank für einen Einblick, den Sie alle haben könnten!

Antwort

0
print(df) 

    id text 
0 100 he loves ice cream 
1 100 she loves ice 
2 100 i hate avocado 

TF-IDF ist als die Bedeutung eines Wortes berechnet, die auf die Frequenz eines Wortes in einem Dokument im Vergleich zum Rest des Dokuments bezogen ist. Wenn Sie TF-IDF berechnen wollen, würde ich empfehlen die Verwendung von Scikit-Learn TfidfVectorizer()

from sklearn.feature_extraction.text import TfidfVectorizer 

vectorizer = TfidfVectorizer(smooth_idf=True, 
          ngram_range = (2,2), 
          token_pattern='(?u)\\b\\w\\w*\\b'              
          ) 

words = vectorizer.fit_transform(df.text) 

df2 = pd.DataFrame(words.todense()).rename(columns=dict(zip(vectorizer.vocabulary_.values(), 
vectorizer.vocabulary_.keys()))) 

print(df2) 

    hate avocado he loves i hate  ice cream loves ice she loves 
0 0.000000 0.622766 0.000000 0.622766 0.473630 0.000000 
1 0.000000 0.000000 0.000000 0.000000 0.605349 0.795961 
2 0.707107 0.000000 0.707107 0.000000 0.000000 0.000000 

Die Matrix oben gibt die relative Bedeutung jedes Wortes in jedem doc und wenn das Wort in einem Dokument nicht auftritt, ist es Wert ist Null.

Sie können auch scikit-learn CountVectorizer() verwenden, um Frequenzen auf die gleiche Weise zu zählen

Verwandte Themen