私はscikit-learnのTfIDFVectorizerクラスを使って特定の文書の特徴を表す言葉を得ようとしています。すべての文書にすべての単語とそのスコアを含むtfidf行列を作成しますが、一般的な単語も数えているようです。これは私が実行しているコードの一部です:scikit-learnのTFIDFVectorizerはどのように動作するはずですか?
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(contents)
feature_names = vectorizer.get_feature_names()
dense = tfidf_matrix.todense()
denselist = dense.tolist()
df = pd.DataFrame(denselist, columns=feature_names, index=characters)
s = pd.Series(df.loc['Adam'])
s[s > 0].sort_values(ascending=False)[:10]
私は、これは、文書のための独特の言葉「アダム」のリストを返すことが期待されるが、それが何をするか、それは一般的な単語のリストを返す:
and 0.497077
to 0.387147
the 0.316648
of 0.298724
in 0.186404
with 0.144583
his 0.140998
私はそれを完全には理解していないかもしれませんが、理解しているように、tf-idfはコーパス内の1つの文書に特徴的な単語を見つけ、1つの文書に頻繁に出現するが他の文書には出現しない単語を探します。ここでは、and
が他のドキュメントに頻繁に出てくるので、ここでなぜそれが高い価値を返すのか分かりません。
これを生成するために使用している完全コードはin this Jupyter notebookです。
半手動でtf/idfsを計算し、NLTKを使って各単語のスコアを計算すると、適切な結果が得られます。これらは「アダムの文書に出現する単語であるため、権利については見えるが、コーパス内の他の文書に限りません
fresh 0.000813
prime 0.000813
bone 0.000677
relate 0.000677
blame 0.000677
enough 0.000677
:「アダムの文書については。これを生成するために使用される完全なコードはthis Jupyter notebookです。
scikitコードに問題がありますか?このクラスを初期化して正しい結果を返す別の方法がありますか?もちろん、私はstop_words = 'english'
を渡すことによってストップワードを無視することができますが、それは本当に問題を解決するものではありません。
TfidfTransformerはCountVectorizerの出力を変換するので、CountVectorizerを実行してからTfidfTransformerを実行できますが、これはTfidfVectorizerを実行しているのと同じです。とにかく、最初にCountVectorizerを実行する必要がある場合は、TfidfTransformerが必要であると私は確信していません。同じ結果を返しませんか? – Jono