情感分析算法從原理到PaddlePaddle實戰全解

在天然語言處理中,情感分析通常是指判斷一段文本所表達的情緒狀態。其中,一段文本能夠是一個句子,一個段落或一個文檔。情緒狀態能夠是兩類,如(正面,負面),(高興,悲傷);也能夠是三類,如(積極,消極,中性)等等。 情感分析的應用場景十分普遍,如把用戶在購物網站(亞馬遜、天貓、淘寶等)、旅遊網站、電影評論網站上發表的評論分紅正面評論和負面評論;或爲了分析用戶對於某一產品的總體使用感覺,抓取產品的用戶評論並進行情感分析等等。 今天是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)及其擴展。下面依次介紹這幾個模型。網絡

  1. 文本卷積神經網絡簡介(CNN) 對卷積神經網絡來講,首先使用卷積處理輸入的詞向量序列,產生一個特徵圖(feature map),對特徵圖採用時間維度上的最大池化(max pooling over time)操做獲得此卷積覈對應的整句話的特徵,最後,將全部卷積核獲得的特徵拼接起來即爲文本的定長向量表示,對於文本分類問題,將其鏈接至softmax即構建出完整的模型。 在實際應用中,咱們會使用多個卷積核來處理句子,窗口大小相同的卷積核堆疊起來造成一個矩陣,這樣能夠更高效的完成運算。另外,咱們也可以使用窗口大小不一樣的卷積核來處理句子,圖1表示卷積神經網絡文本分類模型,不一樣顏色表示不一樣大小的卷積核操做。

對於通常的短文本分類問題,上文所述的簡單的文本卷積網絡便可達到很高的正確率[1]。若想獲得更抽象更高級的文本特徵表示,能夠構建深層文本卷積神經網絡[2,3]。

  1. 循環神經網絡(RNN)

循環神經網絡是一種能對序列數據進行精確建模的有力工具。實際上,循環神經網絡的理論計算能力是圖靈完備的[4]。天然語言是一種典型的序列數據(詞序列),近年來,循環神經網絡及其變體(如long short term memory[5]等)在天然語言處理的多個領域,如語言模型、句法解析、語義角色標註(或通常的序列標註)、語義表示、圖文生成、對話、機器翻譯等任務上均表現優異甚至成爲目前效果最好的方法。框架

  1. 長短時間記憶網絡(LSTM)

對於較長的序列數據,循環神經網絡的訓練過程當中容易出現梯度消失或爆炸現象[6]。LSTM可以解決這一問題。相比於簡單的循環神經網絡,LSTM增長了記憶單元c、輸入門i、遺忘門f及輸出門o。這些門及記憶單元組合起來大大提高了循環神經網絡處理長序列數據的能力。若將基於LSTM的循環神經網絡表示的函數記爲F,則其公式爲:函數

F由下列公式組合而成[7]:

LSTM經過給簡單的循環神經網絡增長記憶及控制門的方式,加強了其處理遠距離依賴問題的能力。相似原理的改進還有Gated Recurrent Unit (GRU)[8],其設計更爲簡潔一些。這些改進雖然各有不一樣,可是它們的宏觀描述卻與簡單的循環神經網絡同樣(如圖2所示),即隱狀態依據當前輸入及前一時刻的隱狀態來改變,不斷地循環這一過程直至輸入處理完畢:

其中,Recrurent能夠表示簡單的循環神經網絡、GRU或LSTM。

  1. 棧式雙向LSTM(Stacked Bidirectional LSTM)

如圖4所示(以三層爲例),奇數層LSTM正向,偶數層LSTM反向,高一層的LSTM使用低一層LSTM及以前全部層的信息做爲輸入,對最高層LSTM序列使用時間維度上的最大池化便可獲得文本的定長向量表示(這一表示充分融合了文本的上下文信息,而且對文本進行了深層次抽象),最後咱們將文本表示鏈接至softmax構建分類模型。

3、基於PaddlePaddle的實戰工具

  1. PaddlePaddle簡介 PaddlePaddle(paddlepaddle.org)是百度研發的深度學習框架。除了核心框架以外,PaddlePaddle還提供了豐富的工具組件。官方開源了多個工業級應用模型,涵蓋天然語言處理、計算機視覺、推薦引擎等多個領域,並開放了多個領先的預訓練中文模型。4月23日深度學習開發者峯會上,PaddlePaddle發佈了一系列新特性和應用案例。性能

  2. 數據集介紹 咱們以IMDB情感分析數據集爲例進行介紹。IMDB數據集的訓練集和測試集分別包含25000個已標註過的電影評論。其中,負面評論的得分小於等於4,正面評論的得分大於等於7,滿分10分。 學習

    PaddlePaddle在 dataset/imdb.py 中實現了imdb數據集的自動下載和讀取,並提供了讀取字典、訓練數據、測試數據等API。

  3. 配置模型

在該示例中,咱們實現了兩種文本分類算法,文本卷積神經網絡,和棧式雙向LSTM。咱們首先引入要用到的庫和定義全局變量:

  1. 文本卷積神經網絡

咱們構建神經網絡 convolution_net,示例代碼以下。 須要注意的是:fluid.nets.sequence_conv_pool 包含卷積和池化層兩個操做。

網絡的輸入 input_dim 表示的是詞典的大小,class_dim 表示類別數。這裏,咱們使用 sequence_conv_pool API實現了卷積和池化操做。

  1. 棧式雙向LSTM

棧式雙向神經網絡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、訓練模型

  1. 定義訓練環境

定義你的訓練是在CPU上仍是在GPU上:

  1. 定義數據提供器

下一步是爲訓練和測試定義數據提供器。提供器讀入一個大小爲 BATCH_SIZE的數據。paddle.dataset.imdb.word_dict 每次會在亂序化後提供一個大小爲BATCH_SIZE的數據,亂序化的大小爲緩存大小buf_size。 注意:讀取IMDB的數據可能會花費幾分鐘的時間,請耐心等待。

word_dict 是一個字典序列,是詞和label的對應關係,運行下一行能夠看到具體內容:

每行是如(’limited’: 1726)的對應關係,該行表示單詞limited所對應的label是1726。

  1. 構造訓練器

訓練器須要一個訓練程序和一個訓練優化函數。

該函數用來計算訓練中模型在test數據集上的結果

  1. 提供數據並構建主訓練循環

feed_order 用來定義每條產生的數據和 fluid.layers.data 之間的映射關係。好比,imdb.train 產生的第一列的數據對應的是words這個特徵。

  1. 訓練過程處理

咱們在訓練主循環裏打印了每一步輸出,能夠觀察訓練狀況。

  1. 開始訓練

最後,咱們啓動訓練主循環來開始訓練。訓練時間較長,若是爲了更快的返回結果,能夠經過調整損耗值範圍或者訓練步數,以減小準確率的代價來縮短訓練時間。

5、應用模型

  1. 構建預測器

和訓練過程同樣,咱們須要建立一個預測過程,並使用訓練獲得的模型和參數來進行預測,params_dirname 用來存放訓練過程當中的各個參數。

  1. 生成測試用輸入數據

爲了進行預測,咱們任意選取3個評論。請隨意選取您看好的3個。咱們把評論中的每一個詞對應到word_dict中的id。若是詞典中沒有這個詞,則設爲unknown。 而後咱們用create_lod_tensor來建立細節層次的張量

6、應用模型並進行預測

如今咱們能夠對每一條評論進行正面或者負面的預測啦。

感興趣的小夥伴能夠在PaddlePaddle官網上閱讀其餘相關文檔內容: www.paddlepaddle.org/

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.

相關文章
相關標籤/搜索