1. 程式人生 > 實用技巧 >NLP入門概覽(8) ——句法分析b:完全句法分析

NLP入門概覽(8) ——句法分析b:完全句法分析

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

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

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

1.規則句法分析演算法

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

  3.自底向上於自頂向下相結合

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

  常用的句法分析演算法有線圖(chart)分析演算法、CYK分析演算法等等。
  線圖法將每個詞看作一個結點,通過在結點間連邊的方式進行分析,演算法的時間複雜度為 O ( K n 3 ) O(Kn^3) O(Kn3),其中 n n

n為句子中詞的個數;
  CYK方法通過構造識別矩陣進行分析,時間複雜度相對線圖法有所減小。
  具體演算法在這裡不進行贅述,有興趣的朋友們可以自行查閱相關資料~

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

2.概率統計句法分析演算法

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

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

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

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

  一個PCFG由如下五個部分組成:
  1.一個非終結符號集 N N N
  2.一個終結符號集 $ \sum$
  3.一個開始非終結符 S ∈ N S∈N SN
  4.一個產生式集 R R R
  5.對任意產生式 r ∈ R r∈R rR,其概率為 P ( r ) P(r) P(r),產生式具有形式: X → Y , P X\rightarrow Y, P XY,P
  其中, X ∈ N , Y ∈ ( N ∪ ∑ ) ∗ X∈N,Y∈(N∪\sum)^* XN,Y(N),且 ∑ λ ( X → λ ) = 1 \sum_λ(X\rightarrow λ)=1 λ(Xλ)=1
  前四個部分與Chomsky形式文法中的概念類似,在這裡不再進行贅述。

  舉個例子(這裡只列出重寫規則——產生式集 R R R):
在這裡插入圖片描述

  朋友們可能還是沒有一個直觀的瞭解,那麼我們來對比一下PCFG和CFG。
  對於一個句子‘Astronomers saw stars with ears’,分別用PCFG和CFG進行分析:
在這裡插入圖片描述

  對於PCFG圖中的概率值如何使用,朋友們可能已經有了一些想法,我們在後文中會提到,在這裡把它放下,先考慮一下各個概率值是怎麼來的。

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

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

  還是以上例分析:
在這裡插入圖片描述

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

  有了概率,消歧就很容易了:
  假設上面的句子可以生成兩個不同的句法樹$ t_1,t_2$:
在這裡插入圖片描述

  很明顯,選擇概率大的句法樹 t 1 t_1 t1作為句法分析的結果。

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

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

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

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

2.2 PCFG Viterbi演算法

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

  此外,我們的輸入是文法$ G(S)$以及語句 W = w 1 w 2 . . . w n W=w_1w_2...w_n W=w1w2...wn
  PCFG Viterbi演算法流程如下:
  1.初始化:
γ i i ( A ) = p ( A → w i ) , A ∈ V N , 1 ≤ i ≤ n γ_{ii}(A)=p(A \rightarrow w_i), \quad A∈V_N, \quad 1\le i \le n γii(A)=p(Awi),AVN,1in

  2.歸納計算:對於 j = 1 , 2 , . . . , n , i = 1 , 2 , . . . , n − j j=1,2,...,n, \quad i=1,2,...,n-j j=1,2,...,n,i=1,2,...,nj,重複下列計算
γ i ( i + j ) ( A ) = max ⁡ B , C ∈ V N ; i ≤ k ≤ i + j p ( A → B C ) γ i k ( 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)=B,CVN;iki+jmaxp(ABC)γik(B)γ(k+1)(i+j)(C)

ψ i ( i + j ) ( A ) = max ⁡ B , C ∈ V N ; i ≤ k ≤ i + j p ( A → B C ) γ i k ( 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) ψi(i+j)(A)=B,CVN;iki+jmaxp(ABC)γik(B)γ(k+1)(i+j)(C)

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

  上述過程可能有些抽象,我們來舉個例子。
  假設有如下PCFG:
在這裡插入圖片描述

  輸入的句子為:‘John ate fish with bone’,求它的最佳分析樹。
  過程如下圖所示:
在這裡插入圖片描述

  上圖中,PCFG Viterbi演算法是從最底層開始執行的:最底層的豎線連結相當於初始化過程;
  此後,按照上面描述的演算法過程分別計算兩個詞、三個詞(圖中的結點)構成文法的概率,直到最後一層。
  最後,對整個句子進行回溯即可得到最佳分析樹:
在這裡插入圖片描述

2.3 神經網路句法分析

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

  很明顯,在句法分析中,我們希望將句子按照結構進行分解,得到分析樹。

  以此為目標,RvNN的基本思想很簡單:希望將問題在結構上分解為一系列相同的“單元”,單元的神經網路可以在結構上展開,且能沿展開方向傳遞資訊。

  具體有關RvNN的內容在這裡就不再贅述

  現在,我們有了RvNN,想要對一句話進行句法分析,要怎麼做呢?

  其實過程與上述PCFG Viterbi演算法有相似之處,我們來舉個例子。

  假設有一句話:“我弟弟準備一切用品”,我們已經對它做好了詞法分析,於是這句話成了這個樣子:

  “我/PN 弟弟/NN 準備/VV 一切/QP 用品/NN”(空格表示分詞)。

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

  然後,我們將分好詞的句子輸入神經網路:
在這裡插入圖片描述

  此時,神經網路可以得到“我弟弟”、“弟弟準備”、“準備一切”、“一切用品”這四種組合的打分,假設“我弟弟”的打分最高,那麼神經網路將選出這兩個詞進行組合。
  組合之後,“我弟弟”就成了一個詞,各組成部分不可單獨與句子中的其他詞進行組合,網路結構變成了這個樣子:
在這裡插入圖片描述

  接下來,繼續對相鄰兩個詞進行組合:
在這裡插入圖片描述

  假設這一步中“一切用品”的打分最高,神經網路選出這兩個詞進行組合,各組成部分不可再單獨與句子中的其他詞進行組合,網路結構調整如下:
在這裡插入圖片描述

  我們可以看到,“準備一切”的組合已經消失,因為“一切”已經和“用品”組成一個詞“一切用品”。
  而“準備”還未與任何詞(或片語)進行組合,因此計算“我弟弟準備”和“準備一切用品”的打分,假設後者得分更高。
  那麼下一步:
在這裡插入圖片描述

  最後,我們得到:
在這裡插入圖片描述

  至此,句法分析完成,我們得到了句向量和該種結構的打分。

4.句法分析評價標準

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

  其中,XP為短語名稱,(起始位置:終止位置)為該節點的跨越範圍,起始位置指該節點所包含的子節點的起始位置,終止位置為該節點所包含的子節點的終止位置。
  舉個例子:
在這裡插入圖片描述

  效能指標依然是老三樣:精度(precision, P)、召回率(recall, R)以及F值。
  對這三個概念不瞭解的朋友們可以參考:NLP入門概覽(6)——詞法分析中的第五部分:詞法分析評價指標。

  假設我們有這樣一句話:
  ‘Sales executives were examining the figures with great care yesterday.’
  我們給出的標準句法分析答案如下:
在這裡插入圖片描述

  模型給出的答案如下:
在這裡插入圖片描述

  二者結果中紅色部分是相同的部分,表示系統分析結果只有3個短語與標準答案完全一樣,且標準輸出和系統分析結果都有8個短語,那麼:
P = 3 / 8 R = 3 / 8 F = 3 / 8 P = 3/8 \quad \quad R = 3/8 \quad \quad F = 3/8 P=3/8R=3/8F=3/8

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

參考文獻

[1] https://blog.csdn.net/echoKangYL/article/details/88342869