達觀資料基於Deep Learning的中文分詞嘗試

達觀資料發表於2017-10-11

1. 現有分詞介紹

自然語言處理(NLP,Natural Language Processing)是一個資訊時代最重要的技術之一,簡單來講,就是讓計算機能夠理解人類語言的一種技術。在其中,分詞技術是一種比較基礎的模組。對於英文等拉丁語系的語言而言,由於詞之間有空格作為詞邊際表示,詞語一般情況下都能簡單且準確地提取出來。而中文日文等文字,除了標點符號之外,字之間緊密相連,沒有明顯的詞邊界,因此很難將詞提取出來。分詞的意義非常大,在中文中,單字作為最基本的語義單位,雖然也有自己的意義,但表意能力較差,意義較分散,而詞的表意能力更強,能更加準確地描述一個事物,因此在自然語言處理中,通常情況下詞(包括單字成詞)是最基本的處理單位。

在具體的應用上,比如在常用的搜尋引擎中,term如果是詞粒度的話,不僅能夠減少每個term的倒排列表長度,提升系統效能,並且召回的結果相關性高更準確。比如搜尋query“的確”,如果是單字切分的話,則有可能召回“你講的確實在理”這樣的doc。分詞方法大致分為兩種:基於詞典的機械切分,基於統計模型的序列標註切分兩種方式。

1.1 基於詞典的方法

基於詞典的方法本質上就是字串匹配的方法,將一串文字中的文字片段和已有的詞典進行匹配,如果匹配到,則此文字片段就作為一個分詞結果。但是基於詞典的機械切分會遇到多種問題,最為常見的包括歧義切分問題和未登入詞問題

1.1.1 歧義切分

歧義切分指的是通過詞典匹配給出的切詞結果和原來語句所要表達的意思不相符或差別較大,在機械切分中比較常見,比如下面的例子:“結婚的和尚未結婚的人”,通過機械切分的方式,會有兩種切分結果:1,“結婚/的/和/尚未/結婚/的/人”;2,“結婚/的/和尚/未/結婚/的/人”。可以明顯看出,第二種切分是有歧義的,單純的機械切分很難避免這樣的問題。

1.1.2 未登入詞識別

未登入詞識別也稱作新詞發現,指的是詞沒有在詞典中出現,比如一些新的網路詞彙,如“網紅”,“走你”;一些未登入的人名,地名;一些外語音譯過來的詞等等。基於詞典的方式較難解決未登入詞的問題,簡單的case可以通過加詞典解決,但是隨著字典的增大,可能會引入新的bad case,並且系統的運算複雜度也會增加。

1.1.3 基於詞典的機械分詞改進方法

為了解決歧義切分的問題,在中文分詞上有很多優化的方法,常見的包括正向最大匹配,逆向最大匹配,最少分詞結果,全切分後選擇路徑等多種演算法。

1.1.4 最大匹配方法

正向最大匹配指的是從左到右對一個字串進行匹配,所匹配的詞越長越好,比如“中國科學院計算研究所”,按照詞典中最長匹配原則的切分結果是:“中國科學院/計算研究所”,而不是“中國/科學院/計算/研究所”。但是正向最大匹配也會存在一些bad case,常見的例子如:“他從東經過我家”,使用正向最大匹配會得到錯誤的結果:“他/從/東經/過/我/家”。

逆向最大匹配的順序是從右向左倒著匹配,如果能匹配到更長的詞,則優先選擇,上面的例子“他從東經過我家”逆向最大匹配能夠得到正確的結果“他/從/東/經過/我/家”。但是逆向最大匹配同樣存在bad case:“他們昨日本應該回來”,逆向匹配會得到錯誤的結果“他們/昨/日本/應該/回來”。

針對正向逆向匹配的問題,將雙向切分的結果進行比較,選擇切分詞語數量最少的結果。但是最少切分結果同樣有bad case,比如“他將來上海”,正確的切分結果是“他/將/來/上海”,有4個詞,而最少切分結果“他/將來/中國”只有3個詞。

1.1.5 全切分路徑選擇方法

全切分方法就是將所有可能的切分組合全部列出來,並從中選擇最佳的一條切分路徑。關於路徑的選擇方式,一般有n最短路徑方法,基於詞的n元語法模型方法等。

n最短路徑方法的基本思想就是將所有的切分結果組成有向無環圖,每個切詞結果作為一個節點,詞之間的邊賦予一個權重,最終找到權重和最小的一條路徑作為分詞結果。

基於詞的n元語法模型可以看作是n最短路徑方法的一種優化,不同的是,根據n元語法模型,路徑構成時會考慮詞的上下文關係,根據語料庫的統計結果,找出構成句子最大模型概率。一般情況下,使用unigram和bigram的n元語法模型的情況較多。

1.2 基於序列標註的分詞方法

針對基於詞典的機械切分所面對的問題,尤其是未登入詞識別,使用基於統計模型的分詞方式能夠取得更好的效果。基於統計模型的分詞方法,簡單來講就是一個序列標註問題。

在一段文字中,我們可以將每個字按照他們在詞中的位置進行標註,常用的標記有以下四個label:B,Begin,表示這個字是一個詞的首字;M,Middle,表示這是一個詞中間的字;E,End,表示這是一個詞的尾字;S,Single,表示這是單字成詞。分詞的過程就是將一段字元輸入模型,然後得到相應的標記序列,再根據標記序列進行分詞。舉例來說:“達觀資料是企業大資料服務商”,經過模型後得到的理想標註序列是:“BMMESBEBMEBME”,最終還原的分詞結果是“達觀資料/是/企業/大資料/服務商”。

在NLP領域中,解決序列標註問題的常見模型主要有HMM和CRF。

1.2.1 HMM

HMM(Hidden Markov Model)隱馬爾科夫模型應用非常廣泛,基本的思想就是根據觀測值序列找到真正的隱藏狀態值序列。在中文分詞中,一段文字的每個字元可以看作是一個觀測值,而這個字元的詞位置label(BEMS)可以看作是隱藏的狀態。使用HMM的分詞,通過對切分語料庫進行統計,可以得到模型中5大要要素:起始概率矩陣,轉移概率矩陣,發射概率矩陣,觀察值集合,狀態值集合。在概率矩陣中,起始概率矩陣表示序列第一個狀態值的概率,在中文分詞中,理論上M和E的概率為0。轉移概率表示狀態間的概率,比如B->M的概率,E->S的概率等。而發射概率是一個條件概率,表示當前這個狀態下,出現某個字的概率,比如p(人|B)表示在狀態為B的情況下人字的概率。

有了三個矩陣和兩個集合後,HMM問題最終轉化成求解隱藏狀態序列最大值的問題,求解這個問題最長使用的是Viterbi演算法,這是一種動態規劃演算法,具體的演算法可以參考維基百科詞條,在此不詳細展開。

達觀資料基於Deep Learning的中文分詞嘗試

                                                       圖1.1 HMM模型示意圖

1.2.2 CRF

CRF(Conditional random field,條件隨機場)是用來標註和劃分結構資料的概率化結構模型,通常使用在模式識別和機器學習中,在自然語言處理和影象處理等領域中得到廣泛應用。和HMM類似,當對於給定的輸入觀測序列X和輸出序列Y,CRF通過定義條件概率P(Y|X),而不是聯合概率分佈P(X,Y)來描述模型。CRF演算法的具體演算法可以參考維基百科詞條。

達觀資料基於Deep Learning的中文分詞嘗試

                                            圖1.2 不同概率模型之間的關係及演化圖

在實際應用中有很多工具包可以使用,比如CRF++,CRFsuite,SGD,Wapiti 等,其中CRF++的準確度較高。在分詞中使用CRF++時,主要的工作是特徵模板的配置。CRF++支援unigram,bigram兩種特徵,分別以U和B開頭。舉例來講U00:%x[-2,0] 表示第一個特徵,特徵取值是當前字的前方第二個字,U01:%x[-1,0] 表示第二個特徵,特徵取值當前字前一個字,U02:%x[0,0] 表示第三個特徵,取當前字,以此類推。特徵模板可以支援多種特徵,CRF++會根據特徵模板提取特徵函式,用於模型的建立和使用。特徵模板的設計對分詞效果及訓練時間影響較大,需要分析嘗試找到適用的特徵模板。

2. 深度學習介紹

隨著AlphaGo的大顯神威,Deep Learning(深度學習)的熱度進一步提高。深度學習來源於傳統的神經網路模型。傳統的神經網路一般由輸入層,隱藏層,輸出層組成,其中隱藏層的數目按需確定。深度學習可以簡單的理解為多層神經網路,但是深度學習的卻不僅僅是神經網路。深度模型將每一層的輸出作為下一層的輸入特徵,通過將底層的簡單特徵組合成為高層的更抽象的特徵來進行學習。在訓練過程中,通常採用貪婪演算法,一層一層地訓練,比如在訓練第k層時,固定訓練好的前k-1層的引數進行訓練,訓練好第k層之後的以此類推進行一層層訓練。

達觀資料基於Deep Learning的中文分詞嘗試

                                      圖2.1 AlphaGo的神經網路模型的訓練過程及架構

達觀資料基於Deep Learning的中文分詞嘗試

                                   圖2.2 Google Tensorflow官網的神經網路演示示意圖

深度學習在很多領域都有所應用,在影象和語音識別領域中已經取得巨大的成功。從2012年開始,LSVRC(Large Scale Visual Recognition Challenge)比賽中,基於Deep Learningd 計算框架一直處於領先。2015年LSVRC(http://www.image-net.org/challenges/LSVRC/2015/results)的比賽中,微軟亞洲研究院(MSRA)在影象檢測(Object detection),影象分類定位(Object Classification+localization)上奪冠,他們使用的神經網路深達152層。

2.1 深度學習在NLP中的應用

在自然語言處理上,深度學習在機器翻譯、自動問答、文字分類、情感分析、資訊抽取、序列標註、語法解析等領域都有廣泛的應用。2013年末google釋出的word2vec工具,可以看做是深度學習在NLP領域的一個重要應用,雖然word2vec只有三層神經網路,但是已經取得非常好的效果。通過word2vec,可以將一個詞表示為詞向量,將文字數字化,更好的讓計算機理解。使word2vec模型,我們可以方便地找到同義詞或聯絡緊密的詞,或者意義相反的詞等。

達觀資料基於Deep Learning的中文分詞嘗試

                                     圖2.3 基於微信資料製作的word2vec模型測試:程式設計

達觀資料基於Deep Learning的中文分詞嘗試

                                  圖2.4 基於微信資料製作的word2vec模型測試:韋德

2.2 詞向量介紹

詞向量的意思就是通過一個數字組成的向量來表示一個詞,這個向量的構成可以有很多種。最簡單的方式就是所謂的one-hot向量。假設在一個語料集合中,一共有n個不同的詞,則可以使用一個長度為n的向量,對於第i個詞(i=0…n-1),向量index=i處值為1外,向量其他位置的值都為0,這樣就可以唯一的通過一個[0,0,1,…,0,0]形式的向量表示一個詞。one-hot向量比較簡單也容易理解,但是有很多問題,比如當加入新詞時,整個向量的長度會改變,並且存在維數過高難以計算的問題,以及向量的表示方法很難體現兩個詞之間的關係,因此一般情況下one-hot向量較少的使用。

如果考慮到詞和詞之間的聯絡,就要考慮詞的共現問題。最簡單的是使用基於文件的向量表示方法來給出詞向量。基本思想也很簡單,假設有n篇文件,如果某些詞經常成對出現在多篇相同的文件中,我們則認為這兩個詞聯絡非常緊密。對於文件集合,可以將文件按順編號(i=0…n-1),將文件編導作為向量索引,這樣就有一個n維的向量。當一個詞出現在某個文件i中時,向量i處值為1,這樣就可以通過一個類似[0,1,0,…,1,0]形式的向量表示一個詞。基於文件的詞向量能夠很好地表示詞之間的關係,但是向量的長度和語料庫的大小相關,同樣會存在維度變化問題。

考慮用一個固定視窗大小的文字片段來解決維度變化問題,如果在這樣的片段中,兩個詞出現了,就認為這兩個詞有關。舉例來講,有以下三句話: “我\喜歡\你”,“我\愛\運動”,“我\愛\攝影”,如果考慮視窗的大小為1,也就是認為一個詞只和它前面和後面的詞有關,通過統計共現次數,我們能夠得到下面的矩陣。

達觀資料基於Deep Learning的中文分詞嘗試

  •                                            圖2.5 基於文字視窗共現統計出來的矩陣

可以看到這是一個n*n的對稱矩陣X,這個矩陣的維數會隨著詞典數量的增加而增大,通過SVD(Singular Value Decomposition,奇異值分解),我們可以將矩陣維度降低,但仍存在一些問題: 矩陣X維度經常改變,並且由於大部分詞並不是共現而導致的稀疏性,矩陣維度過高計算複雜度高等問題。

Word2vec是一個多層的神經網路,同樣可以將詞向量化。在Word2vec中最重要的兩個模型是CBOW(Continuous Bag-of-Word)模型和Skip-gram(Continuous Skip-gram)模型,兩個模型都包含三層: 輸入層,投影層,輸出層。CBOW模型的作用是已知當前詞Wt的上下文環境(Wt-2,Wt-1,Wt+1,Wt+2)來預測當前詞,Skip-gram模型的作用是根據當前詞Wt來預測上下文(Wt-2,Wt-1,Wt+1,Wt+2)。在模型求解中,和一般的機器學習方法類似,也是定義不同的損失函式,使用梯度下降法尋找最優值。Word2vec模型求解中,使用了Hierarchical Softmax方法和Negative Sampling兩種方法。通過使用Word2vec,我們可以方便的將詞轉化成向量表示,讓計算機和理解影象中的每個點一樣,數字化詞的表現。

2.3 LSTM模型介紹

深度學習有很多種不同型別的網路,在影象識別領域,CNN(Convolutional Neural Network,卷積神經網路)使用的較多,而在NLP領域,考慮到上下文的RNN(Recurrent Neural Networks,迴圈神經網路)取得了巨大的成功。在傳統的神經網路中,從輸入層到隱藏層到輸出層,層之間是全連線的,但是每層內部的節點之間是無連線的。因為這樣的原因,傳統的神經網路不能利用上下文關係, 而在自然語言處理中,上下文關係非常重要,一個句子中前後詞並不獨立,不同的組合會有不同的意義,比如”優秀”這個詞,如果前面是”不”字,則意義完全相反。RNN則考慮到網路前一時刻的輸出對當前輸出的影響,將隱藏層內部的節點也連線起來,即當前時刻一個節點的輸入除了上一層的輸出外,還包括上一時刻隱藏層的輸出。RNN在理論上可以儲存任意長度的轉態序列,但是在不同的場景中這個長度可能不同。比如在詞的預測例子中: 1,“他是億萬富翁,他很?”; 2,“他的房子每平米物業費40元,並且像這樣的房子他有十幾套,他很?”。從這兩個句子中我們已經能猜到?代表“有錢”或其他類似的詞彙,但是明顯,第一句話預測最後一個詞時的上線文序列很短,而第二段話較長。如果預測一個詞彙需要較長的上下文,隨著這個距離的增長,RNN將很難學到這些長距離的資訊依賴,雖然這對我們人類相對容易。在實踐中,已被證明使用最廣泛的模型是LSTM(Long Short-Term Memory,長短時記憶)很好的解決了這個問題。

LSTM最早由Hochreiter 及 Schmidhuber在1997年的論文中提出。首先LSTM也是一種RNN,不同的是LSTM能夠學會遠距離的上下文依賴,能夠儲存較遠距離上下文對當前時間節點的影響。

所有的RNN都有一串重複的神經網路模組。對於標準的RNN,這個模組都比較簡單,比如使用單獨的tanh層。LSTM擁有類似的結構,但是不同的是,LSTM的每個模組擁有更復雜的神經網路結構: 4層相互影響的神經網路。在LSTM每個單元中,因為門結構的存在,對於每個單元的轉態,使得LSTM擁有增加或減少資訊的能力。

達觀資料基於Deep Learning的中文分詞嘗試

                                       圖2.6 標準RNN模型中的重複模組包括1層結構

達觀資料基於Deep Learning的中文分詞嘗試

                                          圖2.7 LSTM模型中的重複模組包括4層結構

3. 深度學習庫keras介紹

Keras(http://keras.io)是一個非常易用的深度學習框架,使用python語言編寫,是一個高度模組化的神經網路庫,後端同時支援Theano和TensorFlow,而Theano和TensorFlow支援GPU,因此使用keras可以使用GPU加速模型訓練。Keras中包括了構建模型常用的模組,如Optimizers優化方法模組,Activations啟用函式模組,Initializations初始化模組,Layers多種網路層模組等,可以非常方便快速的搭建一個網路模型,使得開發人員可以快速上手,並將精力放在模型設計而不是具體實現上。常見的神經網路模型如CNN,RNN等,使用keras都可以很快搭建出來,開發人員只需要將資料準備成keras需要的格式丟進網路訓練即可。如果對keras中自帶的layer有更多的需求,keras還可以自己定製所需的layer。

3.1 Keras在NLP中的應用

Keras專案中的example自帶了多個示例,包括經典的mnist手寫識別測試等,其中和NLP相關的示例有很多,比如基於imdb資料的情感分析、文字分類、序列標註等。其中lstm_text_generation.py示例可以用來參考設計序列標註問題,這個示例試圖通過LSTM學習尼采的作品,通過序列標註的思想來訓練一個文字生成器模型。下面著重看一下兩個關鍵點:模型資料格式及模型設計。

3.1.1 訓練資料準備

達觀資料基於Deep Learning的中文分詞嘗試

這段程式碼是資料準備的情況。將尼采全文進行資料切割,每40個字元為一個片段,將緊接這個片段的字元作為預測值,來進行訓練。字元片段的間隔為3。

3.1.2 模型設計

達觀資料基於Deep Learning的中文分詞嘗試

在模型設計上,主要是使用了兩層LSTM,每層的輸出維度為512,並在每層LSTM後面加入了Dropout層,來防止過擬合。整個模型的輸入維度是字元類別的個數,輸入字串長度是40,模型的輸出維度也是字元類別長度。整個模型表達的意思是每輸入40個字元,就會從模型中輸出一個預測的字元。因為LSTM的對長依賴term的記憶性,因此在上下文很長(40個字元)的情況下也可以表現的很好。

4. 基於深度學習方式的分詞嘗試

基於上面的知識,可以考慮使用深度學習的方法進行中文分詞。分詞的基礎思想還是使用序列標註問題,將一個句子中的每個字標記成BEMS四種label。模型整的輸入是字元序列,輸出是一個標註序列,因此這是一個標準的sequence to sequence問題。因為一個句子中每個字的上下文對這個字的label型別影響很大,因此考慮使用RNN模型來解決。

4.1 環境介紹

測試硬體是Macbook Pro 2014 Mid高配版,帶Nvidia GT 750M GPU,雖然GPU效能有限,但通過測試效能還是強過mac自帶的i7 CPU。使用GPU進行模型運算,需要安裝Nvidia的cuda相關程式及cuDNN庫,會有較大的效能提升。軟體方面使用python2.7,安裝好了keras,theano及相關庫。關於keras使用GPU訓練的環境搭建問題,可以參考這篇文章(Run Keras on Mac OS with GPU,http://blog.wenhaolee.com/run-keras-on-mac-os-with-gpu/)。

4.2 模型訓練

模型訓練使用的是經典的bakeoff2005中的微軟研究院的切分語料,將其中的train部分拿過來做訓練,將test作為最終的測試。

4.2.1 訓練資料準備

首先,將訓練樣本中出現的所有字元全部對映成對應的數字,將文字數字化,形成一個字元到資料的對映。在分詞中,一個詞的label受上下文影響很大,因此參考之前提到的lstm_text_generation.py示例,我們將一個長度為n個字元的輸入文字處理成n個長度為k的向量,k為奇數。舉例來說,當k=7時,表示考慮了一個字前3個字和後三個字的上下文,將這個七個字作為一個輸入,輸出就是這個字的label型別(BEMS)。

4.2.2 基礎模型建立

參考lstm_text_generation.py 中的模型搭建方式,我們採用一層的LSTM構建網路,程式碼如下:

達觀資料基於Deep Learning的中文分詞嘗試

其中,輸入的維度input_dim 是字元類別總數,hidden_node 是隱藏層的結點個數。在上面的模型中,第一層輸入層Embedding的作用是將輸入的整數向量化。在現在這個模型中,輸入是一個一維向量,裡面每個值是字元對應的整數,Embedding層就可以將這些整數向量化,簡單來講就是生成了每個字的字向量。接下來緊跟著一層是LSTM,它輸出維度也是隱藏層的結點個數。Dropout層的作用是讓一些神經節點隨機不工作,來防止過擬合現象。Dense層是最後的輸出,這裡nb_classes的數目是4,代表一個字元的label。模型建立好後開始訓練,重複20次,訓練的結果如下:

達觀資料基於Deep Learning的中文分詞嘗試

                                 圖4.1 基礎模型(1層LSTM優化器RMSprop)訓練20次

訓練好後,我們使用msr_test的測試資料進行分詞,並將最終的分詞結果使用icwb2自帶的指令碼進行測試,結果如下:

達觀資料基於Deep Learning的中文分詞嘗試

                                                 圖4.2 基礎模型F Score: 0.845

可以看到基礎模型的F值一般,比傳統的CRF效果差的較多,因此考慮優化模型。

4.2.3 效果改進

1) 模型引數調整

首先想到的是模型引數的調整。Keras官方文件中提到,RMSprop優化方法在RNN網路中通常是一個好的選擇,但是在嘗試了其他的優化器後,比如Adam,發現可以取得更好的效果。

達觀資料基於Deep Learning的中文分詞嘗試

                                                圖4.3 1層LSTM優化器Adam訓練20次

可以看到,Adam在訓練過程中的精度就已經高於RMSprop,使用icwb2的測試結果為:

達觀資料基於Deep Learning的中文分詞嘗試

                                        圖4.4 修改優化器Adam後的模型F Score:0.889

2) 模型結構改變

現在網路結構較簡單,只有一層LSTM,參考文件示例中的模型設計,考慮使用兩層的LSTM來進行測試,修改後的程式碼如下:達觀資料基於Deep Learning的中文分詞嘗試


注意,第一層LSTM有個return_sequences =True可以將最後一個結果出入到輸出序列,保證輸出的tensor是3D的,因為LSTM的輸入要求是3D的tensor。

兩層LSTM模型訓練過程如下:

達觀資料基於Deep Learning的中文分詞嘗試

                                     圖4.5 2層LSTM優化器Adam訓練20次的模型

可以看到,兩層LSTM使得模型更加複雜,訓練時常也增加不少。模型訓練後,使用icwb2的測試結果為:

達觀資料基於Deep Learning的中文分詞嘗試

                                            圖4.6 兩層LSTM的模型F Score:0.889

可以看到,隨著模型的複雜,雖然F Score無提升,但是其他的指標有一定的提升。一般來說,神經網路在大量訓練資料下也會有更好的效果,後續會繼續嘗試更大資料集更復雜模型的效果。

5. 總結和展望

深度學習技術給NLP技術中的中文分詞技術帶來了新鮮血液,改變了傳統的思路。深度神經網路的優點是可以自動發現特徵,大大減少了特徵工程的工作量。隨著技術的進一步發展,深度學習在NLP領域將會發揮更大的作用。達觀資料將在已有成熟的NLP演算法及模型基礎上,逐漸融合基於深度神經網路的NLP模型,在文字分類、序列標註、情感分析、語義分析等功能上進一步優化提升效果,來更好為客戶服務。


相關文章