自然語言處理NLP(6)——詞法分析

echoKangYL發表於2019-02-26

在上一部分中,我們介紹了NLP領域中的一個基本問題:序列標註問題,並對解決該問題的三種方法:HMM、CRF、RNN+CRF進行了介紹。
在這一部分中,我們將在語言結構層面對詞法分析進行介紹。

在瞭解了NLP架構之後(在部落格:自然語言處理NLP(3)——神經網路語言模型、詞向量中有過介紹,忘記了的朋友們可以翻回去看看),一定還記得這樣一張圖:
NLP架構
現在,我們已經瞭解了自然語言研究層面的基本概念:語言模型、序列標註,下一步就是對“詞”的分析和處理。

還是那句話,規則法、概率統計法、深度學習法都只是處理NLP問題的方法,歸根結底最重要的還是NLP問題。

【一】詞法分析

是最小的能夠獨立運用的語言單位,因此,詞法分析是其他一切自然語言處理問題(例如:句法分析、語義分析、文字分類、資訊檢索、機器翻譯、機器問答等)的基礎,會對後續問題產生深刻的影響。
詞
而詞法分析的任務就是:將輸入的句子字串轉換成詞序列並標記出各詞的詞性

值得注意的是,這裡所說的“字”並不僅限於漢字,也可以指標點符號、外文字母、注音符號和阿拉伯數字等任何可能出現在文字中的文字元號,所有這些字元都是構成詞的基本單元。
從形式上看,詞是穩定的字的組合。

很明顯,不同的語言詞法分析具體做法是不同的。
以英語和漢語為例作為對比:
詞法分析任務
對於中文詞法分析而言,具體任務如下圖所示:
以句子:“警察正在詳細調查事故原因” 為例。
中文詞法分析任務中文分詞詞法分析包括兩個主要任務:
1.自動分詞:將輸入的漢字串切成詞串
2.詞性標註:確定每個詞的詞性並加以標註

兩個任務分別面臨著一些問題:
1.自動分詞:歧義問題、未登入詞問題、分詞標準問題
2.詞性標註:詞性兼類歧義問題
(這些問題的具體含義我們將在後文進行介紹)

處理這些問題的方法依然有三種:規則法、概率統計法、深度學習法。
在這裡,值得注意的是,由於不同的方法有其不同的優勢和短板,因此,一個成熟的分詞系統,不可能單獨依靠某一種演算法來實現,而需要綜合不同的演算法來處理不同的問題。

【二】自動分詞面臨的問題

上面我們提到,自動分詞面臨著三個問題:歧義問題、未登入詞問題、分詞標準問題,下面我們將對它們一一進行解釋。

歧義

這裡的歧義指的是切分歧義:對同一個待切分字串存在多個分詞結果。分為交集型歧義、組合型歧義和混合歧義

交集型歧義:字串abc既可以切分成a/bc,也可以切分成ab/c。其中,a、bc、ab、c是詞。
舉個例子:
“白天鵝”——“白天/鵝”、“白/天鵝”;
“研究生命”——“研究/生命”、“研究生/命”
至於具體要取哪一中分詞方法,需要根據上下文來推斷。
也許對於我們來說,這些歧義很好分辨,但是對計算機而言,這是一個很重要的問題。

針對交集型歧義,提出鏈長這一概念:交集型切分歧義所擁有的交集串的個數稱為鏈長。
舉個例子(朋友們可以自己劃分一下,還蠻有趣的):
“中國產品質量”:{國、產、品、質},鏈長為4;
“部分居民生活水平”:{分、居、民、生、活、水},鏈長為6.

組合型歧義:若ab為詞,而a和b在句子中又可分別單獨成詞。
舉個例子:
“門把手弄壞了”——“門/把手/弄/壞/了”、“門/把/手/弄/壞/了”
“把手”本身是一個詞,分開之後由可以分別成詞。

混合歧義:以上兩種情況通過巢狀、交叉組合等而產生的歧義。
舉個例子:
“這篇文章寫得太平淡了”,其中“太平”是組合型歧義,“太平淡”是交集型歧義。

通過上面的介紹可以看出,歧義問題在漢語中是十分常見的。

未登入詞

未登入詞是指:詞典中沒有收錄過的人名、地名、機構名、專業術語、譯名、新術語等。該問題在文字中的出現頻度遠遠高於歧義問題。

未登入詞型別:
1.實體名稱:漢語人名(張三、李四)、漢語地名(黃山、韓村)、機構名(外貿部、國際衛生組織);
2.數字、日期、貨幣等;
3.商標字號(可口可樂、同仁堂);
4.專業術語(全球資訊網、貝葉斯演算法);
5.縮略語(五講四美、計生辦);
6.新詞語(美刀、卡拉OK)

未登入詞問題是分詞錯誤的主要來源。

分詞標準

對於 “漢語中什麼是詞” 這個問題,不僅普通人有詞語認識上的偏差,即使是語言專家,在這個問題上依然有不小的差異。

缺乏統一的分詞規範和標準” 這種問題也反映在分詞語料庫上,不同語料庫的資料無法直接拿過來混合訓練。

【三】自動分詞技術方法

在瞭解自動分詞所面臨的問題之後,我們再來介紹進行自動分詞的技術方法。基本方法還是三種:規則法、概率統計法、深度學習法。

A. 基於字典、詞庫匹配的分詞方法(機械分詞法)

該類演算法是按照一定的策略將待匹配的字串和一個已建立好的“充分大的”詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。

基於詞典的分詞演算法在傳統分詞演算法中是應用最廣泛、分詞速度最快的一類演算法。
其優點是實現簡單、演算法執行速度快;
缺點是嚴重依賴詞典,無法很好的處理分詞歧義和未登入詞。

這類方法主要有:
1.正向最大匹配法(從左到右)
2.逆向最大匹配法(從右到左)
3.最少切分法(使每一句中切出的詞數最少)
4.雙向最大匹配法(進行從左到右、從右到左兩次掃描)

(1)最大匹配法

基本思想:先建立一個最長詞條字數為 LL 的詞典,然後按正向(逆向)取句子前 LL 個字查詞典,如查不到,則去掉最後一個字繼續查,一直到找著一個詞為止。
最大匹配演算法以及其改進方案是基於詞典和規則的。其優點是實現簡單,演算法執行速度快,缺點是嚴重依賴詞典,無法很好的處理分詞歧義和未登入詞。

舉個例子:“他是研究生物化學的”(假設詞典中最長詞條字數為7)
正向結果:“他/是/研究生/物化/學/的”
逆向結果:“他/是/研究/生物/化學/的”

(2)最少分詞法(最短路徑法)

基本思想:假設待切分字串為:S=c1c2...cnS=c_1c_2...c_n,其中 cic_i 為單個字,串長為 nnn1n≥1)。建立一個結點數為 n+1n+1 的切分有向無環圖 GG,若w=cici+1...cjw=c_ic_{i+1}...c_j0<i<jn0<i<j≤n)是一個詞,則在結點 vi1,vjv_{i-1},v_j 之間建立有向邊。從產生的所有路徑中,選擇路徑最短的(詞數最少的)作為最終分詞結果。

舉個例子:“他說的確實在理”
整個過程如下圖所示:
最少分詞法
具體過程在這裡不再贅述,有興趣的朋友們可以自行查閱相關資料~

從圖中我們可以看出,由於每條邊的權重都為1,我們可以直接使用Dijkstra演算法求取結果。
可能的結果有兩種:“他/說/的確/實在/理”、“他/說/的/確實/在理”。

該種方法的優點在於:需要的語言資源(詞表)不多;
缺點在於:對許多歧義欄位難以區分,最短路徑有多條時,選擇最終的輸出結果缺乏應有的標準;字串長度較大和選取的最短路徑數增大時,長度相同的路徑數急劇增加,選擇正確結果的困難越來越大。

B. 基於統計的方法

在上述介紹中,我們可以發現,基於規則的方法對歧義問題的解決能力較弱,而基於統計的方法具有較強的歧義區分能力,但需要大規模標註(或預處理)語料庫的支援,需要的系統開銷也較大。

(1)基於詞的分詞方法

基於詞的生成模型主要考慮詞彙之間以及詞彙內部字與字之間的依存關係,大部分基於詞的分詞方法採用的都是生成式模型。
該種分詞方法的基本思想很簡單:
WSeq=argmaxWseqp(WSeqc1c2...cn)W_{Seq}^*=argmax_{W_{seq}}p(W_{Seq}|c_1c_2...c_n)
即,找到概率最大的切分。

在這裡介紹兩種基於詞的分詞方法:n元語法模型法、改進最短路徑法。

n元語法模型方法

利用n元語法計算整個句子的概率切分。

舉個例子:“研究生物學”
我們利用二元模型進行計算,即:
p(s)=p(w1)p(w2w1)p(w3w2)...p(wnwn1)p(s)=p(w_1)p(w_2|w_1)p(w_3|w_2)...p(w_n|w_{n-1})
整個過程如下圖所示:
基於詞的分詞方法
通過這張圖,我們可以求得最大概率切分,即為最後的分詞結果。

改進最短路徑法(統計粗分模型)

在規則法中,我們介紹了最短路徑法,每條邊的權重都為1。
改進最短路徑法對最短路徑法進行了改進,將邊的權重改為該詞出現頻率p(wi)p(w_i),那麼最終選取切分結果的標準則變為:
(1)maxp(W)=i=1mp(wi)max \quad p(W) = \prod_{i=1}^mp(w_i)\tag{1}
其中,W=w1w2...wmW=w_1w_2...w_m

但是很明顯,如果這樣的話就沒辦法用Dijkstra最短路徑演算法了。
為了解決這個問題,將(1)式改寫為如下形式:

(2)p(W)=ln[p(W)]=i=1m{ln[p(wi)]}p^*(W)=-ln[p(W)]=\sum_{i=1}^m\{-ln[p(w_i)]\}\tag{2}
這樣,就可以將求 p(W)p(W) 的最大值問題轉換為求 p(W)p^*(W) 的最小值問題,我們所做的,只是將邊的權重 p(wi)p(w_i) 改寫為 ln[p(wi)]-ln[p(w_i)],這樣,就可以繼續用Dijkstra演算法進行求解了。

(2)基於字的序列標註分詞方法

該種方法利用序列標註的方法進行分詞,具體做法如下圖所示:
序列標註分詞
常用的方法與序列標註方法相同,有HMM、CRF、RNN+CRF等。
對序列標註不熟悉的朋友們可以參看部落格:
自然語言處理NLP(4)——序列標註a:隱馬爾科夫模型(HMM)
自然語言處理NLP(5)——序列標註b:條件隨機場(CRF)、RNN+CRF

基於字的序列標註分詞方法主要的優勢在於能夠平衡地看待詞表詞和未登入詞的識別問題,具有較強的歧義區分能力和未登入詞識別能力。但需要大規模標註(預處理) 語料庫的支援,需要的系統開銷也較大,而且訓練文字的選擇將影響分詞結果。

C. 深度學習法

該種方法主要是利用深度神經網路模型來對中文進行分詞,主要用到了RNN、CNN、GNN等深度神經網路來自動地獲取特徵,從而代替傳統方法中手工定義的特徵。
將從句子中獲取簡單的特徵改為獲取複雜的特徵,從單一語料庫單一標準的模型改進為可以使用多語料進行分詞等等。

模型結構與序列標註問題類似:
神經網路分詞
由於該部分內容只是序列標註在分詞問題中的應用,所以具體細節就不再贅述,有興趣的朋友們可以參看部落格:自然語言處理NLP(5)——序列標註b:條件隨機場(CRF)、RNN+CRF

【四】詞性標註

詞性是詞彙的基本語法屬性,通常稱為詞類。

上文中我們提到,詞性標註遇到的最重要的問題就是詞性兼類問題。那麼,為什麼會有詞性兼類問題呢?
其實,在任何一種語言中,詞性兼類問題都普遍存在,漢語中尤為明顯。造成詞性兼類問題的原因主要有以下幾點:
1.漢語缺乏詞形態變化,無法通過詞形變化判別詞類;
2.漢語中,常用詞兼類現象嚴重,比如:
“這個人什麼都好,就是好酗酒。”
其中,第一個“好”讀三聲,是形容詞,而第二個“好”讀四聲,是動詞。
3.沒有統一的漢語詞類劃分標準,有些語料劃分很粗糙。

在這樣的背景下,詞性標註問題往往被轉化為序列標註問題來解決。由於序列標註問題在前面的部分中已經有過介紹,所以在這裡就不加以贅述,不瞭解的朋友們可以參考部落格:
自然語言處理NLP(4)——序列標註a:隱馬爾科夫模型(HMM)
自然語言處理NLP(5)——序列標註b:條件隨機場(CRF)、RNN+CRF

【五】詞法分析評價指標

詞法分析中,通常用正確率、召回率、F值來評價系統的效能。

正確率(precision,P):測試結果中正確結果的個數佔系統所有輸出結果的比例,即 :
P=nN100%P=\frac{n}{N}*100\%
召回率(recall,R):測試結果中正確結果的個數佔標準答案總數的比例,即:
R=nM100%R=\frac{n}{M}*100\%
F值(F-measure):正確率和召回率的綜合值,即:
Fmeasure=(β2+1)PRβ2P+R100%F-measure=\frac{(β^2+1)*P*R}{β^2*P+R}*100\%
通常情況下,取 β=1β=1,稱為F1值,即:
F1=2PRP+R100%F1=\frac{2*P*R}{P+R}*100\%

看過上面的公式之後,大家可能還是覺得一頭霧水,我們來舉個例子:

假設某個漢語分詞系統在一測試集上輸出5260個分詞結果,而標準答案是4510個詞語,根據這個答案,系統切分出來的結果中有4120個是正確的。
那麼:
正確率PP=41205260=78.33%P=\frac{4120}{5260}=78.33\%
召回率RR=41204510=91.35%R=\frac{4120}{4510}=91.35\%
F1值F1=2PRP+R=278.33%91.35%78.33%+91.35%=84.34%F1=\frac{2*P*R}{P+R}=\frac{2*78.33\%*91.35\%}{78.33\%+91.35\%}=84.34\%

對正確率、召回率、F1值更細節的內容感興趣的朋友們可以參考部落格:機器學習中的一些基本概念,在這裡就不再贅述。

值得注意的是,在很多機器學習問題中,都常用這三個值來衡量系統效能。

在本節內容的結尾,再多說一句題外話:
再次強調一下,神經網路僅僅是處理NLP問題的一種方法,絕不是NLP的全部,它在NLP上的成功應用的領域往往是準確率不高或者執行效率很低的場合,例如問答系統、機器翻譯、句法分析。在準確率比較高或者執行效率不錯的場景下,利用深度學習方法會得不償失。

這一部分中,我們介紹了NLP領域最基本的一類問題:詞法分析。它是其他一切NLP問題的基礎,會對後續問題的處理產生很大的影響。
在下一部分中,我們會在“詞”的基礎上更進一步,介紹NLP領域更高層次的問題:句法分析。

如果本文中某些表述或理解有誤,歡迎各位大神批評指正。

謝謝!

相關文章