NLP | 自然語言處理 - 語法解析(Parsing, and Context-Free Grammars)

原文:http://blog.csdn.net/lanxu_yy/article/details/37700841


什麼是語法解析?

在自然語言學習過程中,每個人一定都學過語法,例如句子可以用主語、謂語、賓語來表示。在自然語言的處理過程中,有許多應用場景都需要考慮句子的語法,因此研究語法解析變得非常重要。

語法解析有兩個主要的問題,其一是句子語法在計算機中的表達與存儲方法,以及語料數據集;其二是語法解析的算法。

對於第一個問題,我們可以用樹狀結構圖來表示,如下圖所示,S表示句子;NP、VP、PP是名詞、動詞、介詞短語(短語級別);N、V、P分別是名詞、動詞、介詞。


實際存儲的時候上述的樹可以表示爲(S (NP (N Boeing)) (VP (V is) (VP (V located) (PP (P in) (NP (N Seattle))))))。互聯網上已經有成熟的、手工標註的語料數據集,例如The Penn Treebank Project (Penn Treebank II Constituent Tags)。

對於第二個問題,我們需要有合適的算法來處理。這也是我們本章將要討論的內容。

上下文無關語法(Context-Free Grammer)

爲了生成句子的語法樹,我們可以定義如下的一套上下文無關語法。
1)N表示一組非葉子節點的標註,例如{S、NP、VP、N...}
2)Σ表示一組葉子結點的標註,例如{boeing、is...}
3)R表示一組規則,每條規則可以表示爲X->Y1Y2...Yn,X∈N,Yi∈(N∪Σ)
4)S表示語法樹開始的標註

舉例來說,語法的一個語法子集可以表示爲下圖所示。當給定一個句子時,我們便可以按照從左到右的順序來解析語法。例如,句子the man sleeps就可以表示爲(S (NP (DT the) (NN man)) (VP sleeps))。


這種上下文無關的語法可以很容易的推導出一個句子的語法結構,但是缺點是推導出的結構可能存在二義性。例如下面兩張圖中的語法樹都可以表示同一個句子。常見的二義性問題有:1)單詞的不同詞性,如can一般表示“可以”這個情態動詞,有時表示罐子;2)介詞短語的作用範圍,如VP PP PP這樣的結構,第二個介詞短語可能形容VP,也可能形容第一個PP;3)連續的名字,如NN NN NN。
  

概率分佈的上下文無關語法(Probabilistic Context-Free Grammar)

由於語法的解析存在二義性,我們就需要找到一種方法從多種可能的語法樹種找出最可能的一棵樹。一種常見的方法既是PCFG (Probabilistic Context-Free Grammar)。如下圖所示,除了常規的語法規則以外,我們還對每一條規則賦予了一個概率。對於每一棵生成的語法樹,我們將其中所以規則的概率的乘積作爲語法樹的出現概率。


綜上所述,當我們或得多顆語法樹時,我們可以分別計算每顆語法樹的概率p(t),出現概率最大的那顆語法樹就是我們希望得到的結果,即arg max p(t)。

訓練算法

我們已經定義了語法解析的算法,而這個算法依賴於CFG中對於N、Σ、R、S的定義以及PCFG中的p(x)。上文中我們提到了Penn Treebank通過手工的方法已經提供了一個非常大的語料數據集,我們的任務就是從語料庫中訓練出PCFG所需要的參數。
1)統計出語料庫中所有的N與Σ;
2)利用語料庫中的所有規則作爲R;
3)針對每個規則A -> B,從語料庫中估算p(x) = p(A -> B) / p(A);

在CFG的定義的基礎上,我們重新定義一種叫Chomsky的語法格式。這種格式要求每條規則只能是X -> Y1 Y2或者X -> Y的格式。實際上Chomsky語法格式保證生產的語法樹總是二叉樹的格式,同時任意一棵語法樹總是能夠轉化成Chomsky語法格式。

語法樹預測算法

假設我們已經有一個PCFG的模型,包含N、Σ、R、S、p(x)等參數,並且語法樹總數Chomsky語法格式。當輸入一個句子x1, x2, ... , xn時,我們要如何計算句子對應的語法樹呢?
第一種方法是暴力遍歷的方法,每個單詞x可能有m = len(N)種取值,句子長度是n,每種情況至少存在n個規則,所以在時間複雜度O(m*n*n)的情況下,我們可以判斷出所有可能的語法樹並計算出最佳的那個。
第二種方法當然是動態規劃,我們定義w[i, j, X]是第i個單詞至第j個單詞由標註X來表示的最大概率。直觀來講,例如xi, xi+1, ... , xj,當X=PP時,子樹可能是多種解釋方式,如(P NP)或者(PP PP),但是w[i, j, PP]代表的是繼續往上一層遞歸時,我們只選擇當前概率最大的組合方式。特殊情況下,w[i, i, X] = p(X -> xi)。因此,動態規劃的方程可以表示爲w[i, j, X] = max (p(X -> Y Z) * w(i, s, Y) * w(s+1, j, Z))。關於動態規劃方法,leetcode裏有不少案例可以說明。

語法解析按照上述的算法過程便完成了。雖說PCFG也有一些缺點,例如:1)缺乏詞法信息;2)連續短語(如名詞、介詞)的處理等。但總體來講它給語法解析提供了一種非常有效的實現方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章