ホームページ  >  記事  >  テクノロジー周辺機器  >  テキスト分類に双方向 LSTM モデルを使用するケーススタディ

テキスト分類に双方向 LSTM モデルを使用するケーススタディ

PHPz
PHPz転載
2024-01-24 10:36:06729ブラウズ

テキスト分類に双方向 LSTM モデルを使用するケーススタディ

双方向 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 サイトの他の関連記事を参照してください。

声明:
この記事は163.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。