双方向 LSTM モデルは、テキスト分類に使用されるニューラル ネットワークです。以下は、テキスト分類タスクに双方向 LSTM を使用する方法を示す簡単な例です。
まず、必要なライブラリとモジュールをインポートする必要があります:
import os import numpy as np from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.models import Sequential from keras.layers import Dense, Embedding, Bidirectional, LSTM from sklearn.model_selection import train_test_split
次に、データセットを準備する必要があります。ここでは、データ セットが指定されたパスにすでに存在し、train.txt、dev.txt、test.txt の 3 つのファイルが含まれていると仮定します。各ファイルには、一連のテキストと対応するタグが含まれています。次のコードを使用してデータセットをロードできます:
def load_imdb_data(path): assert os.path.exists(path) trainset, devset, testset = [], [], [] with open(os.path.join(path, "train.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) trainset.append((sentence, sentence_label)) with open(os.path.join(path, "dev.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) devset.append((sentence, sentence_label)) with open(os.path.join(path, "test.txt"), "r") as fr: for line in fr: sentence_label, sentence = line.strip().lower().split("\t", maxsplit=1) testset.append((sentence, sentence_label)) return trainset, devset, testset
データセットをロードした後、テキストを前処理してシリアル化できます。ここでは、テキストのセグメンテーションに Tokenizer を使用し、LSTM モデルに適用できるように、各単語のインデックス シーケンスを同じ長さにパディングします。
max_features = 20000 maxlen = 80 # cut texts after this number of words (among top max_features most common words) batch_size = 32 print('Pad & split data into training set and dev set') x_train, y_train = [], [] for sent, label in trainset: x_train.append(sent) y_train.append(label) x_train, y_train = pad_sequences(x_train, maxlen=maxlen), np.array(y_train) x_train, y_train = np.array(x_train), np.array(y_train) x_dev, y_dev = [], [] for sent, label in devset: x_dev.append(sent) y_dev.append(label) x_dev, y_dev = pad_sequences(x_dev, maxlen=maxlen), np.array(y_dev) x_dev, y_dev = np.array(x_dev), np.array(y_dev)
次に、双方向 LSTM モデルを構築できます。このモデルでは、2 つの LSTM 層を使用します。1 つは情報を前方に渡し、もう 1 つは情報を逆方向に渡します。これら 2 つの LSTM 層の出力は連結されて、テキストを表すより強力なベクトルを形成します。最後に、分類に全結合層を使用します。
print('Build model...') model = Sequential() model.add(Embedding(max_features, 128, input_length=maxlen)) model.add(Bidirectional(LSTM(64))) model.add(LSTM(64)) model.add(Dense(1, activation='sigmoid')) print('Compile model...') model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
これで、モデルをトレーニングできます。開発データセットを検証データとして使用して、トレーニング中にオーバーフィットしないことを確認します。
epochs = 10 batch_size = 64 history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_dev, y_dev))
トレーニングが完了したら、テスト セットでモデルのパフォーマンスを評価できます。
test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc)
上記は、双方向 LSTM モデルの単純なテキスト分類の例です。パフォーマンスを向上させるために、レイヤーの数、ニューロンの数、オプティマイザーなどのモデルのパラメーターを調整してみることもできます。または、事前トレーニング済みの単語埋め込み (Word2Vec や GloVe など) を使用して埋め込み層を置き換え、より多くのセマンティック情報を取得します。
以上がテキスト分類に双方向 LSTM モデルを使用するケーススタディの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。