1. 程式人生 > >97.5%準確率的深度學習中文分詞(字嵌入+Bi-LSTM+CRF)

97.5%準確率的深度學習中文分詞(字嵌入+Bi-LSTM+CRF)

摘要

深度學習當前在NLP領域發展也相當快,翻譯,問答,摘要等基本都被深度學習佔領了。 本文給出基於深度學習的中文分詞實現,藉助大規模語料,不需要構造額外手工特徵,在2014年人民日報語料上取得97.5%的準確率。模型基本是參考論文:http://www.aclweb.org/anthology/N16-1030

相關方法

中文分詞是個比較經典的問題,各大網際網路公司都會有自己的分詞實現。 考慮到效能,可維護性,詞庫更新,多粒度,以及其他的業務需求,一般工業界中文分詞方案都是基於規則。

1) 基於規則的常見的就是最大正/反向匹配,以及雙向匹配。
2) 規則裡糅合一定的統計規則,會採用動態規劃計算最大的概率路徑的分詞
以上說起來很簡單,其中還有很多細節,比如詞法規則的高效匹配編譯,詞庫的索引結構等。
3) 基於傳統機器學習的方法 ,以CRF為主,也有用svm,nn的實現,這類都是基於模型的,跟本文一樣,都有個缺陷,不方便增加使用者詞典(但可以結合,比如解碼的時候force-decode)。 速度上會有損耗。 另外都需要提取特徵。傳統CRF一般是定義特徵模板,方便性上有所提高。另外傳統CRF訓練演算法(LBFGS)較慢,也有使用sgd的,但多執行緒都支援的不好。代表有crf++, crfsuite, crfsgd, wapiti等。

深度學習方法

深度學習主要是特徵學習,端到端訓練, 適合有大量語料的場景。另外各種工具越來越完善,利用GPU可大幅提高訓練速度。

前文提過,深度學習主要是特徵學習,在NLP裡各種詞嵌入是一種有效的特徵學習。 本文實現的第一步也是對語料進行處理,使用word2vec對語料的字進行嵌入,每個字特徵為50維。

得到字嵌入後,用字嵌入特徵餵給雙向LSTM, 對輸出的隱層加一個線性層,然後加一個CRF就得到本文實現的模型。

1479796073-4147-yY7Fo1osyj7pvJogSZyPWFKICPkg

另外,字元嵌入的表示可以是純預訓練的,但也可以在訓練模型的時候再fine-tune,一般而言後者效果更好。

對於fine-tune的情形,可以在字元嵌入後,輸入雙向LSTM之前加入dropout進一步提升模型效果。

最後,對於最優化方法,文字語言模型類的貌似Adam效果更好, 對於分類之類的,貌似AdaDelta效果更好。

語料

本文使用2014人民日報語料,一共50w+ 句子,1千多萬的字元次數 (句子長度超過50的不考慮)

標註示例:

法新社/j 報道/v 說/v ,/w [泰國/nsf 政府/nis]/nt 已經/d 作/v 好/a 簽發/v 緊急狀態/n 令/v的/ude1 準備/vn 。/w (/w 老/a 任/v )/w

預處理

我們首先使用word2vec對字進行嵌入,具體就是把每一句按字元切割,空格隔開,餵給word2vec,指定維度50

然後我們把每一句處理成 :

字索引1 字索引2 … 字索引N 標註1 標註2 … 標註N

對於標註,我們按字分詞的典型套路,

  1. 對於單獨字元,不跟前後構成詞的,我們標註為S (0)
  2. 跟後面字元構成詞且自身是第一個字元的,我們標註為B (1)
  3. 在成詞的中間的字元,標註為M (2)
  4. 在詞尾的字元,標註為E (3)

這樣處理後使用前面描述模型訓練。

訓練程式碼

1479796073-9713-cziacmsNQHRlpgJVzRiceSmFWhXA

1479796073-8075-FPWMu0ysv3XTpeoeeRSibbQkIPWw

1479796073-5164-cyKsUogNeIiaTCogLxRafOumhC2w

1479796073-4468-WsSRt3GLS3NKo5NxFqQHNRnsjXdA

1479796074-7719-GYjPtOMGMxVGjnE9k4ztN62mpbtA

1479796074-2488-bXn5oLLf1uHrNz73u32mjz3hjicw

線上測試服務