2

scikit-learn を使用して、「単語の袋」テキスト (単一の単語でトークン化されたテキスト) からテキスト機能を抽出しています。そのために、TfidfVectorizerを使用して、非常に頻繁に使用される単語 (「a」、「the」など) の重みも減らしています。

text = 'Some text, with a lot of words...'
tfidf_vectorizer = TfidfVectorizer(
    min_df=1,  # min count for relevant vocabulary
    max_features=4000,  # maximum number of features
    strip_accents='unicode',  # replace all accented unicode char
    # by their corresponding  ASCII char
    analyzer='word',  # features made of words
    token_pattern=r'\w{4,}',  # tokenize only words of 4+ chars
    ngram_range=(1, 1),  # features made of a single tokens
    use_idf=True,  # enable inverse-document-frequency reweighting
    smooth_idf=True,  # prevents zero division for unseen words
    sublinear_tf=False)

# vectorize and re-weight
desc_vect = tfidf_vectorizer.fit_transform([text])

tfidf予測された各機能を対応する浮動小数点値にリンクして、辞書に保存できるようにしたいと思います

{'feature1:' tfidf1, 'feature2': tfidf2, ...}

を使用して達成しました

d = dict(zip(tfidf_vectorizer.get_feature_names(), desc_vect.data))

そのようなことを行うためのより良い、scikit-learn ネイティブの方法があったかどうかを知りたいです。

どうもありがとうございました。

4

1 に答える 1

5

単一のドキュメントの場合、これで問題ありません。ドキュメントセットが小さい場合に機能する代替手段は、Pandasを使用する私のレシピです

複数のドキュメントに対してこれを行いたい場合は、コードをDictVectorizer.inverse_transform次のように変更できます。

desc_vect = desc_vect.tocsr()

n_docs = desc_vect.shape[0]
tfidftables = [{} for _ in xrange(n_docs)]
terms = tfidf_vectorizer.get_feature_names()

for i, j in zip(*desc_vect.nonzero()):
    tfidftables[i][terms[j]] = X[i, j]
于 2013-03-12T13:27:32.283 に答える