3

私は Python と Scikit-learn ライブラリのスターターです。私は現在、まずワンホット エンコーディングによって大規模なコーパスを表現する必要がある NLP プロジェクトに取り組む必要があります。Scikit-learn の preprocessing.OneHotEncoder に関するドキュメントを読みましたが、私の用語の理解ではないようです。

基本的に、考え方は次のようになります。

  • 1000000 日曜日; 0100000 月曜日; 0010000 火曜日; ... 0000001 土曜日;

コーパスに 7 つの異なる単語しかない場合、すべての単語を表すために必要なのは 7 桁のベクトルだけです。そして、完成した文は、すべてのベクトルの連言、つまり文行列で表すことができます。しかし、Pythonで試してみましたが、うまくいかないようです...

どうすればこれを解決できますか? 私のコーパスには非常に多くの異なる単語があります。

ところで、ベクトルがほとんどゼロで満たされている場合は、Scipy.Sparse を使用して、CSR などのストレージを小さくすることもできます。

したがって、私の質問全体は次のようになります。

コーパス内の文を OneHotEncoder で表現し、SparseMatrix に格納する方法は?

君たちありがとう。

4

1 に答える 1

5

OneHotEncoder を使用するには、ドキュメントをトークンに分割し、すべてのトークンを ID にマップします (同じ文字列では常に同じです)。次に、そのリストに OneHotEncoder を適用します。結果はデフォルトで疎行列です。

2 つの単純なドキュメントA Bとのコード例B B:

from sklearn.preprocessing import OneHotEncoder
import itertools

# two example documents
docs = ["A B", "B B"]

# split documents to tokens
tokens_docs = [doc.split(" ") for doc in docs]

# convert list of of token-lists to one flat list of tokens
# and then create a dictionary that maps word to id of word,
# like {A: 1, B: 2} here
all_tokens = itertools.chain.from_iterable(tokens_docs)
word_to_id = {token: idx for idx, token in enumerate(set(all_tokens))}

# convert token lists to token-id lists, e.g. [[1, 2], [2, 2]] here
token_ids = [[word_to_id[token] for token in tokens_doc] for tokens_doc in tokens_docs]

# convert list of token-id lists to one-hot representation
vec = OneHotEncoder(n_values=len(word_to_id))
X = vec.fit_transform(token_ids)

print X.toarray()

印刷 (ドキュメントごとに連結された形式の 1 つのホット ベクトル):

[[ 1.  0.  0.  1.]
 [ 0.  1.  0.  1.]]
于 2015-05-21T00:21:25.420 に答える