PaddlePaddle Fluid實(shí)戰(zhàn):使用百度Senta 情感分析系統(tǒng)

情感傾向分析針對(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è)隧出。


數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)格式

訓(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?

一般狗超,家用還可以弹澎。

訓(xùn)練數(shù)據(jù)詞典構(gòu)建

因?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ù)躺涝。

使用自定義數(shù)據(jù)

因?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)練與預(yù)測(cè)

模型的訓(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查看凯肋。

模型訓(xùn)練

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)行修改。

模型評(píng)價(jià)

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ù)以獲得更好的效果驱敲。

模型預(yù)測(cè)

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ì)情況宽闲。

擴(kuò)展:處理未經(jīng)加工的原始語(yǔ)料

上述的實(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ō)明文檔.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末押赊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子包斑,更是在濱河造成了極大的恐慌流礁,老刑警劉巖涕俗,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異神帅,居然都是意外死亡再姑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)找御,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)元镀,“玉大人,你說(shuō)我怎么就攤上這事霎桅∑芤桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵滔驶,是天一觀的道長(zhǎng)蔽挠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瓜浸,這世上最難降的妖魔是什么澳淑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮插佛,結(jié)果婚禮上杠巡,老公的妹妹穿的比我還像新娘。我一直安慰自己雇寇,他們只是感情好氢拥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锨侯,像睡著了一般嫩海。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上囚痴,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天叁怪,我揣著相機(jī)與錄音,去河邊找鬼深滚。 笑死奕谭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痴荐。 我是一名探鬼主播血柳,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼生兆!你這毒婦竟也來(lái)了难捌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎根吁,沒(méi)想到半個(gè)月后昆汹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婴栽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年满粗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愚争。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡映皆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轰枝,到底是詐尸還是另有隱情捅彻,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布鞍陨,位于F島的核電站步淹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诚撵。R本人自食惡果不足惜缭裆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寿烟。 院中可真熱鬧澈驼,春花似錦、人聲如沸筛武。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徘六。三九已至内边,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間待锈,已是汗流浹背漠其。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炉擅,地道東北人辉懒。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓阳惹,卻偏偏與公主長(zhǎng)得像谍失,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莹汤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容