自然語言處理NLP(8)——句法分析b:完全句法分析

echoKangYL發表於2019-03-22

在上一部分中,我們簡單介紹了完全句法分析的概念,並詳細介紹了句法分析的基礎:Chomsky形式文法(自然語言處理NLP(7)——句法分析a:Chomsky(喬姆斯基)形式文法)。
在這一部分中,我們將對完全句法分析進行詳細介紹。

回顧一下,句法分析共有三種型別:完全句法分析、區域性句法分析、依存關係分析

對於完全句法分析,還是NLP領域中常用的三種解決方法:規則法、概率統計法、神經網路方法。
下面我們從這三個方法入手,對完全句法分析演算法進行介紹。

【一】規則句法分析演算法

從上述句法分析樹的生成過程來看,很明顯,句法分析演算法大致上由三種策略:
1.自底向上
2.自頂向下
3.自底向上於自頂向下相結合

自底向上的方法從句子中的詞語出發,基本操作是將一個符號序列匹配歸約為其產生式的左部(用每條產生式左邊的符號來改寫右邊的符號),逐漸減少符號序列直到只剩下開始符S為止。
自頂向下的方法從符號S開始搜尋,用每條產生式右邊的符號來改寫左邊的符號,然後通過不同的方式搜尋並改寫非終結符,直到生成了輸入的句子或者遍歷了所有可能的句子為止。

常用的句法分析演算法有線圖(chart)分析演算法CYK分析演算法等等。
線圖法將每個詞看作一個結點,通過在結點間連邊的方式進行分析,演算法的時間複雜度為 O(Kn3)O(Kn^3),其中nn為句子中詞的個數;
CYK方法通過構造識別矩陣進行分析,時間複雜度相對線圖法有所減小。
具體演算法在這裡不進行贅述,有興趣的朋友們可以自行查閱相關資料~

無論對於上述任何一種方法而言,都由一個共同的缺點:難以區分歧義結構
因此,引入概率統計法進行句法分析。

【二】概率統計句法分析演算法

利用概率統計法進行句法分析,主要採用概率上下文無關文法(PCFG),它是CFG的概率拓廣,可以直接統計語言學中詞與詞、詞與片語以及片語與片語之間的規約資訊,並且可以由語法規則生成給定句子的概率。

在這裡多說一句,在NLP領域中,如果引入了概率,那麼這種方法的作用很有可能是消歧,因為我們可以根據概率的大小對可能出現的情況進行選擇。

而概率上下文無關文法(PCFG)的主要任務有兩個:
1.句法分析樹的消歧
2.求最佳分析樹
二者之間有很大的相似之處。

概率上下文無關文法(PCFG)

一個PCFG由如下五個部分組成:
1.一個非終結符號集 NN
2.一個終結符號集 \sum
3.一個開始非終結符 SNS∈N
4.一個產生式集 RR
5.對任意產生式 rRr∈R,其概率為 P(r)P(r),產生式具有形式: XY,PX\rightarrow Y, P
其中,XN,Y(N)X∈N,Y∈(N∪\sum)^*,且 λ(Xλ)=1\sum_λ(X\rightarrow λ)=1

前四個部分與Chomsky形式文法中的概念類似,在這裡不再進行贅述。

舉個例子(這裡只列出重寫規則——產生式集 RR):
PCFG
朋友們可能還是沒有一個直觀的瞭解,那麼我們來對比一下PCFG和CFG。
對於一個句子‘Astronomers saw stars with ears’,分別用PCFG和CFG進行分析:
CFG與PCFG
對於PCFG圖中的概率值如何使用,朋友們可能已經有了一些想法,我們在後文中會提到,在這裡把它放下,先考慮一下各個概率值是怎麼來的。

與HMM模型引數學習的過程相類似(自然語言處理NLP(4)——序列標註a:隱馬爾科夫模型(HMM)),對於有大規模標註的樹庫語料,利用最大似然估計(MLE)對概率值進行統計;對於沒有大規模語料庫的情況,藉助EM迭代演算法估計PCFG的概率引數。
從個人理解的角度來看,最大似然估計的過程就是一個數(三聲)數(四聲)的過程,具體過程與在之前章節提到的類似,不理解的朋友們可以參考:自然語言處理NLP(2)——統計語言模型、語料庫

在瞭解了PCFG基本結構和其中的P是怎麼來的之後,我們考慮一下這個P是幹什麼的。
其實很簡單,每個規則的概率合在一起能做什麼,用來計算整棵樹出現的概率唄。
在此之前,我們探討一下計算分析樹概率的基本假設:
1.位置不變性:子樹的概率與其管轄的詞在整個句子中所處的位置無關。
2.上下文無關性:子樹的概率與子樹管轄範圍以外的詞無關。
3.祖先無關性:子樹的概率與推匯出該子樹的祖先結點無關。
三個假設都很好理解,在這裡就不做過多解釋了。

還是以上例分析:
PCFG
生成的整棵句法樹的概率就是以這種方式計算出來的(其實就是概率值按照樹結構的累乘,很容易理解)。

有了概率,消歧就很容易了:
假設上面的句子可以生成兩個不同的句法樹 t1,t2t_1,t_2
句法樹消歧
很明顯,選擇概率大的句法樹 t1t_1 作為句法分析的結果。

對於給定的句子 SS ,如有兩棵句法分析樹的概率不等且 P(t1)>P(t2)P(t_1)>P(t_2),則分析結果 t1t_1 正確的可能性大於 t2t_2,據此可以進行句法歧義消解。

特別地,語句在文法的概率等於所有分析樹概率之和。

有了概率,有了選擇分析樹的方法,對於給定的一個句子,能不能求出最佳分析樹呢?
很明顯,我們有一種稍顯笨拙的方法:窮舉法——找到每一個可能的句法樹,計算概率,然後取概率最大的句法樹作為分析結果。但是這種方法有很大的弊端:效率非常低,尤其是當句子較長,生成句法樹有多棵時,效率極低。

之前在HMM評估問題和解碼問題中(自然語言處理NLP(4)——序列標註a:隱馬爾科夫模型(HMM)),我們曾經介紹過以動態規劃改進窮舉演算法的Viterbi演算法,對於求解最佳分析樹問題,也有類似的演算法——PCFG Viterbi演算法

PCFG Viterbi演算法

首先,與Viterbi演算法類似,先定義PCFG Viterbi演算法中的變數:
γij(A)γ_{ij}(A):非終結符 AA 推匯出語句 WW 中子字串 wiwi+1...wjw_iw_{i+1}...w_j 的最大概率
ψi,j\psi_{i,j}:記憶字串 wiwi+1...wjw_iw_{i+1}...w_j 的Viterbi語法分析結果

此外,我們的輸入是文法 G(S)G(S) 以及語句 W=w1w2...wnW=w_1w_2...w_n

PCFG Viterbi演算法流程如下:
1.初始化:
γii(A)=p(Awi),AVN,1inγ_{ii}(A)=p(A \rightarrow w_i), \quad A∈V_N, \quad 1\le i \le n
2.歸納計算:對於j=1,2,...,n,i=1,2,...,njj=1,2,...,n, \quad i=1,2,...,n-j,重複下列計算
γi(i+j)(A)=maxB,CVN;iki+jp(ABC)γik(B)γ(k+1)(i+j)(C)γ_{i(i+j)}(A)=\displaystyle\max_{B,C∈V_N;i \le k \le i+j}p(A \rightarrow BC)γ_{ik}(B)γ_{(k+1)(i+j)}(C)
ψi(i+j)(A)=maxB,CVN;iki+jp(ABC)γik(B)γ(k+1)(i+j)(C)\psi_{i(i+j)}(A)=\displaystyle\max_{B,C∈V_N;i \le k \le i+j}p(A \rightarrow BC)γ_{ik}(B)γ_{(k+1)(i+j)}(C)

輸出:分析樹根結點為 SS (文法開始符號),從ψ1,n(S)\psi_{1,n}(S)開始回溯,得到最優樹。

上述過程可能有些抽象,我們來舉個例子。
假設有如下PCFG:
PCFG示例
輸入的句子為:‘John ate fish with bone’,求它的最佳分析樹。
過程如下圖所示:
PCFG Viterbi
上圖中,PCFG Viterbi演算法是從最底層開始執行的:最底層的豎線連結相當於初始化過程;
此後,按照上面描述的演算法過程分別計算兩個詞、三個詞(圖中的結點)構成文法的概率,直到最後一層。
最後,對整個句子進行回溯即可得到最佳分析樹:
結果示例

【三】神經網路句法分析

在介紹神經網路句法分析方法之前,首先要了解遞迴神經網路RvNN。

很明顯,在句法分析中,我們希望將句子按照結構進行分解,得到分析樹。
以此為目標,RvNN的基本思想很簡單:希望將問題在結構上分解為一系列相同的“單元”,單元的神經網路可以在結構上展開,且能沿展開方向傳遞資訊。
具體有關RvNN的內容在這裡就不再贅述,不瞭解的朋友們可以參考部落格:神經網路基礎:DNN、CNN、RNN、RvNN、梯度下降、反向傳播,裡面有很詳細的介紹。

現在,我們有了RvNN,想要對一句話進行句法分析,要怎麼做呢?
其實過程與上述PCFG Viterbi演算法有相似之處,我們來舉個例子。

假設有一句話:“我弟弟準備一切用品”,我們已經對它做好了詞法分析,於是這句話成了這個樣子:
我/PN 弟弟/NN 準備/VV 一切/QP 用品/NN”(空格表示分詞)。

在這裡再次強調一下,所有句法分析的輸入一定是詞法分析之後具有詞性等資訊的,已經分好詞的句子

然後,我們將分好詞的句子輸入神經網路:
神經網路句法分析1
此時,神經網路可以得到“我弟弟”、“弟弟準備”、“準備一切”、“一切用品”這四種組合的打分,假設“我弟弟”的打分最高,那麼神經網路將選出這兩個詞進行組合。
組合之後,“我弟弟”就成了一個詞,各組成部分不可單獨與句子中的其他詞進行組合,網路結構變成了這個樣子:
神經網路句法分析2
接下來,繼續對相鄰兩個詞進行組合:
神經網路句法分析3
假設這一步中“一切用品”的打分最高,神經網路選出這兩個詞進行組合,各組成部分不可再單獨與句子中的其他詞進行組合,網路結構調整如下:
神經網路句法分析4
我們可以看到,“準備一切”的組合已經消失,因為“一切”已經和“用品”組成一個詞“一切用品”。
而“準備”還未與任何詞(或片語)進行組合,因此計算“我弟弟準備”和“準備一切用品”的打分,假設後者得分更高。
那麼下一步:
神經網路句法分析5
最後,我們得到:
神經網路句法分析6
至此,句法分析完成,我們得到了句向量和該種結構的打分。

【四】句法分析評價標準

在瞭解了各種句法分析方法之後,我們來看看如何評價一個句法分析結果的好壞。
分析樹中 非終結符節點 (短語)標記格式如下:
XP-(起始位置:終止位置)

其中,XP為短語名稱,(起始位置:終止位置)為該節點的跨越範圍,起始位置指該節點所包含的子節點的起始位置,終止位置為該節點所包含的子節點的終止位置。
舉個例子:
短語標記格式
效能指標依然是老三樣:精度(precision, P)、召回率(recall, R)以及F值。
對這三個概念不瞭解的朋友們可以參考:自然語言處理NLP(6)——詞法分析中的第五部分:詞法分析評價指標

假設我們有這樣一句話:
Sales executives were examining the figures with great care yesterday.
我們給出的標準句法分析答案如下:
標準答案
模型給出的答案如下:
系統分析結果
二者結果中紅色部分是相同的部分,表示系統分析結果只有3個短語與標準答案完全一樣,且標準輸出和系統分析結果都有8個短語,那麼:
P=3/8R=3/8F=3/8P = 3/8 \quad \quad R = 3/8 \quad \quad F = 3/8

在這一部分中,我們主要介紹了完全句法分析,並詳細介紹瞭解決完全句法分析問題的三種方法:規則法、概率法、神經網路法。
在下一部分的內容中,我們將會介紹句法分析領域的另外兩個主題:區域性句法分析、依存關係分析

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

謝謝!

相關文章