NLP入門概覽(8) ——句法分析b:完全句法分析
在上一部分中,我們簡單介紹了完全句法分析的概念,並詳細介紹了句法分析的基礎:Chomsky形式文法(NLP入門概覽(7) ——句法分析a:Chomsky(喬姆斯基)形式文法)。
在這一部分中,我們將對完全句法分析進行詳細介紹。
回顧一下,句法分析共有三種類型:完全句法分析、區域性句法分析、依存關係分析。
對於完全句法分析,還是NLP領域中常用的三種解決方法:規則法、概率統計法、神經網路方法。
下面我們從這三個方法入手,對完全句法分析演算法進行介紹。
1.規則句法分析演算法
從上述句法分析樹的生成過程來看,很明顯,句法分析演算法大致上由三種策略:
1.自底向上
2.自頂向下
自底向上的方法從句子中的詞語出發,基本操作是將一個符號序列匹配歸約為其產生式的左部(用每條產生式左邊的符號來改寫右邊的符號),逐漸減少符號序列直到只剩下開始符S為止。
自頂向下的方法從符號S開始搜尋,用每條產生式右邊的符號來改寫左邊的符號,然後通過不同的方式搜尋並改寫非終結符,直到生成了輸入的句子或者遍歷了所有可能的句子為止。
常用的句法分析演算法有線圖(chart)分析演算法、CYK分析演算法等等。
線圖法將每個詞看作一個結點,通過在結點間連邊的方式進行分析,演算法的時間複雜度為
O
(
K
n
3
)
O(Kn^3)
O(Kn3),其中
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
S∈N
4.一個產生式集
R
R
R
5.對任意產生式
r
∈
R
r∈R
r∈R,其概率為
P
(
r
)
P(r)
P(r),產生式具有形式:
X
→
Y
,
P
X\rightarrow Y, P
X→Y,P
其中,
X
∈
N
,
Y
∈
(
N
∪
∑
)
∗
X∈N,Y∈(N∪\sum)^*
X∈N,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(A→wi),A∈VN,1≤i≤n
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,...,n−j,重複下列計算
γ
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,C∈VN;i≤k≤i+jmaxp(A→BC)γ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,C∈VN;i≤k≤i+jmaxp(A→BC)γ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