0
本文作者: AI研習(xí)社-譯站 | 2018-06-21 16:03 |
雷鋒網(wǎng)按:本文為雷鋒網(wǎng)字幕組編譯的技術(shù)博客,原標(biāo)題 Advances in Semantic Textual Similarity,作者為 Google AI 的軟件工程師與技術(shù)主管 Yinfei Yang。
翻譯 | 陳濤 整理 | 孔令雙
原文鏈接:
https://towardsdatascience.com/a-beginners-guide-on-sentiment-analysis-with-rnn-9e100627c02e
圖片來源:Unsplash
情感分析可能是最常見的 自然語言處理 的應(yīng)用之一。我無需去額外強(qiáng)調(diào)在客服工具中情感分析的重要性。本文將利用循環(huán)神經(jīng)網(wǎng)絡(luò),訓(xùn)練出一個(gè)基于 IMDB 數(shù)據(jù)集的電影評論分類器。如果你想了解更多關(guān)于深度學(xué)習(xí)在情感分析中的應(yīng)用,這里推薦一篇很棒的論文。
我們將采用循環(huán)神經(jīng)網(wǎng)絡(luò),具體地說應(yīng)該是 LSTM,去實(shí)現(xiàn)基于 Keras 的情感分析。Keras 已經(jīng)將 IMBD 電影評論數(shù)據(jù)內(nèi)置其中,我們可以很方便地調(diào)用。
from keras.datasets import imdb
設(shè)置詞匯量的總數(shù),并加載訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。
vocabulary_size = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = vocabulary_size)
print('Loaded dataset with {} training samples, {} test samples'.format(len(X_train), len(X_test)))
加載完的數(shù)據(jù)擁有 25000 個(gè)訓(xùn)練樣本和 25000 個(gè)測試樣本。
查看一條評論樣本及其標(biāo)簽。
print('---review---')
print(X_train[6])
print('---label---')
print(y_train[6])
圖 1
請注意,評論是以一串整數(shù)的形式進(jìn)行存儲的,它們表示預(yù)先分配給每個(gè)詞語的 ID。標(biāo)簽則用一個(gè)整數(shù)表示,0 代表消極的評價(jià),1 代表積極的評價(jià)。
我們可以利用imdb.get_word_index()函數(shù)返回的字典,從而將評論映射回原有的文字。
word2id = imdb.get_word_index()
id2word = {i: word for word, i in word2id.items()}
print('---review with words---')
print([id2word.get(i, ' ') for i in X_train[6]])
print('---label---')
print(y_train[6])
圖 2
查看最長的評論長度和最短的評論長度。
print('Maximum review length: {}'.format(
len(max((X_train + X_test), key=len))))
最長的評論長度為 2697 個(gè)詞
print('Minimum review length: {}'.format(
len(min((X_test + X_test), key=len))))
最短的評論長度為 14 個(gè)詞
為了讓數(shù)據(jù)能夠輸入 RNN 模型,所有的輸入文檔必須有相同的長度。我們需要設(shè)置max_words變量來限制評論的最大長度,超過該長度的評論將被截?cái)?,不足該長度的評論將被填充空值(0)。在 Keras 中,我們可以使用pad_sequences()函數(shù)來達(dá)到此目標(biāo)?,F(xiàn)在設(shè)置max_words變量的值為 500。
from keras.preprocessing import sequence
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)
我們開始在下面的代碼單元中創(chuàng)建模型架構(gòu)。我們已經(jīng)從 Keras 中導(dǎo)入了一些你可能會用到的網(wǎng)絡(luò)層,當(dāng)然你也可以使用任何你喜歡的網(wǎng)絡(luò)層或者轉(zhuǎn)換器。
記住,我們的輸入是一串詞語,從學(xué)術(shù)上講,是整數(shù)形式的詞語 ID,其最大長度等于max_words變量值。而我們的輸出是二進(jìn)制形式的情感標(biāo)簽(0 或 1)。
from keras import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout
embedding_size=32
model=Sequential()
model.add(Embedding(vocabulary_size, embedding_size, input_length=max_words))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())
圖 3
總結(jié)一下,我們創(chuàng)建了一個(gè)簡單的 RNN 模型,其擁有一個(gè)嵌入層,一個(gè) LSTM 層和一個(gè)全連接層。這其中一共有 233301 個(gè)待訓(xùn)練的參數(shù)。
我們需要先對模型進(jìn)行編譯,包括指定損失函數(shù),訓(xùn)練中想采用的優(yōu)化器和用于測量的評價(jià)指標(biāo)。設(shè)置好合適的參數(shù),其中包含至少一個(gè)度量指標(biāo):準(zhǔn)確率。
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
編譯完成后,就可以開啟訓(xùn)練過程了。我們需要指定兩個(gè)很重要的訓(xùn)練參數(shù):每一批量中的樣本數(shù)和訓(xùn)練迭代次數(shù),它們和我們的模型架構(gòu)一起決定了總體的訓(xùn)練時(shí)間。
訓(xùn)練可能需要一段時(shí)間,所以可以去喝杯咖啡,或者更好地去跑會步吧。
batch_size = 64
num_epochs = 3
X_valid, y_valid = X_train[:batch_size], y_train[:batch_size]
X_train2, y_train2 = X_train[batch_size:], y_train[batch_size:]
model.fit(X_train2, y_train2, validation_data=(X_valid, y_valid), batch_size=batch_size, epochs=num_epochs)
圖 4
訓(xùn)練完成后,接下來就可以看下模型在未處理過的測試數(shù)據(jù)上的表現(xiàn)了。
我們設(shè)置了metrics=['accuracy'],scores[1]就代表此次評估的準(zhǔn)確率。
scores = model.evaluate(X_test, y_test, verbose=0)
print('Test accuracy:', scores[1])
測試準(zhǔn)確率為 0.86964
創(chuàng)建模型的方法有很多種。我們可以嘗試不同的架構(gòu),網(wǎng)絡(luò)層及參數(shù),從而不斷提高模型的準(zhǔn)確率。在這一過程中,我們可以思考,在避免消耗長時(shí)間訓(xùn)練的前提下,我們還能做怎樣的提升?我們應(yīng)該如何避免過擬合?
本文的代碼可以從 Github 上下載。非常期待能聽到大家的反饋和問題。
雷鋒網(wǎng)字幕組編譯。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。