web-dev-qa-db-ja.com

pythonのn-gramに対してsklearnを使用してTF-IDFを計算します

次のようなn-gramを含む語彙リストがあります。

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

これらの単語を使用してTF-IDF値を計算したいと思います。

次のようなコーパスの辞書もあります(キー=レシピ番号、値=レシピ)。

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"}

現在、次のコードを使用しています。

from sklearn.feature_extraction.text import TfidfVectorizer

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

現在、レシピ1のトークンまたはn-gramをcorpusにtF-IDF値とともに次のように出力しています。

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)

私が得る結果はchocolates 1.0です。ただし、私のコードでは、TF-IDF値を計算するときにbiscuit puddingなどのN-gram(バイグラム)を検出しません。コードを間違ったところを教えてください。

myvocabularyのレシピドキュメントを使用して、corpus用語のTD-IDFマトリックスを取得したいと思います。つまり、行列の行はmyvocabularyを表し、行列の列はmy corpusのレシピドキュメントを表します。私を助けてください。

7
user8566323

ngram_range in TfidfVectorizer

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

編集:TfidfVectorizerの出力は、スパースフォーマットのTF-IDFマトリックスです(または実際には、求めるフォーマットでの転置)。内容を印刷できます。このような:

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])

降伏するはずです

('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

マトリックスが大きくない場合は、密な形で調べる方が簡単な場合があります。 Pandasはこれを非常に便利にします:

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

これは

                        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
17
σηγ