首頁 > 科技週邊 > 人工智慧 > 利用雙向LSTM模型進行文本分類的案例

利用雙向LSTM模型進行文本分類的案例

PHPz
發布: 2024-01-24 10:36:06
轉載
770 人瀏覽過

利用雙向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。每個文件中包含一系列文字和對應的標籤。我們可以使用以下程式碼載入資料集:

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模型。在這個模型中,我們使用兩個LSTM層,一個正向傳遞訊息,一個反向傳遞訊息。這兩個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'])
登入後複製

現在,我們可以訓練模型了。我們將使用dev資料集作為驗證數據,以確保我們在訓練過程中不會過度擬合。

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中文網其他相關文章!

相關標籤:
來源:163.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板