これを行う方法には多くのバリエーションがあり、所有するデータの量とこれに投資する時間によって異なります。いくつかの代替案を引用しながら、自分自身で改善できる主流の道を提供しようとします. ディープ ラーニングによるテキスト モデリングの予備知識は想定していません。
1 つの方法は、クラス/ラベル タイプがすべて可能な POS タグであるマルチクラス分類として問題をモデル化することです。これを深層学習モデルで組み立てる最も一般的な方法は 2 つあります。1 つはウィンドウ モデルです。もう 1 つは、リカレント ユニットを使用したシーケンス タガーです。
両方の中で最も単純なウィンドウ モデルを想定してみましょう。次に、次のことができます。
データの構造化
- コーパスを単語のウィンドウ
W
(たとえば 3 つの単語) に切り刻みます。中心の単語は分類したい単語で、他の単語はコンテキストです。この部分をデータと呼びましょうX
。
- ウィンドウごとに、中央の単語の POS タグを取得します。この部分をデータと呼びましょう
y
データのエンコード
X をベクトルとしてエンコード
現在、ニューラル ネットX
は一連のベクトルとしてエンコードする必要があります。一般的な選択は、各単語を単語埋め込みとしてエンコードすることです。
そのためには、まずテキストをトークン化し、各単語を整数の単語 ID としてエンコードします (たとえば、"cat" が出現するたびに数字の 7 になります)。独自のトークナイザーがない場合は、 Keras にバンドルされているものを使用できます。これはテキストを受け取り、一連の整数/単語 ID を返します。
次に、すべてのインスタンスが同じ長さになるように、単語 ID の各シーケンスをパディングして切り詰めたい場合があります (注: これを処理する他の方法があります)。imdb_lstm.py の例は次のとおりです。
(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features)
print(len(X_train), 'train sequences')
print(len(X_test), 'test sequences')
print('Pad sequences (samples x time)')
X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
X_test = sequence.pad_sequences(X_test, maxlen=maxlen)
print('X_train shape:', X_train.shape)
print('X_test shape:', X_test.shape)
次に、埋め込みレイヤーを使用して、パディング/切り捨てられた単語 ID のシーケンスを単語埋め込みのシーケンスに変換できます。imdb_lstm.py の例:
model = Sequential()
model.add(Embedding(max_features, 128, dropout=0.2))
model.add(LSTM(128, dropout_W=0.2, dropout_U=0.2)) # try using a GRU instead, for fun
ここでは、Embedding の出力が LSTM に供給されて使用されています。最後に他のモデルオプションをリストします。
エンコーディング y
Keras でマルチクラス分類を行うには、通常、可能なカテゴリの数 (ケースで可能な POS タグの数) と同じだけ、ラベルがワンホット ベクトルであることを期待する categorical_crossentropy を使用します。keras のto_categoricalを使用できます。各整数がクラスを表す整数のベクトルを想定していることに注意してください (たとえば、NNP は 0、VBD は 1 など)。
def to_categorical(y, nb_classes=None):
'''Convert class vector (integers from 0 to nb_classes) to binary class matrix, for use with categorical_crossentropy.
# Arguments
y: class vector to be converted into a matrix
nb_classes: total number of classes
# Returns
A binary matrix representation of the input.
'''
モデルオプション
この一連のソリューションでは、基本的にマルチクラス分類を行うことになるため、基本的にはimdb_として取得できますkeras の例の例に従ってください。これらは、実際にはバイナリ テキスト分類の例です。それらをマルチクラスにするには、最終アクティベーション関数としてシグモイドの代わりにソフトマックスを使用し、 mnist_の例のように binary_crossentropy の代わりに categorical_crossentropy を使用する必要があります。
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])