什麼是語法解析?
在天然語言學習過程當中,每一個人必定都學過語法,例如句子能夠用主語、謂語、賓語來表示。在天然語言的處理過程當中,有許多應用場景都須要考慮句子的語法,所以研究語法解析變得很是重要。
語法解析有兩個主要的問題,其一是句子語法在計算機中的表達與存儲方法,以及語料數據集;其二是語法解析的算法。
對於第一個問題,咱們能夠用樹狀結構圖來表示,以下圖所示,S表示句子;NP、VP、PP是名詞、動詞、介詞短語(短語級別);N、V、P分別是名詞、動詞、介詞。
對於第二個問題,咱們須要有合適的算法來處理。這也是咱們本章將要討論的內容。
上下文無關語法(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)連續短語(如名詞、介詞)的處理等。但整體來說它給語法解析提供了一種很是有效的實現方法。