數(shù)據(jù)代碼分享|Python用NLP自然語言處理LSTM神經(jīng)網(wǎng)絡(luò)Twitter推特災(zāi)難文本數(shù)據(jù)、詞云可
全文鏈接:?http://tecdat.cn/?p=28877
原文出處:拓端數(shù)據(jù)部落公眾號
?
作者:Yunfan Zhang?
Twitter是一家美國社交網(wǎng)絡(luò)及微博客服務(wù)的網(wǎng)站,致力于服務(wù)公眾對話。迄今為止,Twitter的日活躍用戶達(dá)1.86億。與此同時,Twitter也已成為突發(fā)緊急情況時人們的重要溝通渠道。由于智能手機(jī)無處不在,人們可以隨時隨地發(fā)布他們正在實時觀察的緊急情況。?因此,越來越多的救災(zāi)組織和新聞機(jī)構(gòu)對通過程序方式監(jiān)視Twitter產(chǎn)生了興趣。但是,我們并不清楚一個用戶在推特上發(fā)布的推文是否是真實的正在發(fā)生的災(zāi)難。舉個例子,用戶發(fā)送了“從正面看昨晚的天空,好像在燃燒一樣?!弊髡呙鞔_使用了“ABLAZE”一詞,但僅僅是為了形容火燒云,并非真正的火焰燃燒。這對于人類來說是顯而易見的,但是對于機(jī)器來說便很難分辨該用戶是否正在預(yù)告真實發(fā)生的火災(zāi)。
解決方案
任務(wù)/目標(biāo)
建立一個預(yù)測推文發(fā)布災(zāi)難真實性的機(jī)器學(xué)習(xí)模型,該模型可以預(yù)測哪些推文發(fā)布的是真實發(fā)生的災(zāi)難,哪些是虛假的災(zāi)難,從而為相關(guān)組織網(wǎng)絡(luò)監(jiān)測災(zāi)難發(fā)生及救援提供幫助。
數(shù)據(jù)源準(zhǔn)備
數(shù)據(jù)集中包含的列:
列名?解釋
id?每條推文的唯一標(biāo)識符
text?推特的內(nèi)容
location?推文發(fā)送的位置(可以為空白)
keyword?推文中的特定關(guān)鍵字(可以為空白)
target?僅在train.csv中存在,表示推文中描述災(zāi)難的真假,真實為1,虛假為0
其中,測試集包含7613個樣本,訓(xùn)練集包含3263個樣本。
加載數(shù)據(jù)并查看
運(yùn)用pandas分別讀取訓(xùn)練集,測試集等。
查看訓(xùn)練集前五行
結(jié)果如下:

查看測試集前五行
結(jié)果如下:

數(shù)據(jù)可視化
首先,運(yùn)用plotly繪制真實虛假災(zāi)難數(shù)量對比的餅圖,該餅圖描述了正例反例在訓(xùn)練樣本中的占比,檢驗數(shù)據(jù)平衡性。
counts_train = train.target.value_counts(sort=False)
labels = counts_train.index
values_train = counts_train.values
#輸入餅圖數(shù)據(jù)
data = go.Pie(labels=labels, values=values_train ,pull=[0.03, 0])
運(yùn)行結(jié)果如下:

由餅圖可知,在訓(xùn)練集中,災(zāi)難真實發(fā)生的樣本(1)共有3271個,占總體的43%,非真實發(fā)生的樣本(0)有4342個,占總體的57%。總體來說比例較為均衡,可以進(jìn)行后續(xù)建模。
然后,為了進(jìn)一步了解災(zāi)難推文的大致內(nèi)容,本文利用wordcloud繪制推文的內(nèi)容的詞云。
首先自行將一些網(wǎng)絡(luò)常用詞加入停用詞表。
然后定義繪制詞云圖的函數(shù):
#設(shè)置詞云格式并生成詞云
wordcloud = WordCloud(width = 4000, height = 3000, ? ?#寬高
background_color ='white', ? #背景色
stopwords = stopwords, ? ? ? #停用詞
結(jié)果如下:

數(shù)據(jù)清洗
眾所周知,在進(jìn)行建模之前,我們必須首先進(jìn)行數(shù)據(jù)的預(yù)處理,以便于后續(xù)進(jìn)一步處理。因此,本文將進(jìn)行一些基本的網(wǎng)絡(luò)文本清理工作,例如去除網(wǎng)址,去除網(wǎng)絡(luò)標(biāo)簽,刪除標(biāo)點(diǎn)符號,刪除常用表情符號,拼寫矯正等。
1.?刪除網(wǎng)址
2.?刪除HTML標(biāo)簽
3.?刪除表情符號
首先,搜索推特中常用的表情符號,查詢他們的代碼點(diǎn)(https://emojipedia.org/relieved-face/),將需要刪除的表情符號記錄。
5.?拼寫矯正
文本的向量化處理
1.?文本序列化
通過tensorflow自帶的Tokenizer分詞器設(shè)置訓(xùn)練集text中所有詞的索引值,然后將詞映射為其索引值。
然后,查看text中獨(dú)立詞匯的數(shù)量
輸出結(jié)果:Number of unique words: 14666
2.?嵌入GloVe字典
在這里我們將使用GloVe預(yù)訓(xùn)練的語料庫模型來表示我們的單詞。GloVe模型用于進(jìn)行詞的向量化表示,使得向量之間盡可能多地蘊(yùn)含語義和語法的信息。我們需要輸入語料庫,然后通過該模型輸出詞向量。該方法的原理是首先基于語料庫構(gòu)建詞的共現(xiàn)矩陣,然后基于共現(xiàn)矩陣和GloVe模型學(xué)習(xí)詞向量。GloVe語料庫共有3種類型:50D,100D和200 D。在這里我們將使用100D。
3.?匹配GloVe向量
輸出結(jié)果:
100%|██████████| 14666/14666 [00:00<00:00, 599653.57it/s]
(14667, 100)
建立模型
從2014年起,NLP?的主流方法轉(zhuǎn)移到非線性的神經(jīng)網(wǎng)絡(luò)方法,從而輸入也從稀疏高維特征向量變?yōu)榈臀怀砻芴卣飨蛄?。神?jīng)網(wǎng)絡(luò)不僅像傳統(tǒng)機(jī)器學(xué)習(xí)方法一樣學(xué)習(xí)預(yù)測,同時也學(xué)習(xí)如何正確表達(dá)數(shù)據(jù),即在處理輸入輸出對時,網(wǎng)絡(luò)內(nèi)部產(chǎn)生一系列轉(zhuǎn)化以處理輸入數(shù)據(jù)來預(yù)測輸出數(shù)據(jù)。
因此,本次建模以神經(jīng)網(wǎng)絡(luò)為基礎(chǔ),設(shè)置了Embedding層,Dropout層,LSTM層,以及全連接層。
1.?定義模型函數(shù)
導(dǎo)入神經(jīng)網(wǎng)絡(luò)相關(guān)庫后定義模型函數(shù)。
#嵌入層
model.add(Embedding(input_dim=num_words,
output_dim=100,
embeddings_initializer=initializers.Constant
添加Embedding層以初始化GloVe模型訓(xùn)練出的權(quán)重矩陣。input_dim即詞匯量,輸入數(shù)組中的詞典大小是14666,即有14666個不同的詞,所以我的input_dim便要比14666要大1,output_dim是密集嵌入的尺寸,就如同CNN最后的全連接層一樣,上面設(shè)置的100,便將每一個詞變?yōu)橛?x100來表示的向量,embeddings_initializer為嵌入矩陣的初始化的方法,為預(yù)定義初始化方法名的字符串,或用于初始化權(quán)重的初始化器。輸入序列的長度設(shè)置為序列長度20,將每個text表示為一個20×100的矩陣
由于文本數(shù)據(jù)的連續(xù)性,我們添加LSTM層。LSTM是作為短期記憶的解決方案而創(chuàng)建的長短期記憶模型,和RNN類似,只是當(dāng)詞向量作為輸入進(jìn)入神經(jīng)元后,神經(jīng)元會按照某種方式對該詞向量的信息進(jìn)行選擇,存儲成新的信息,輸入到相鄰的隱藏層神經(jīng)元中去。
輸出結(jié)果:

2.?參數(shù)選擇與調(diào)優(yōu)
本文運(yùn)用交叉驗證的方法得到驗證集精度,并以此為標(biāo)準(zhǔn),使用網(wǎng)格搜索來確定最優(yōu)超參數(shù)。
Scikit-Learn里有一個API?為model.selection.GridSearchCV,可以將keras搭建的模型傳入,作為sklearn工作流程一部分。因此,我們運(yùn)用此函數(shù)來包裝keras模型以便在scikit-learn中使用keras。
3.?模型訓(xùn)練
輸出結(jié)果:

輸出結(jié)果:

由訓(xùn)練過程可知,驗證集準(zhǔn)確率最高的參數(shù)組合為第五次訓(xùn)練時的參數(shù),batch_size=10 ,epochs=10。
4.?模型評估
查看最終參數(shù)選擇的結(jié)果和交叉驗證的結(jié)果:
輸出結(jié)果:
交叉驗證平均準(zhǔn)確率:?0.7921975544580065
最好的參數(shù)模型:?{‘batch_size’: 10, ‘nb_epoch’: 10}
5.?與傳統(tǒng)機(jī)器學(xué)習(xí)模型對比
將train中訓(xùn)練集數(shù)據(jù)劃分為訓(xùn)練集和驗證集,然后對比其在驗證集上的準(zhǔn)確率。
分別使用SVM,KNN,多層感知器,樸素貝葉斯,隨機(jī)森林,GBDT等方法構(gòu)建模型,與神經(jīng)網(wǎng)絡(luò)進(jìn)行對比。
輸出結(jié)果:
模型1驗證集準(zhǔn)確率: 0.6250820748522653
模型2驗證集準(zhǔn)確率: 0.5843729481286933
模型3驗證集準(zhǔn)確率: 0.5384110308601444
模型4驗證集準(zhǔn)確率: 0.4799737360472751
模型5驗證集準(zhǔn)確率: 0.6323046618516087
模型6驗證集準(zhǔn)確率: 0.6401838476690742
以上模型的驗證集準(zhǔn)確率與神經(jīng)網(wǎng)絡(luò)的驗證集準(zhǔn)確率相比差別較大,可見本文基于神經(jīng)網(wǎng)絡(luò)的文本預(yù)測模型是相對準(zhǔn)確且可靠的。
結(jié)果預(yù)測
我們繼續(xù)通過上述步驟構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型預(yù)測test測試集中的target列。
#預(yù)測
predictions = grid_result.predict(testing_padded)
submission['target'] = (predictions > 0.5).astype(int)
輸出結(jié)果:

項目結(jié)果

真實虛假樣本比例接近1:1.

災(zāi)難相關(guān)推文中提到最多的詞匯是fire。

最好的參數(shù)組合是batch_size=10 ,epochs=10。

將測試集輸入模型得到最終預(yù)測結(jié)果。
關(guān)于作者

在此對Yunfan Zhang?對本文所作的貢獻(xiàn)表示誠摯感謝,她專長機(jī)器學(xué)習(xí),概率論與數(shù)理統(tǒng)計。
?

最受歡迎的見解
1.R語言實現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸
2.r語言實現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測和結(jié)果可視化
3.python用遺傳算法-神經(jīng)網(wǎng)絡(luò)-模糊邏輯控制算法對樂透分析
4.R語言結(jié)合新冠疫情COVID-19股票價格預(yù)測:ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時間序列分析
5.Python TensorFlow循環(huán)神經(jīng)網(wǎng)絡(luò)RNN-LSTM神經(jīng)網(wǎng)絡(luò)預(yù)測股票市場價格時間序列和MSE評估準(zhǔn)確性
6.Matlab用深度學(xué)習(xí)長短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對文本數(shù)據(jù)進(jìn)行分類
7.用于NLP的seq2seq模型實例用Keras實現(xiàn)神經(jīng)機(jī)器翻譯
8.R語言用FNN-LSTM假近鄰長短期記憶人工神經(jīng)網(wǎng)絡(luò)模型進(jìn)行時間序列深度學(xué)習(xí)預(yù)測
9.Python用RNN循環(huán)神經(jīng)網(wǎng)絡(luò):LSTM長期記憶、GRU門循環(huán)單元、回歸和ARIMA對COVID-19新冠疫情新增人數(shù)時間序列預(yù)測