在天然語言處理中,情感分析通常是指判斷一段文本所表達的情緒狀態。其中,一段文本能夠是一個句子,一個段落或一個文檔。情緒狀態能夠是兩類,如(正面,負面),(高興,悲傷);也能夠是三類,如(積極,消極,中性)等等。 情感分析的應用場景十分普遍,如把用戶在購物網站(亞馬遜、天貓、淘寶等)、旅遊網站、電影評論網站上發表的評論分紅正面評論和負面評論;或爲了分析用戶對於某一產品的總體使用感覺,抓取產品的用戶評論並進行情感分析等等。 今天是5月20日,PaddlePaddle教你用情感分析算法(github.com/PaddlePaddl… 體會女神心意。在下文中,咱們將以情感分析爲例,介紹使用深度學習的方法進行端對端的短文本分類,並使用PaddlePaddle完成所有相關實驗。git
1、應用背景github
在天然語言處理中,情感分析屬於典型的文本分類問題,即把須要進行情感分析的文本劃分爲其所屬類別。文本分類涉及文本表示和分類方法兩個問題。 在深度學習的方法出現以前,主流的文本表示方法爲詞袋模型BOW(bag of words),話題模型等等;分類方法有SVM(support vector machine), LR(logistic regression)等等。 對於一段文本,BOW表示會忽略其詞順序、語法和句法,將這段文本僅僅看作是一個詞集合,所以BOW方法並不能充分表示文本的語義信息。 例如,句子「這部電影糟糕透了」和「一個乏味,空洞,沒有內涵的做品」在情感分析中具備很高的語義類似度,可是它們的BOW表示的類似度爲0。又如,句子「一個空洞,沒有內涵的做品」和「一個不空洞並且有內涵的做品」的BOW類似度很高,但實際上它們的意思很不同。 在本教程中,咱們所要介紹的深度學習模型克服了BOW表示的上述缺陷,它在考慮詞順序的基礎上把文本映射到低維度的語義空間,而且以端對端(end to end)的方式進行文本表示及分類,其性能相對於傳統方法有顯著的提高[1]。算法
2、模型概覽緩存
本教程所使用的文本表示模型爲卷積神經網絡(Convolutional Neural Networks)和循環神經網絡(Recurrent Neural Networks)及其擴展。下面依次介紹這幾個模型。網絡
循環神經網絡是一種能對序列數據進行精確建模的有力工具。實際上,循環神經網絡的理論計算能力是圖靈完備的[4]。天然語言是一種典型的序列數據(詞序列),近年來,循環神經網絡及其變體(如long short term memory[5]等)在天然語言處理的多個領域,如語言模型、句法解析、語義角色標註(或通常的序列標註)、語義表示、圖文生成、對話、機器翻譯等任務上均表現優異甚至成爲目前效果最好的方法。框架
對於較長的序列數據,循環神經網絡的訓練過程當中容易出現梯度消失或爆炸現象[6]。LSTM可以解決這一問題。相比於簡單的循環神經網絡,LSTM增長了記憶單元c、輸入門i、遺忘門f及輸出門o。這些門及記憶單元組合起來大大提高了循環神經網絡處理長序列數據的能力。若將基於LSTM的循環神經網絡表示的函數記爲F,則其公式爲:函數
3、基於PaddlePaddle的實戰工具
PaddlePaddle簡介 PaddlePaddle(paddlepaddle.org)是百度研發的深度學習框架。除了核心框架以外,PaddlePaddle還提供了豐富的工具組件。官方開源了多個工業級應用模型,涵蓋天然語言處理、計算機視覺、推薦引擎等多個領域,並開放了多個領先的預訓練中文模型。4月23日深度學習開發者峯會上,PaddlePaddle發佈了一系列新特性和應用案例。性能
數據集介紹 咱們以IMDB情感分析數據集爲例進行介紹。IMDB數據集的訓練集和測試集分別包含25000個已標註過的電影評論。其中,負面評論的得分小於等於4,正面評論的得分大於等於7,滿分10分。 學習
配置模型
在該示例中,咱們實現了兩種文本分類算法,文本卷積神經網絡,和棧式雙向LSTM。咱們首先引入要用到的庫和定義全局變量:
咱們構建神經網絡 convolution_net,示例代碼以下。 須要注意的是:fluid.nets.sequence_conv_pool 包含卷積和池化層兩個操做。
棧式雙向神經網絡stacked_lstm_net的代碼片斷以下:
以上的棧式雙向LSTM抽象出了高級特徵並把其映射到和分類類別數一樣大小的向量上。最後一個全鏈接層的’softmax’激活函數用來計算分類屬於某個類別的機率。 重申一下,此處咱們能夠調用 convolution_net 或 stacked_lstm_net 的任何一個網絡結構進行訓練學習。咱們以 convolution_net 爲例。 接下來咱們定義預測程序(inference_program)。預測程序使用convolution_net 來對 fluid.layer.data 的輸入進行預測。
咱們這裏定義了 training_program。它使用了從 inference_program 返回的結果來計算偏差。咱們同時定義了優化函數 optimizer_func 。 由於是有監督的學習,訓練集的標籤也在fluid.layers.data中定義了。在訓練過程當中,交叉熵用來在fluid.layer.cross_entropy中做爲損失函數。 在測試過程當中,分類器會計算各個輸出的機率。第一個返回的數值規定爲cost。
4、訓練模型
定義你的訓練是在CPU上仍是在GPU上:
下一步是爲訓練和測試定義數據提供器。提供器讀入一個大小爲 BATCH_SIZE的數據。paddle.dataset.imdb.word_dict 每次會在亂序化後提供一個大小爲BATCH_SIZE的數據,亂序化的大小爲緩存大小buf_size。 注意:讀取IMDB的數據可能會花費幾分鐘的時間,請耐心等待。
訓練器須要一個訓練程序和一個訓練優化函數。
feed_order 用來定義每條產生的數據和 fluid.layers.data 之間的映射關係。好比,imdb.train 產生的第一列的數據對應的是words這個特徵。
咱們在訓練主循環裏打印了每一步輸出,能夠觀察訓練狀況。
最後,咱們啓動訓練主循環來開始訓練。訓練時間較長,若是爲了更快的返回結果,能夠經過調整損耗值範圍或者訓練步數,以減小準確率的代價來縮短訓練時間。
5、應用模型
和訓練過程同樣,咱們須要建立一個預測過程,並使用訓練獲得的模型和參數來進行預測,params_dirname 用來存放訓練過程當中的各個參數。
爲了進行預測,咱們任意選取3個評論。請隨意選取您看好的3個。咱們把評論中的每一個詞對應到word_dict中的id。若是詞典中沒有這個詞,則設爲unknown。 而後咱們用create_lod_tensor來建立細節層次的張量
6、應用模型並進行預測
如今咱們能夠對每一條評論進行正面或者負面的預測啦。
7、參考文獻:
Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.
Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences[J]. arXiv preprint arXiv:1404.2188, 2014.
Yann N. Dauphin, et al. Language Modeling with Gated Convolutional Networks[J] arXiv preprint arXiv:1612.08083, 2016.
Siegelmann H T, Sontag E D. On the computational power of neural nets[C]//Proceedings of the fifth annual workshop on Computational learning theory. ACM, 1992: 440-449.
Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural computation, 1997, 9(8): 1735-1780.
Bengio Y, Simard P, Frasconi P. Learning long-term dependencies with gradient descent is difficult[J]. IEEE transactions on neural networks, 1994, 5(2): 157-166.
Graves A. Generating sequences with recurrent neural networks[J]. arXiv preprint arXiv:1308.0850, 2013.
Cho K, Van Merriënboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[J]. arXiv preprint arXiv:1406.1078, 2014.
Zhou J, Xu W. End-to-end learning of semantic role labeling using recurrent neural networks[C]//Proceedings of the Annual Meeting of the Association for Computational Linguistics. 2015.