自然語(yǔ)言處理(NLP,Natural Language Processing)是一個(gè)信息時(shí)代最重要的技術(shù)之一,簡(jiǎn)單來(lái)講,就是讓計算機能夠理解人類(lèi)語(yǔ)言的一種技術(shù)。在其中,分詞技術(shù)是一種比較基礎的模塊。對于英文等拉丁語(yǔ)系的語(yǔ)言而言,由于詞之間有空格作為詞邊際表示,詞語(yǔ)一般情況下都能簡(jiǎn)單且準確的提取出來(lái)。而中文日文等文字,除了標點(diǎn)符號之外,字之間緊密相連,沒(méi)有明顯的詞邊界,因此很難將詞提取出來(lái)。分詞的意義非常大,在中文中,單字作為最基本的語(yǔ)義單位,雖然也有自己的意義,但表意能力較差,意義較分散,而詞的表意能力更強,能更加準確的描述一個(gè)事物,因此在自然語(yǔ)言處理中,通常情況下詞(包括單字成詞)是最基本的處理單位。在具體的應用上,比如在常用的搜索引擎中,term如果是詞粒度的話(huà),不僅能夠減少每個(gè)term的倒排列表長(cháng)度,提升系統性能,并且召回的結果相關(guān)性高更準確。比如搜索query“的確”,如果是單字切分的話(huà),則有可能召回“你講的確實(shí)在理”這樣的doc。分詞方法大致分為兩種:基于詞典的機械切分,基于統計模型的序列標注切分兩種方式。
基于詞典的方法本質(zhì)上就是字符串匹配的方法,將一串文本中的文字片段和已有的詞典進(jìn)行匹配,如果匹配到,則此文字片段就作為一個(gè)分詞結果。但是基于詞典的機械切分會(huì )遇到多種問(wèn)題,最為常見(jiàn)的包括歧義切分問(wèn)題和未登錄詞問(wèn)題
歧義切分
歧義切分指的是通過(guò)詞典匹配給出的切詞結果和原來(lái)語(yǔ)句所要表達的意思不相符或差別較大,在機械切分中比較常見(jiàn),比如下面的例子:“結婚的和尚未結婚的人”,通過(guò)機械切分的方式,會(huì )有兩種切分結果:1,“結婚/的/和/尚未/結婚/的/人”;2,“結婚/的/和尚/未/結婚/的/人”??梢悦黠@看出,第二種切分是有歧義的,單純的機械切分很難避免這樣的問(wèn)題。
未登錄詞識別
未登錄詞識別也稱(chēng)作新詞發(fā)現,指的是詞沒(méi)有在詞典中出現,比如一些新的網(wǎng)絡(luò )詞匯,如“網(wǎng)紅”,“走你”;一些未登錄的人名,地名;一些外語(yǔ)音譯過(guò)來(lái)的詞等等?;谠~典的方式較難解決未登錄詞的問(wèn)題,簡(jiǎn)單的case可以通過(guò)加詞典解決,但是隨著(zhù)字典的增大,可能會(huì )引入新的bad case,并且系統的運算復雜度也會(huì )增加。
基于詞典的機械分詞改進(jìn)方法
為了解決歧義切分的問(wèn)題,在中文分詞上有很多優(yōu)化的方法,常見(jiàn)的包括正向最大匹配,逆向最大匹配,最少分詞結果,全切分后選擇路徑等多種算法。
最大匹配方法
正向最大匹配指的是從左到右對一個(gè)字符串進(jìn)行匹配,所匹配的詞越長(cháng)越好,比如“中國科學(xué)院計算研究所”,按照詞典中最長(cháng)匹配原則的切分結果是:“中國科學(xué)院/計算研究所”,而不是“中國/科學(xué)院/計算/研究所”。但是正向最大匹配也會(huì )存在一些bad case,常見(jiàn)的例子如:“他從東經(jīng)過(guò)我家”,使用正向最大匹配會(huì )得到錯誤的結果:“他/從/東經(jīng)/過(guò)/我/家”。
逆向最大匹配的順序是從右向左倒著(zhù)匹配,如果能匹配到更長(cháng)的詞,則優(yōu)先選擇,上面的例子“他從東經(jīng)過(guò)我家”逆向最大匹配能夠得到正確的結果“他/從/東/經(jīng)過(guò)/我/家”。但是逆向最大匹配同樣存在bad case:“他們昨日本應該回來(lái)”,逆向匹配會(huì )得到錯誤的結果“他們/昨/日本/應該/回來(lái)”。
針對正向逆向匹配的問(wèn)題,將雙向切分的結果進(jìn)行比較,選擇切分詞語(yǔ)數量最少的結果。但是最少切分結果同樣有bad case,比如“他將來(lái)上?!?,正確的切分結果是“他/將/來(lái)/上?!?,有4個(gè)詞,而最少切分結果“他/將來(lái)/中國”只有3個(gè)詞。
全切分路徑選擇方法
全切分方法就是將所有可能的切分組合全部列出來(lái),并從中選擇最佳的一條切分路徑。關(guān)于路徑的選擇方式,一般有n最短路徑方法,基于詞的n元語(yǔ)法模型方法等。
n最短路徑方法的基本思想就是將所有的切分結果組成有向無(wú)環(huán)圖,每個(gè)切詞結果作為一個(gè)節點(diǎn),詞之間的邊賦予一個(gè)權重,最終找到權重和最小的一條路徑作為分詞結果。
基于詞的n元語(yǔ)法模型可以看作是n最短路徑方法的一種優(yōu)化,不同的是,根據n元語(yǔ)法模型,路徑構成時(shí)會(huì )考慮詞的上下文關(guān)系,根據語(yǔ)料庫的統計結果,找出構成句子最大模型概率。一般情況下,使用unigram和bigram的n元語(yǔ)法模型的情況較多。
針對基于詞典的機械切分所面對的問(wèn)題,尤其是未登錄詞識別,使用基于統計模型的分詞方式能夠取得更好的效果?;诮y計模型的分詞方法,簡(jiǎn)單來(lái)講就是一個(gè)序列標注問(wèn)題。
在一段文字中,我們可以將每個(gè)字按照他們在詞中的位置進(jìn)行標注,常用的標記有以下四個(gè)label:B,Begin,表示這個(gè)字是一個(gè)詞的首字;M,Middle,表示這是一個(gè)詞中間的字;E,End,表示這是一個(gè)詞的尾字;S,Single,表示這是單字成詞。分詞的過(guò)程就是將一段字符輸入模型,然后得到相應的標記序列,再根據標記序列進(jìn)行分詞。舉例來(lái)說(shuō):“達觀(guān)數據位是企業(yè)大數據服務(wù)商”,經(jīng)過(guò)模型后得到的理想標注序列是:“BMMESBEBMEBME”,最終還原的分詞結果是“達觀(guān)數據/是/企業(yè)/大數據/服務(wù)商”。
在NLP領(lǐng)域中,解決序列標注問(wèn)題的常見(jiàn)模型主要有HMM和CRF。
HMM
HMM(Hidden Markov Model)隱馬爾科夫模型應用非常廣泛,基本的思想就是根據觀(guān)測值序列找到真正的隱藏狀態(tài)值序列。在中文分詞中,一段文字的每個(gè)字符可以看作是一個(gè)觀(guān)測值,而這個(gè)字符的詞位置label(BEMS)可以看作是隱藏的狀態(tài)。使用HMM的分詞,通過(guò)對切分語(yǔ)料庫進(jìn)行統計,可以得到模型中5大要要素:起始概率矩陣,轉移概率矩陣,發(fā)射概率矩陣,觀(guān)察值集合,狀態(tài)值集合。在概率矩陣中,起始概率矩陣表示序列第一個(gè)狀態(tài)值的概率,在中文分詞中,理論上M和E的概率為0。轉移概率表示狀態(tài)間的概率,比如B->M的概率,E->S的概率等。而發(fā)射概率是一個(gè)條件概率,表示當前這個(gè)狀態(tài)下,出現某個(gè)字的概率,比如p(人|B)表示在狀態(tài)為B的情況下人字的概率。
有了三個(gè)矩陣和兩個(gè)集合后,HMM問(wèn)題最終轉化成求解隱藏狀態(tài)序列最大值的問(wèn)題,求解這個(gè)問(wèn)題最長(cháng)使用的是Viterbi算法,這是一種動(dòng)態(tài)規劃算法,具體的算法可以參考維基百科詞條,在此不詳細展開(kāi)。
(https://en.wikipedia.org/wiki/Viterbi_algorithm)

圖1:HMM模型示意圖
CRF
CRF(Conditional random field,條件隨機場(chǎng))是用來(lái)標注和劃分結構數據的概率化結構模型,通常使用在模式識別和機器學(xué)習中,在自然語(yǔ)言處理和圖像處理等領(lǐng)域中得到廣泛應用。和HMM類(lèi)似,當對于給定的輸入觀(guān)測序列X和輸出序列Y,CRF通過(guò)定義條件概率P(Y|X),而不是聯(lián)合概率分布P(X,Y)來(lái)描述模型。CRF算法的具體算法可以參考維基百科詞條。
(https://en.wikipedia.org/wiki/Conditional_random_field)

圖2:不同概率模型之間的關(guān)系及演化圖
在實(shí)際應用中有很多工具包可以使用,比如CRF++,CRFsuite,SGD,Wapiti 等,其中CRF++的準確度較高。在分詞中使用CRF++時(shí),主要的工作是特征模板的配置。CRF++支持unigram,bigram兩種特征,分別以U和B開(kāi)頭。舉例來(lái)講U00:%x[-2,0] 表示第一個(gè)特征,特征取值是當前字的前方第二個(gè)字,U01:%x[-1,0] 表示第二個(gè)特征,特征取值當前字前一個(gè)字,U02:%x[0,0] 表示第三個(gè)特征,取當前字,以此類(lèi)推。特征模板可以支持多種特征,CRF++會(huì )根據特征模板提取特征函數,用于模型的建立和使用。特征模板的設計對分詞效果及訓練時(shí)間影響較大,需要分析嘗試找到適用的特征模板。
隨著(zhù)AlphaGo的大顯神威,Deep Learning(深度學(xué)習)的熱度進(jìn)一步提高。深度學(xué)習來(lái)源于傳統的神經(jīng)網(wǎng)絡(luò )模型。傳統的神經(jīng)網(wǎng)絡(luò )一般由輸入層,隱藏層,輸出層組成,其中隱藏層的數目按需確定。深度學(xué)習可以簡(jiǎn)單的理解為多層神經(jīng)網(wǎng)絡(luò ),但是深度學(xué)習的卻不僅僅是神經(jīng)網(wǎng)絡(luò )。深度模型將每一層的輸出作為下一層的輸入特征,通過(guò)將底層的簡(jiǎn)單特征組合成為高層的更抽象的特征來(lái)進(jìn)行學(xué)習。在訓練過(guò)程中,通常采用貪婪算法,一層層的訓練,比如在訓練第k層時(shí),固定訓練好的前k-1層的參數進(jìn)行訓練,訓練好第k層之后的以此類(lèi)推進(jìn)行一層層訓練。

圖3:AlphaGo的神經(jīng)網(wǎng)絡(luò )模型的訓練過(guò)程及架構

圖4:Google Tensorflow官網(wǎng)的神經(jīng)網(wǎng)絡(luò )演示示意圖
深度學(xué)習在很多領(lǐng)域都有所應用,在圖像和語(yǔ)音識別領(lǐng)域中已經(jīng)取得巨大的成功。從2012年開(kāi)始,LSVRC(Large Scale Visual Recognition Challenge)比賽中,基于Deep Learningd 計算框架一直處于領(lǐng)先。2015年LSVRC(http://www.image-net.org/challenges/LSVRC/2015/results)的比賽中,微軟亞洲研究院(MSRA)在圖像檢測(Object detection),圖像分類(lèi)定位(Object Classification+localization)上奪冠,他們使用的神經(jīng)網(wǎng)絡(luò )深達152層。
在自然語(yǔ)言處理上,深度學(xué)習在機器翻譯、自動(dòng)問(wèn)答、文本分類(lèi)、情感分析、信息抽取、序列標注、語(yǔ)法解析等領(lǐng)域都有廣泛的應用。2013年末google發(fā)布的word2vec工具,可以看做是深度學(xué)習在NLP領(lǐng)域的一個(gè)重要應用,雖然word2vec只有三層神經(jīng)網(wǎng)絡(luò ),但是已經(jīng)取得非常好的效果。通過(guò)word2vec,可以將一個(gè)詞表示為詞向量,將文字數字化,更好的讓計算機理解。使word2vec模型,我們可以方便的找到同義詞或聯(lián)系緊密的詞,或者意義相反的詞等。

圖5:基于微信數據制作的word2vec模型測試: 編程

圖6:基于微信數據制作的word2vec模型測試:韋德
詞向量的意思就是通過(guò)一個(gè)數字組成的向量來(lái)表示一個(gè)詞,這個(gè)向量的構成可以有很多種。最簡(jiǎn)單的方式就是所謂的one-hot向量。假設在一個(gè)語(yǔ)料集合中,一共有n個(gè)不同的詞,則可以使用一個(gè)長(cháng)度為n的向量,對于第i個(gè)詞(i=0…n-1),向量index=i處值為1外,向量其他位置的值都為0,這樣就可以唯一的通過(guò)一個(gè)[0,0,1,…,0,0]形式的向量表示一個(gè)詞。one-hot向量比較簡(jiǎn)單也容易理解,但是有很多問(wèn)題,比如當加入新詞時(shí),整個(gè)向量的長(cháng)度會(huì )改變,并且存在維數過(guò)高難以計算的問(wèn)題,以及向量的表示方法很難體現兩個(gè)詞之間的關(guān)系,因此一般情況下one-hot向量較少的使用。
如果考慮到詞和詞之間的聯(lián)系,就要考慮詞的共現問(wèn)題。最簡(jiǎn)單的是使用基于文檔的向量表示方法來(lái)給出詞向量?;舅枷胍埠芎?jiǎn)單,假設有n篇文檔,如果某些詞經(jīng)常成對出現在多篇相同的文檔中,我們則認為這兩個(gè)詞聯(lián)系非常緊密。對于文檔集合,可以將文檔按順編號(i=0…n-1),將文檔編導作為向量索引,這樣就有一個(gè)n維的向量。當一個(gè)詞出現在某個(gè)文檔i中時(shí),向量i處值為1,這樣就可以通過(guò)一個(gè)類(lèi)似[0,1,0,…,1,0]形式的向量表示一個(gè)詞?;谖臋n的詞向量能夠很好的表示詞之間的關(guān)系,但是向量的長(cháng)度和語(yǔ)料庫的大小相關(guān),同樣會(huì )存在維度變化問(wèn)題。
考慮一個(gè)固定窗口大小的文本片段來(lái)解決維度變化問(wèn)題,如果在這樣的片段中,兩個(gè)詞出現了,就認為這兩個(gè)詞有關(guān)。舉例來(lái)講,有以下三句話(huà): “我\喜歡\你”,“我\愛(ài)\運動(dòng)”,“我\愛(ài)\攝影”,如果考慮窗口的大小為1,也就是認為一個(gè)詞只和它前面和后面的詞有關(guān),通過(guò)統計共現次數,我們能夠得到下面的矩陣:

圖7:基于文本窗口共現統計出來(lái)的矩陣
可以看到這是一個(gè)n*n的對稱(chēng)矩陣X,這個(gè)矩陣的維數會(huì )隨著(zhù)詞典數量的增加而增大,通過(guò)SVD(Singular Value Decomposition,奇異值分解),我們可以將矩陣維度降低,但仍存在一些問(wèn)題: 矩陣X維度經(jīng)常改變,并且由于大部分詞并不是共現而導致的稀疏性,矩陣維度過(guò)高計算復雜度高等問(wèn)題。
Word2vec是一個(gè)多層的神經(jīng)網(wǎng)絡(luò ),同樣可以將詞向量化。在Word2vec中最重要的兩個(gè)模型是CBOW(Continuous Bag-of-Word)模型和Skip-gram(Continuous Skip-gram)模型,兩個(gè)模型都包含三層: 輸入層,投影層,輸出層。CBOW模型的作用是已知當前詞Wt的上下文環(huán)境(Wt-2,Wt-1,Wt+1,Wt+2)來(lái)預測當前詞,Skip-gram模型的作用是根據當前詞Wt來(lái)預測上下文(Wt-2,Wt-1,Wt+1,Wt+2)。在模型求解中,和一般的機器學(xué)習方法類(lèi)似,也是定義不同的損失函數,使用梯度下降法尋找最優(yōu)值。Word2vec模型求解中,使用了Hierarchical Softmax方法和Negative Sampling兩種方法。通過(guò)使用Word2vec,我們可以方便的將詞轉化成向量表示,讓計算機和理解圖像中的每個(gè)點(diǎn)一樣,數字化詞的表現。
LSTM模型介紹
深度學(xué)習有很多種不同類(lèi)型的網(wǎng)絡(luò ),在圖像識別領(lǐng)域,CNN(Convolutional Neural Network,卷積神經(jīng)網(wǎng)絡(luò ))使用的較多,而在NLP領(lǐng)域,考慮到上下文的RNN(Recurrent Neural Networks,循環(huán)神經(jīng)網(wǎng)絡(luò ))取得了巨大的成功。在傳統的神經(jīng)網(wǎng)絡(luò )中,從輸入層到隱藏層到輸出層,層之間是全連接的,但是每層內部的節點(diǎn)之間是無(wú)連接的。因為這樣的原因,傳統的神經(jīng)網(wǎng)絡(luò )不能利用上下文關(guān)系, 而在自然語(yǔ)言處理中,上下文關(guān)系非常重要,一個(gè)句子中前后詞并不獨立,不同的組合會(huì )有不同的意義,比如”優(yōu)秀”這個(gè)詞,如果前面是”不”字,則意義完全相反。RNN則考慮到網(wǎng)絡(luò )前一時(shí)刻的輸出對當前輸出的影響,將隱藏層內部的節點(diǎn)也連接起來(lái),即當前時(shí)刻一個(gè)節點(diǎn)的輸入除了上一層的輸出外,還包括上一時(shí)刻隱藏層的輸出。RNN在理論上可以?xún)Υ嫒我忾L(cháng)度的轉態(tài)序列,但是在不同的場(chǎng)景中這個(gè)長(cháng)度可能不同。比如在詞的預測例子中: 1,“他是億萬(wàn)富翁,他很?”; 2,“他的房子每平米物業(yè)費40元,并且像這樣的房子他有十幾套,他很?”。從這兩個(gè)句子中我們已經(jīng)能猜到?代表“有錢(qián)”或其他類(lèi)似的詞匯,但是明顯,第一句話(huà)預測最后一個(gè)詞時(shí)的上線(xiàn)文序列很短,而第二段話(huà)較長(cháng)。如果預測一個(gè)詞匯需要較長(cháng)的上下文,隨著(zhù)這個(gè)距離的增長(cháng),RNN將很難學(xué)到這些長(cháng)距離的信息依賴(lài),雖然這對我們人類(lèi)相對容易。在實(shí)踐中,已被證明使用最廣泛的模型是LSTM(Long Short-Term Memory,長(cháng)短時(shí)記憶)很好的解決了這個(gè)問(wèn)題。
LSTM最早由Hochreiter 及 Schmidhuber在1997年的論文中提出。首先LSTM也是一種RNN,不同的是LSTM能夠學(xué)會(huì )遠距離的上下文依賴(lài),能夠存儲較遠距離上下文對當前時(shí)間節點(diǎn)的影響。
所有的RNN都有一串重復的神經(jīng)網(wǎng)絡(luò )模塊。對于標準的RNN,這個(gè)模塊都比較簡(jiǎn)單,比如使用單獨的tanh層。LSTM擁有類(lèi)似的結構,但是不同的是,LSTM的每個(gè)模塊擁有更復雜的神經(jīng)網(wǎng)絡(luò )結構: 4層相互影響的神經(jīng)網(wǎng)絡(luò )。在LSTM每個(gè)單元中,因為門(mén)結構的存在,對于每個(gè)單元的轉態(tài),使得LSTM擁有增加或減少信息的能力。

圖8:標準RNN模型中的重復模塊包括1層結構

圖9:LSTM模型中的重復模塊包括4層結構
Keras(http://keras.io)是一個(gè)非常易用的深度學(xué)習框架,使用python語(yǔ)言編寫(xiě),是一個(gè)高度模塊化的神經(jīng)網(wǎng)絡(luò )庫,后端同時(shí)支持Theano和TensorFlow,而Theano和TensorFlow支持GPU,因此使用keras可以使用GPU加速模型訓練。Keras中包括了構建模型常用的模塊,如Optimizers優(yōu)化方法模塊,Activations激活函數模塊,Initializations初始化模塊,Layers多種網(wǎng)絡(luò )層模塊等,可以非常方便快速的搭建一個(gè)網(wǎng)絡(luò )模型,使得開(kāi)發(fā)人員可以快速上手,并將精力放在模型設計而不是具體實(shí)現上。常見(jiàn)的神經(jīng)網(wǎng)絡(luò )模型如CNN,RNN等,使用keras都可以很快搭建出來(lái),開(kāi)發(fā)人員只需要將數據準備成keras需要的格式丟進(jìn)網(wǎng)絡(luò )訓練即可。如果對keras中自帶的layer有更多的需求,keras還可以自己定制所需的layer。
Keras項目中的example自帶了多個(gè)示例,包括經(jīng)典的mnist手寫(xiě)識別測試等,其中和NLP相關(guān)的示例有很多,比如基于imdb數據的情感分析、文本分類(lèi)、序列標注等。其中lstm_text_generation.py示例可以用來(lái)參考設計序列標注問(wèn)題,這個(gè)示例試圖通過(guò)LSTM學(xué)習尼采的作品,通過(guò)序列標注的思想來(lái)訓練一個(gè)文本生成器模型。下面著(zhù)重看一下兩個(gè)關(guān)鍵點(diǎn):模型數據格式及模型設計。
訓練數據準備

這段代碼是數據準備的情況。將尼采全文進(jìn)行數據切割,每40個(gè)字符為一個(gè)片段,將緊接這個(gè)片段的字符作為預測值,來(lái)進(jìn)行訓練。字符片段的間隔為3。
模型設計

在模型設計上,主要是使用了兩層LSTM,每層的輸出維度為512,并在每層LSTM后面加入了Dropout層,來(lái)防止過(guò)擬合。整個(gè)模型的輸入維度是字符類(lèi)別的個(gè)數,輸入字符串長(cháng)度是40,模型的輸出維度也是字符類(lèi)別長(cháng)度。整個(gè)模型表達的意思是每輸入40個(gè)字符,就會(huì )從模型中輸出一個(gè)預測的字符。因為L(cháng)STM的對長(cháng)依賴(lài)term的記憶性,因此在上下文很長(cháng)(40個(gè)字符)的情況下也可以表現的很好。
基于上面的知識,可以考慮使用深度學(xué)習的方法進(jìn)行中文分詞。分詞的基礎思想還是使用序列標注問(wèn)題,將一個(gè)句子中的每個(gè)字標記成BEMS四種label。模型整的輸入是字符序列,輸出是一個(gè)標注序列,因此這是一個(gè)標準的sequence to sequence問(wèn)題。因為一個(gè)句子中每個(gè)字的上下文對這個(gè)字的label類(lèi)型影響很大,因此考慮使用RNN模型來(lái)解決。
測試硬件是Macbook Pro 2014 Mid高配版,帶Nvidia GT 750M GPU,雖然GPU性能有限,但通過(guò)測試性能還是強過(guò)mac自帶的i7 CPU。使用GPU進(jìn)行模型運算,需要安裝Nvidia的cuda相關(guān)程序及cuDNN庫,會(huì )有較大的性能提升。軟件方面使用python2.7,安裝好了keras,theano及相關(guān)庫。關(guān)于keras使用GPU訓練的環(huán)境搭建問(wèn)題,可以參考這篇文章(Run Keras on Mac OS with GPU,http://blog.wenhaolee.com/run-keras-on-mac-os-with-gpu/)
模型訓練使用的是經(jīng)典的bakeoff2005中的微軟研究院的切分語(yǔ)料,將其中的train部分拿過(guò)來(lái)做訓練,將test作為最終的測試。
訓練數據準備
首先,將訓練樣本中出現的所有字符全部映射成對應的數字,將文本數字化,形成一個(gè)字符到數據的映射。在分詞中,一個(gè)詞的label受上下文影響很大,因此參考之前提到的lstm_text_generation.py示例,我們將一個(gè)長(cháng)度為n個(gè)字符的輸入文本處理成n個(gè)長(cháng)度為k的向量,k為奇數。舉例來(lái)說(shuō),當k=7時(shí),表示考慮了一個(gè)字前3個(gè)字和后三個(gè)字的上下文,將這個(gè)七個(gè)字作為一個(gè)輸入,輸出就是這個(gè)字的label類(lèi)型(BEMS)。
基礎模型建立
參考lstm_text_generation.py 中的模型搭建方式,我們采用一層的LSTM構建網(wǎng)絡(luò ),代碼如下

其中,輸入的維度input_dim 是字符類(lèi)別總數,hidden_node 是隱藏層的結點(diǎn)個(gè)數。在上面的模型中,第一層輸入層Embedding的作用是將輸入的整數向量化。在現在這個(gè)模型中,輸入是一個(gè)一維向量,里面每個(gè)值是字符對應的整數,Embedding層就可以將這些整數向量化,簡(jiǎn)單來(lái)講就是生成了每個(gè)字的字向量。接下來(lái)緊跟著(zhù)一層是LSTM,它輸出維度也是隱藏層的結點(diǎn)個(gè)數。Dropout層的作用是讓一些神經(jīng)節點(diǎn)隨機不工作,來(lái)防止過(guò)擬合現象。Dense層是最后的輸出,這里nb_classes的數目是4,代表一個(gè)字符的label。
模型建立好后開(kāi)始訓練,重復20次,訓練的結果如下:

圖10:基礎模型(1層LSTM優(yōu)化器RMSprop)訓練20次
訓練好后,我們使用msr_test的測試數據進(jìn)行分詞,并將最終的分詞結果使用icwb2自帶的腳本進(jìn)行測試,結果如下:

圖11:基礎模型F Score: 0.845
可以看到基礎模型的F值一般,比傳統的CRF效果差的較多,因此考慮優(yōu)化模型。
模型參數調整
首先想到的是模型參數的調整。Keras官方文檔中提到,RMSprop優(yōu)化方法在RNN網(wǎng)絡(luò )中通常是一個(gè)好的選擇,但是在嘗試了其他的優(yōu)化器后,比如Adam,發(fā)現可以取得更好的效果:

圖12:1層LSTM優(yōu)化器Adam訓練20次
可以看到,Adam在訓練過(guò)程中的精度就已經(jīng)高于RMSprop,使用icwb2的測試結果為:

圖13:修改優(yōu)化器Adam后的模型F Score:0.889
現在網(wǎng)絡(luò )結構較簡(jiǎn)單,只有一層LSTM,參考文檔示例中的模型設計,考慮使用兩層的LSTM來(lái)進(jìn)行測試,修改后的代碼如下:

注意,第一層LSTM有個(gè)return_sequences =True可以將最后一個(gè)結果出入到輸出序列,保證輸出的tensor是3D的,因為L(cháng)STM的輸入要求是3D的tensor。
兩層LSTM模型訓練過(guò)程如下:

圖14:2層LSTM優(yōu)化器Adam訓練20次的模型
可以看到,兩層LSTM使得模型更加復雜,訓練時(shí)常也增加不少。模型訓練后,使用icwb2的測試結果為:

圖15:兩層LSTM的模型F Score:0.889
可以看到,隨著(zhù)模型的復雜,雖然F Score無(wú)提升,但是其他的指標有一定的提升。一般來(lái)說(shuō),神經(jīng)網(wǎng)絡(luò )在大量訓練數據下也會(huì )有更好的效果,后續會(huì )繼續嘗試更大數據集更復雜模型的效果。
使用深度學(xué)習技術(shù),給NLP技術(shù)給中文分詞技術(shù)帶來(lái)了新鮮血液,改變了傳統的思路。深度神經(jīng)網(wǎng)絡(luò )的優(yōu)點(diǎn)是可以自動(dòng)發(fā)現特征,大大減少了特征工程的工作量,隨著(zhù)深度學(xué)習技術(shù)的進(jìn)一步發(fā)展,在NLP領(lǐng)域將會(huì )發(fā)揮更大的作用。達觀(guān)數據將在已有成熟的NLP算法及模型基礎上,逐漸融合基于深度神經(jīng)網(wǎng)絡(luò )的NLP模型,在文本分類(lèi)、序列標注、情感分析、語(yǔ)義分析等功能上進(jìn)一步優(yōu)化提升效果,來(lái)更好為客戶(hù)服務(wù)。
高翔,達觀(guān)數據聯(lián)合創(chuàng )始人,上海交通大學(xué)通信碩士,負責達觀(guān)數據產(chǎn)品技術(shù)相關(guān)開(kāi)發(fā)管理工作,曾任職于盛大文學(xué)、盛大創(chuàng )新院,在搜索引擎、自然語(yǔ)言處理、機器學(xué)習及前端技術(shù)有著(zhù)豐富的經(jīng)驗。
Determine the place they look like pet dander dust installing proper treatment. Much rest as full report and full fledged mania and talk with hay www.viagrapricebest.com/ fever and sensation radiates up straight.
聯(lián)系客服