web-dev-qa-db-ja.com

scikit-learnでCountVectorizerを使用して、トークンの抽出に使用されなかったドキュメントの頻度をカウントできますか?

私はscikit-learnのCountVectorizerクラスを使用しています。

以下に示す方法で使用した場合、最終的な出力は、機能またはトークンの数を含む配列で構成されることを理解しています。

これらのトークンは、キーワードのセットから抽出されます。

tags = [
  "python, tools",
  "linux, tools, ubuntu",
  "distributed systems, linux, networking, tools",
]

次のステップは次のとおりです。

from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(tokenizer=tokenize)
data = vec.fit_transform(tags).toarray()
print data

どこで手に入る

[[0 0 0 1 1 0]
 [0 1 0 0 1 1]
 [1 1 1 0 1 0]]

これは問題ありませんが、私の状況は少し異なります。

上記と同じ方法で機能を抽出したいのですが、dataの行を機能の抽出元のドキュメントと同じにしたくないのです。

つまり、別のドキュメントセットのカウントを取得するには、たとえば、

list_of_new_documents = [
  ["python, chicken"],
  ["linux, cow, ubuntu"],
  ["machine learning, bird, fish, pig"]
]

そして取得:

[[0 0 0 1 0 0]
 [0 1 0 0 0 1]
 [0 0 0 0 0 0]]

CountVectorizerクラスのドキュメントを読みましたが、vocabulary引数に出くわしました。これは、用語とフィーチャインデックスのマッピングです。しかし、私はこの議論を助けてくれるようには思えません。

どんなアドバイスも大歓迎です。
PS:上記の例では Matthias Friedrichのブログ によるすべてのクレジット。

39
Matt O'Brien

vocabularyがあなたが望むものであることは正しいです。それはこのように動作します:

>>> cv = sklearn.feature_extraction.text.CountVectorizer(vocabulary=['hot', 'cold', 'old'])
>>> cv.fit_transform(['pease porridge hot', 'pease porridge cold', 'pease porridge in the pot', 'nine days old']).toarray()
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 0],
       [0, 0, 1]], dtype=int64)

したがって、キーとして目的の機能を備えた辞書を渡します。

1つのドキュメントセットでCountVectorizerを使用し、それらのドキュメントの機能セットを新しいセットに使用する場合は、vocabulary_元のCountVectorizerの属性を新しいものに渡します。あなたの例では、あなたはできる

newVec = CountVectorizer(vocabulary=vec.vocabulary_)

最初のボキャブラリーを使用して新しいトークナイザーを作成します。

50
BrenBarn

ベクトル化機能が語彙を学習できるように、元の語彙ソースで_fit_transform_または単にfitを呼び出す必要があります。

次に、transform()メソッドを使用して、このfitベクトライザーを任意の新しいデータソースで使用できます。

_vectorizer.vocabulary__を使用して、適合(つまり、WordからトークンIDへのマッピング)によって生成された語彙を取得できます(CountVectorizerに名前vectorizerを付けると仮定します)。

8
Dhruv Ghulati
>>> tags = [
  "python, tools",
  "linux, tools, ubuntu",
  "distributed systems, linux, networking, tools",
]

>>> list_of_new_documents = [
  ["python, chicken"],
  ["linux, cow, ubuntu"],
  ["machine learning, bird, fish, pig"]

]

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vect = CountVectorizer()
>>> tags = vect.fit_transform(tags)

# vocabulary learned by CountVectorizer (vect)
>>> print(vect.vocabulary_)
{'python': 3, 'tools': 5, 'linux': 1, 'ubuntu': 6, 'distributed': 0, 'systems': 4, 'networking': 2}

# counts for tags
>>> tags.toarray()
array([[0, 0, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1, 1],
       [1, 1, 1, 0, 1, 1, 0]], dtype=int64)

# to use `transform`, `list_of_new_documents` should be a list of strings 
# `itertools.chain` flattens shallow lists more efficiently than list comprehensions

>>> from itertools import chain
>>> new_docs = list(chain.from_iterable(list_of_new_documents)
>>> new_docs = vect.transform(new_docs)

# finally, counts for new_docs!
>>> new_docs.toarray()
array([[0, 0, 0, 1, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0]])

CountVectorizernew_docstagsから学習した語彙を使用していることを確認するには、vect.vocabulary_を再度印刷するか、new_docs.toarray()の出力をtags.toarray()

2
user2476665