情感傾向分析針對(duì)帶有主觀描述的中文文本腰吟,可自動(dòng)判斷該文本的情感極性類別并給出相應(yīng)的置信度汰聋。情感類型分為積極门粪、消極、中性烹困。情感傾向分析能夠幫助企業(yè)理解用戶消費(fèi)習(xí)慣玄妈、分析熱點(diǎn)話題和危機(jī)輿情監(jiān)控,為企業(yè)提供有力的決策支持髓梅。
上一次的介紹中我們講解了情感分析的作用以及應(yīng)用場(chǎng)景拟蜻,技術(shù)難點(diǎn)以及百度Senta?系統(tǒng)對(duì)這些問(wèn)題的解決方法以及核心技術(shù)。本次的介紹我們則側(cè)重于實(shí)踐枯饿,即利用百度深度學(xué)習(xí)框架PaddlePaddle Fluid,?實(shí)戰(zhàn)Senta?系統(tǒng)酝锅。
Senta?是百度開(kāi)源的情感分析(Sentiment Analysis)?系統(tǒng),項(xiàng)目的github?地址是(https://github.com/baidu/Senta)奢方,Senta?也為百度AI?開(kāi)放平臺(tái)(http://ai.baidu.com/tech/nlp/sentiment_classify)提供了情感傾向分析模塊搔扁,供用戶直接使用。
此次我們將講解如何本地構(gòu)建Senta,?利用PaddlePaddle Fluid深度學(xué)習(xí)框架來(lái)實(shí)現(xiàn)情感分析模型的訓(xùn)練和部署蟋字。
實(shí)驗(yàn)環(huán)境準(zhǔn)備:安裝PaddlePaddle Fluid
運(yùn)行本目錄下的程序示例需要使用PaddlePaddle Fluid v1.1/1.2?版本稿蹲。
使用pip?安裝最新穩(wěn)定版
# Linux CPU
pip install paddlepaddle
# Linux GPU cuda9cudnn7
pip install paddlepaddle-gpu
# Linux GPU cuda8cudnn7
pip install paddlepaddle-gpu==1.1.0.post87
# Linux GPU cuda8cudnn5
pip install paddlepaddle-gpu==1.1.0.post85
更詳細(xì)的whl包列表也可以參見(jiàn)whl?包列表.
如果需要安裝最新的開(kāi)發(fā)版,請(qǐng)按照安裝文檔中的說(shuō)明更新PaddlePaddle Fluid?版本鹊奖。
Senta?代碼結(jié)構(gòu)
Senta?項(xiàng)目的代碼結(jié)構(gòu)以及簡(jiǎn)介如下苛聘,本文重點(diǎn)介紹如何利用FluidPython?API完成模型的構(gòu)建和訓(xùn)練,關(guān)于如何利用Fluid?C-API進(jìn)行模型的在線部署忠聚,可以參考該項(xiàng)目的說(shuō)明文檔设哗。
Senta
├── C-API/?#?
模型預(yù)測(cè)C-API接口
├── data/?#?
數(shù)據(jù)集
│?? ├── test_data/
│?? │?? └── corpus.test
│?? ├── train_data/
│?? │?? └── corpus.train
│?? └── train.vocab
├── eval.sh???????????????#?
模型評(píng)價(jià)腳本
├── infer.sh?#?
模型預(yù)測(cè)腳本
├── nets.py?
?#?本例中涉及的各種網(wǎng)絡(luò)結(jié)構(gòu)均定義在此文件中,│?#?若進(jìn)一步修改模型結(jié)構(gòu)两蟀,請(qǐng)查看此文件
├── README.md?#?
說(shuō)明文檔
├── sentiment_classify.py?#?
情感傾向分析主函數(shù)熬拒,包括訓(xùn)練、預(yù)估垫竞、預(yù)測(cè)│?#?部分
├── train.sh?#?
模型訓(xùn)練腳本
└── utils.py?#?
定義通用的函數(shù)澎粟,例如加載詞典,讀入數(shù)據(jù)等
nets.py?中包含以下幾個(gè)模型:
??????????bow_net:Bow(Bag Of Words)?模型欢瞪,是一個(gè)非序列模型活烙。使用基本的全連接結(jié)構(gòu)。
??????????cnn_net:淺層CNN?模型遣鼓,是一個(gè)基礎(chǔ)的序列模型啸盏,能夠處理變長(zhǎng)的序列輸入,提取一個(gè)局部區(qū)域之內(nèi)的特征骑祟。
??????????gru_net:?jiǎn)螌覩RU?模型回懦,序列模型气笙,能夠較好地解序列文本中長(zhǎng)距離依賴的問(wèn)題。
??????????lstm_net:?jiǎn)螌覮STM?模型怯晕,序列模型潜圃,能夠較好地解決序列文本中長(zhǎng)距離依賴的問(wèn)題。
??????????bilstm_net:雙向單層LSTM?模型舟茶,序列模型谭期,通過(guò)采用雙向lstm結(jié)構(gòu),更好地捕獲句子中的語(yǔ)義特征吧凉。百度AI?平臺(tái)上情感傾向分析模塊采用此模型進(jìn)行訓(xùn)練和預(yù)測(cè)隧出。
訓(xùn)練數(shù)據(jù)格式是制表符分隔值(tsv)?的格式,每一行代表一條訓(xùn)練數(shù)據(jù)阀捅,以制表符作為分割符分為兩個(gè)字段胀瞪。第一個(gè)字段是情感傾向,取值為0?或1饲鄙,分別代表消極和積極情感傾向凄诞;第二個(gè)字段是文本的內(nèi)容。文本已經(jīng)經(jīng)過(guò)分詞處理傍妒,詞與詞之間用空格分隔幔摸。示例訓(xùn)練樣本如下:
0?方向盤(pán)向左稍有偏斜- - - -?上四輪定位調(diào)整兩次OK?摸柄。價(jià)格80元颤练,4S?要300多元,立馬和他說(shuō)
0?
人非常多驱负,團(tuán)購(gòu)的平日票嗦玖,本來(lái)以為人會(huì)少點(diǎn),沒(méi)想到人山人海跃脊。有些項(xiàng)目小孩不能玩宇挫,小孩對(duì)造浪池比較感興趣,其它真沒(méi)什么可玩的酪术。
0?
環(huán)境口味我都很滿意器瘪,可是那服務(wù)態(tài)度還真不能讓人恭維!生意好也不能降低服務(wù)態(tài)度绘雁!味道再美味我消費(fèi)的時(shí)候還要受氣的話我也不會(huì)再去消費(fèi)了橡疼!
1?
國(guó)恥,不忘歷史庐舟。
?測(cè)試數(shù)據(jù)以同樣的方式進(jìn)行分隔欣除,但在情感類別標(biāo)簽方面和訓(xùn)練數(shù)據(jù)有一些差別。測(cè)試數(shù)據(jù)中情感傾向共有三類挪略,取值為0, 1, 2,?分別代表消極历帚,中性滔岳,積極。在模型的預(yù)測(cè)階段挽牢,我們利用模型輸出樣例為積極和消極的概率谱煤,如果用于二分類,只要積極的概率比消極的概率高卓研,就歸入積極趴俘;而如果用于三分類,則在中間加入了中性奏赘,分類的依據(jù)是寥闪,樣例為積極的概率小于45%?則為消極,大于55%?則為積極磨淌,介于二者之間則為中性疲憋,用戶也可以根據(jù)需要調(diào)整中型情感的概率閾值。示例測(cè)試樣本如下所示:
2?空間是可以了梁只,后面坐三個(gè)170斤的人也不嫌擠缚柳,但矮了點(diǎn),后備箱給力
1?
滿分是10分的話搪锣,性價(jià)比給8.5分吧秋忙!綜合油耗偏高,如果開(kāi)市區(qū)的就不太合算了构舟。
0?
后排中間的突起太高灰追,中間坐人不好放腳。
1?
一般狗超,家用還可以弹澎。
因?yàn)樯疃葘W(xué)習(xí)模型的需要,需要把每一個(gè)詞對(duì)應(yīng)地轉(zhuǎn)化為一個(gè)整數(shù)努咐,為此要根據(jù)訓(xùn)練數(shù)據(jù)構(gòu)建一個(gè)詞典苦蒿。而且還可以根據(jù)詞典對(duì)詞典的大小進(jìn)行限制。這里使用的詞典文件格式非常簡(jiǎn)單渗稍,每行代表詞典中的一個(gè)詞佩迟。以下是詞典的示例:
喜歡特臟兮兮
...
注:我們?cè)赿ata目錄下,提供了示例詞典數(shù)據(jù)竿屹,詳見(jiàn)data/train.vocab.
關(guān)于詞典構(gòu)建的功能报强,參見(jiàn)utils.py中的prepare_data(data_path, word_dict_path, batch_size, mode)函數(shù),詞典加載的功能羔沙,參見(jiàn)utils.py中的load_vocab(file_path)函數(shù)躺涝。
因?yàn)閷?shí)際使用的數(shù)據(jù)比較大,github?項(xiàng)目中僅自帶了一份小的示例數(shù)據(jù),如果需要使用自定義的數(shù)據(jù)坚嗜,將訓(xùn)練和測(cè)試需要用的語(yǔ)料處理成符合上述要求的格式夯膀,存放為data/train_data/corpus.train和data/test_data/corpus.test即可。
模型的訓(xùn)練苍蔬,評(píng)價(jià)和預(yù)測(cè)都集成在sentiment_classify.py文件里诱建,默認(rèn)使用的模型是bilstm_net雙向LSTM?模型。默認(rèn)使用cpu?進(jìn)行模型訓(xùn)練碟绑,但還可以支持使用gpu俺猿,通過(guò)--use_gpu True打開(kāi)。另外格仲,訓(xùn)練還支持并行押袍,通過(guò)--is_parallel參數(shù)設(shè)置。
具體支持的參數(shù)可以通過(guò)python sentisentiment_classify.py --help查看凯肋。
python sentiment_classify.py \
???--train_data_path ./data/train_data/corpus.train \?#?
訓(xùn)練數(shù)據(jù)路徑
???--word_dict_path ./data/train.vocab \?#?
詞典路徑
???--mode train \????# train
模式
???--model_path ./models?#?
模型保存路徑
使用GPU?的訓(xùn)練腳本
export CUDA_VISIBLE_DEVICES=0,1?#?指定可用的GPU?序號(hào)
python sentiment_classify.py \
???--train_data_path ./data/train_data/corpus.train \??????#?
訓(xùn)練數(shù)據(jù)路徑
???--word_dict_path ./data/train.vocab \?#?
詞典路徑
???--mode train \?# train
模式
???--model_path ./models?#?
模型保存路徑
???--use_gpu True?????????????????????????#?
使用GPU?訓(xùn)練模型
???--is_parallel True?#?
使用并行
執(zhí)行后可以看到如下的輸出:一共對(duì)訓(xùn)練語(yǔ)料進(jìn)行了10?次迭代谊惭,并且輸出了在測(cè)試數(shù)據(jù)集上的準(zhǔn)確率和平均cost.
[train info]: pass_id: 0, avg_acc: 0.821615, avg_cost: 0.388542
[train info]: pass_id: 1, avg_acc: 0.960837, avg_cost: 0.122814
[train info]: pass_id: 2, avg_acc: 0.987280, avg_cost: 0.052349
[train info]: pass_id: 3, avg_acc: 0.994591, avg_cost: 0.024470
[train info]: pass_id: 4, avg_acc: 0.997796, avg_cost: 0.012553
[train info]: pass_id: 5, avg_acc: 0.998197, avg_cost: 0.008723
[train info]: pass_id: 6, avg_acc: 0.999599, avg_cost: 0.003929
[train info]: pass_id: 7, avg_acc: 0.999700, avg_cost: 0.002423
[train info]: pass_id: 8, avg_acc: 0.999900, avg_cost: 0.001672
[train info]: pass_id: 9, avg_acc: 0.999900, avg_cost: 0.001001
也可以直接使用目錄下的train.sh?根據(jù)需要進(jìn)行修改。
python sentiment_classify.py \
???--test_data_path ./data/test_data/corpus.test \?#?
測(cè)試數(shù)據(jù)路徑
???--word_dict_path ./data/train.vocab \?#?
詞典路徑
???--mode eval \?# eval
模式
???--model_path ./models/epoch9/?#?
預(yù)測(cè)模型路徑
可以看到類似如下的輸出
[test info] model_path: ./models/epoch9/, class2_acc: 0.828402, class3_acc: 0.710000
說(shuō)明模型能夠完成情感分類任務(wù)侮东,只是因?yàn)槭纠龜?shù)據(jù)集太小圈盔,過(guò)擬合比較明顯,在訓(xùn)練數(shù)據(jù)集上準(zhǔn)確率可以達(dá)到99.9%,?而測(cè)試數(shù)據(jù)集上的二分類準(zhǔn)確率只有82.8%.?用戶可以通過(guò)使用自定義的更大的數(shù)據(jù)集悄雅,以及調(diào)整模型超參數(shù)以獲得更好的效果驱敲。
python sentiment_classify.py \
???--test_data_path ./data/test_data/corpus.test \?#?
測(cè)試數(shù)據(jù)路徑
???--word_dict_path ./data/train.vocab \??????????????????????#?
詞典路徑
???--mode infer \?# infer
模式
???--model_path ./models/epoch9/?#?
預(yù)測(cè)模型路徑
即可執(zhí)行預(yù)測(cè),可以得到類似如下的輸出
predict label: 0, pos_prob: 0.004343, neg_prob: 0.995657
predict label: 2, pos_prob: 0.798888, neg_prob: 0.201112
predict label: 0, pos_prob: 0.000564, neg_prob: 0.999436
predict label: 0, pos_prob: 0.024923, neg_prob: 0.975077
predict label: 2, pos_prob: 0.999526, neg_prob: 0.000474
predict label: 2, pos_prob: 0.994914, neg_prob: 0.005086
predict label: 0, pos_prob: 0.065424, neg_prob: 0.934576
predict label: 0, pos_prob: 0.000119, neg_prob: 0.999881
predict label: 0, pos_prob: 0.000709, neg_prob: 0.999291
predict label: 2, pos_prob: 0.986198, neg_prob: 0.013802
.......
可以觀察模型對(duì)于每一個(gè)樣例的預(yù)測(cè)結(jié)果和詳細(xì)情況宽闲。
上述的實(shí)驗(yàn)中众眨,使用的訓(xùn)練和測(cè)試語(yǔ)料都已經(jīng)經(jīng)過(guò)分詞處理,并且都被人工標(biāo)了情感極性標(biāo)簽便锨,用于訓(xùn)練和評(píng)價(jià)模型的能力围辙,但是在實(shí)際應(yīng)用中我碟,面對(duì)的語(yǔ)料都是生語(yǔ)料放案,比如線上商品的評(píng)價(jià)信息,并沒(méi)有經(jīng)過(guò)分詞之類的處理矫俺。這種情況下需要預(yù)先對(duì)語(yǔ)料進(jìn)行加工處理吱殉,百度也開(kāi)源了詞法分析提供工具LAC。
在本工程目錄的C-API目錄下厘托,就有調(diào)用LAC?進(jìn)行分詞并且結(jié)合上述模型完成情感分析所需的文件友雳,將分詞處理和情感分析集成在一起。具體的使用方法铅匹,可以進(jìn)一步參考Senta?項(xiàng)目的說(shuō)明文檔,?以及LAC?項(xiàng)目的說(shuō)明文檔.