私は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のブログ によるすべてのクレジット。
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_)
最初のボキャブラリーを使用して新しいトークナイザーを作成します。
ベクトル化機能が語彙を学習できるように、元の語彙ソースで_fit_transform
_または単にfit
を呼び出す必要があります。
次に、transform()
メソッドを使用して、このfit
ベクトライザーを任意の新しいデータソースで使用できます。
_vectorizer.vocabulary_
_を使用して、適合(つまり、WordからトークンIDへのマッピング)によって生成された語彙を取得できます(CountVectorizer
に名前vectorizer
を付けると仮定します)。
>>> 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]])
CountVectorizer
がnew_docs
のtags
から学習した語彙を使用していることを確認するには、vect.vocabulary_
を再度印刷するか、new_docs.toarray()
の出力をtags.toarray()