2017-08-25 12 views
0

Iグループ化されたDFがあります。TfidfVectorizer重複IDを持つパンダDFでNgramsのための0を返す

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 

この結果:

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

を私はこの機能をバイグラム、周波数、およびTFIDFスコアを抽出しています次の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 

tfidfのスコアが考案されています。したがって、関数は周波数を正しく見つけることができます。グループ化されたdfの最初の行(複数の行に表示されるbigramを含む)でtfidfのスコアを検索しています。

さらに、tfidfのスコアは2番目と3番目の行に固有のものです。 tfidfのスコアは人為的なものですが、特定のドキュメント内で同じ頻度を持つバイグラムが同一であることは真実です。したがって、1行目の頻度が1のバイグラムは.3 tfidfのスコアを持ちます。 。。各バイグラムの用語頻度は確かに異なっているので、0.24のTFIDFスコアを持っているかもしれない別の行における1の周波数でこれは奇妙です

二つの質問:

  1. 2番目と3番目の行のtfidfスコアが見つからないのはなぜですか?
  2. 特定のドキュメントで同じ周波数で出現する特定のバイグラムのtfidfスコアが同じであるのはなぜですか?

ありがとうございました!

答えて

0

TF-IDFは、文書の残りの部分と比較して、ある文書の単語の頻度に関連する単語の重要度として計算されます。あなたはTF-IDFを計算したい場合は、私は上記の行列は、各ドキュメントに、その言葉は、それが価値だ文書で発生していない場合は、各単語の相対的な重要性を与えるscikit-学ぶ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 

を使用することをお勧めしますゼロである。

また、scikit-learn CountVectorizer()を使用して、同じ方法で周波数をカウントすることもできます。

関連する問題