拓端tecdat|Matlab用深度學(xué)習(xí)長短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對文本數(shù)據(jù)進(jìn)行分類
原文鏈接:http://tecdat.cn/?p=23151?
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
?這個(gè)例子展示了如何使用深度學(xué)習(xí)長短期記憶(LSTM)網(wǎng)絡(luò)對文本數(shù)據(jù)進(jìn)行分類。
文本數(shù)據(jù)是有順序的。一段文字是一個(gè)詞的序列,它們之間可能有依賴關(guān)系。為了學(xué)習(xí)和使用長期依賴關(guān)系來對序列數(shù)據(jù)進(jìn)行分類,可以使用LSTM神經(jīng)網(wǎng)絡(luò)。LSTM網(wǎng)絡(luò)是一種遞歸神經(jīng)網(wǎng)絡(luò)(RNN),可以學(xué)習(xí)序列數(shù)據(jù)的時(shí)間順序之間的長期依賴關(guān)系。
要向LSTM網(wǎng)絡(luò)輸入文本,首先要將文本數(shù)據(jù)轉(zhuǎn)換成數(shù)字序列。你可以使用單詞編碼來實(shí)現(xiàn)這一點(diǎn),該編碼將文件映射為數(shù)字指數(shù)的序列。為了獲得更好的結(jié)果,還可以在網(wǎng)絡(luò)中加入一個(gè)詞嵌入層。詞匯嵌入將詞匯映射為數(shù)字向量,而不是標(biāo)量索引。這些嵌入發(fā)現(xiàn)了單詞的語義細(xì)節(jié),因此具有相似含義的單詞具有相似的向量。它們還通過向量算術(shù)來模擬單詞之間的關(guān)系。例如,"羅馬之于意大利就像巴黎之于法國 "的關(guān)系由方程式意大利-羅馬+巴黎=法國來描述。
在這個(gè)例子中,訓(xùn)練和使用LSTM網(wǎng)絡(luò)有四個(gè)步驟。
導(dǎo)入并預(yù)處理數(shù)據(jù)。
使用單詞編碼將單詞轉(zhuǎn)換為數(shù)字序列。
創(chuàng)建并訓(xùn)練一個(gè)帶有單詞嵌入層的LSTM網(wǎng)絡(luò)。
使用訓(xùn)練好的LSTM網(wǎng)絡(luò)對新的文本數(shù)據(jù)進(jìn)行分類。
導(dǎo)入數(shù)據(jù)
導(dǎo)入工廠報(bào)告數(shù)據(jù)。該數(shù)據(jù)包含對工廠事件的標(biāo)簽化文本描述。要把文本數(shù)據(jù)導(dǎo)入為字符串,指定文本類型為 "字符串"。
head(data)

這個(gè)例子的目的是通過類別欄中的標(biāo)簽對事件進(jìn)行分類。為了將數(shù)據(jù)劃分為類別,將這些標(biāo)簽轉(zhuǎn)換為分類的。?
Category = categorical(Category);
使用直方圖查看數(shù)據(jù)中的類別分布。
figure
histogram(Category);

下一步是將其劃分為訓(xùn)練和驗(yàn)證的集合。將數(shù)據(jù)劃分為一個(gè)訓(xùn)練分區(qū)和一個(gè)用于驗(yàn)證和測試的保留分區(qū)。指定保留的百分比為20%。?
cvp = cv(Category,'Holdout',0.2);
從分區(qū)的表中提取文本數(shù)據(jù)和標(biāo)簽。?
DataTrain = Description;
DataValidation = Description;
為了檢查你是否正確地導(dǎo)入了數(shù)據(jù),可以用詞云來可視化訓(xùn)練文本數(shù)據(jù)。?
wordcloud(DataTrain);

預(yù)處理文本數(shù)據(jù)
創(chuàng)建一個(gè)函數(shù),對文本數(shù)據(jù)進(jìn)行標(biāo)記和預(yù)處理。列在例子末尾的函數(shù)preprocessText,執(zhí)行這些步驟。
?
使用tokenizedDocument對文本進(jìn)行標(biāo)記。
使用lower將文本轉(zhuǎn)換為小寫。
使用 erasePunctuation 擦除標(biāo)點(diǎn)符號(hào)。
對訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)進(jìn)行預(yù)處理。?
Train = preprocessText(DataTrain);
查看最初幾個(gè)預(yù)處理的訓(xùn)練文件。?
documentsTrain(1:5)

將文件轉(zhuǎn)換為序列
為了將文檔輸入到LSTM網(wǎng)絡(luò)中,使用一個(gè)單詞編碼將文檔轉(zhuǎn)換為數(shù)字指數(shù)序列。
創(chuàng)建一個(gè)詞的編碼?
下一個(gè)轉(zhuǎn)換步驟是對文件進(jìn)行填充和截?cái)?,使它們的長度都相同。
要填充和截?cái)辔募?,首先要選擇一個(gè)目標(biāo)長度,然后截?cái)啾人L的文件,左移比它短的文件。為了達(dá)到最佳效果,目標(biāo)長度應(yīng)該很短,而不會(huì)丟棄大量的數(shù)據(jù)。為了找到一個(gè)合適的目標(biāo)長度,可以查看訓(xùn)練文檔長度的直方圖。
histogram(documentLengths)

大多數(shù)的訓(xùn)練文件都少于10個(gè)標(biāo)記。將此作為截?cái)嗪吞畛涞哪繕?biāo)長度。
將文檔轉(zhuǎn)換為數(shù)字索引序列。要截?cái)嗷蛳蜃筇畛湫蛄械拈L度為10,將 "長度 "選項(xiàng)設(shè)置為10。
doc2sequence(enc,'Length');

使用相同的選項(xiàng)將驗(yàn)證文件轉(zhuǎn)換為序列。?
sequence(Length);
創(chuàng)建和訓(xùn)練LSTM網(wǎng)絡(luò)
定義LSTM網(wǎng)絡(luò)結(jié)構(gòu)。為了向網(wǎng)絡(luò)輸入序列數(shù)據(jù),包括一個(gè)序列輸入層,并將輸入大小設(shè)置為1。接下來,包括一個(gè)維度為50的詞嵌入層,詞的數(shù)量與詞的編碼相同。接下來,包括一個(gè)LSTM層,并將隱藏單元的數(shù)量設(shè)置為80。最后,添加一個(gè)與類的數(shù)量相同的全連接層,一個(gè)softmax層,以及一個(gè)分類層。?
inputSize = 1;
Dimension = 50;
HiddenUnits = 80;

指定訓(xùn)練選項(xiàng)
使用Adam優(yōu)化器進(jìn)行訓(xùn)練.
指定一個(gè)16的小批處理量。
每隔一段時(shí)間對數(shù)據(jù)進(jìn)行隨機(jī)化。
通過設(shè)置 "Plots "選項(xiàng)為 "training-progress "來監(jiān)測訓(xùn)練進(jìn)度。
使用'ValidationData'選項(xiàng)指定驗(yàn)證數(shù)據(jù)。
通過將'Verbose'選項(xiàng)設(shè)置為false來抑制輸出。
默認(rèn)情況下,如果有GPU,會(huì)使用GPU(需要并行計(jì)算工具箱?和支持CUDA?的計(jì)算能力3.0以上的GPU)。否則,它將使用CPU。在CPU上訓(xùn)練的時(shí)間可能比在GPU上訓(xùn)練的時(shí)間長很多。?
options('adam', ...
'BatchSize',16, ...
'Shuffle','every-epoch', ...);
訓(xùn)練LSTM網(wǎng)絡(luò)。

使用新數(shù)據(jù)進(jìn)行預(yù)測
對三個(gè)新報(bào)告的事件類型進(jìn)行分類。創(chuàng)建一個(gè)包含新報(bào)告的字符串?dāng)?shù)組。?
使用預(yù)處理步驟對文本數(shù)據(jù)進(jìn)行預(yù)處理,作為訓(xùn)練文檔。?
preprocessText(New);
將文本數(shù)據(jù)轉(zhuǎn)換為序列,選項(xiàng)與創(chuàng)建訓(xùn)練序列時(shí)相同。
sequence(enc,sequenceLength);
使用訓(xùn)練好的LSTM網(wǎng)絡(luò)對新序列進(jìn)行分類。?
classify(XNew)


最受歡迎的見解
1.探析大數(shù)據(jù)期刊文章研究熱點(diǎn)
2.618網(wǎng)購數(shù)據(jù)盤點(diǎn)-剁手族在關(guān)注什么
3.r語言文本挖掘tf-idf主題建模,情感分析n-gram建模研究
4.python主題建??梢暬痩da和t-sne交互式可視化
5.疫情下的新聞數(shù)據(jù)觀察
6.python主題lda建模和t-sne可視化
7.r語言中對文本數(shù)據(jù)進(jìn)行主題模型topic-modeling分析
8.主題模型:數(shù)據(jù)聆聽人民網(wǎng)留言板的那些“網(wǎng)事”
9.python爬蟲進(jìn)行web抓取lda主題語義數(shù)據(jù)分析