成分句法分析綜述(第二版)

原文連接:

godweiyang.com/2019/08/15/…web

本文對成分句法分析近年來的進展作了一個比較完善的總結。分析了多種不一樣類型的成分句法分析模型(基於轉移,動態規劃和序列到序列等),比較了它們之間的優缺點,並總結了一些提高它們性能的技巧。最後,本文對成分句法分析的將來發展趨勢代表了本身的一些見解。算法

介紹

成分句法分析近年來取得了飛速的發展,特別是深度學習興起以後,神經句法分析器的效果獲得了巨大的提高。通常來講,句法分析器均可以分爲編碼模型和解碼模型兩個部分。編碼模型用來獲取句子中每一個單詞的上下文表示,隨着表示學習的快速發展,編碼模型也由最初的LSTM逐漸進化爲了表示能力更強的Transformer (VaswaniSPUJGKP17)。而解碼模型方面,也誕生了許多不一樣類型的解碼算法,好比基於轉移系統(transition-based)的解碼算法(WatanabeS15, CrossH16, LiuZ17a),基於動態規劃(chart-based)的解碼算法(SternAK17, KleinK18)和基於序列到序列(sequence-to-sequence)的解碼算法(BengioSCJLS18, Gomez-Rodriguez18)等等。緩存

基於轉移系統的句法分析模型主要經過預測生成句法樹的動做序列來還原出一棵句法樹。按照遍歷樹的順序,具體還能夠分爲自底向上(bottom-up)的轉移統(CrossH16),自頂向下(top-down)的轉移系統(WatanabeS15)和基於中序遍歷(in-order)(LiuZ17a)的轉移系統。基於轉移系統的句法分析模型優勢是速度快,由於它解碼的時間複雜度是線性的。而缺點就是在解碼的時候沒法考慮短語的邊界信息,這會致使解碼的精度上相比於基於動態規劃的模型稍微差一點。網絡

基於動態規劃的句法分析模型主要經過遞歸地預測每一個短語得分最高的子短語,最後回溯還原出最優句法樹。優勢就是能夠枚舉出搜索空間中的全部句法樹,解碼效果比較好。可是動態規劃算法時間消耗較大,複雜度是句子長度的平方級別的。因此針對這個缺點,又提出了近似的自頂向下的貪心解碼算法(SternAK17),按照句法樹的前序遍歷順序進行搜索,在不損失太多性能的前提下,能大大加快解碼的速度。session

基於序列到序列的句法分析模型主要思想就是將句法樹映射爲一個惟一對應的序列表示,而後經過序列標註(Gomez-Rodriguez18)或者序列生成(VinyalsKKPSH15)的方式來預測出這個序列。根據句法樹序列化的不一樣定義方式,模型也有許多不一樣的變體。這一類模型的優勢就是速度極快,由於時間複雜度也是線性的,而且模型參數量比基於轉移系統的模型少了不少。缺點也是顯而易見的,因爲預測出的序列須要有很強的約束,否則不能保證能夠還原出一棵完整的句法樹,因此最終的效果也沒有前面兩種模型理想。oracle

此外還有許多其餘類型的解碼算法,好比直接利用神經網絡來預測語法產生式的機率,模擬上下文無關文法,最後再利用傳統的CKY算法來進行解碼(TengZ18)。該模型最終也取得了很是不錯的效果,在單模型上的結果超過了以前的幾種模型。app

成分句法分析能夠應用到許多下游任務中去,好比情感分析任務中,能夠採用樹狀LSTM(Tree-LSTM)來對句子的句法樹進行建模,從而分析出句子的情感(ZhuSG15)。也能夠應用到其餘基礎任務中去,好比能夠將訓練好的成分句法樹根據規則轉化爲依存句法樹,從而提高依存句法分析的準確率(Gildea04)。函數

任務定義

成分句法分析是天然語言處理中的一個基礎任務,它的任務是給定一個長度爲n的句子(w_0, w_1, \ldots, w_{n-1}),分析出句子的短語結構句法樹T。例如給定句子「The little boy likes red tomatoes .」,它的成分句法樹如圖1所示。post

圖1:句子「The little boy likes red tomatoes .」對應的句法樹。

對於句法樹T,有多種方式來對它進行表示。目前比較經常使用的是基於跨度(span)的表示(CrossH16),也就是將句法樹表示成組成它的全部短語的集合。而對於每一個短語,能夠用三元組(i, j, \ell)來表示它,其中ij表示這個短語的範圍是從單詞w_iw_j,而\ell表示這個短語的非終結符標籤。這樣句法樹T就能夠表示爲三元組(i, j, \ell)的集合:性能

T = \{(i, j, \ell) | (i, j, \ell) \in T\}.

這樣預測句法樹的任務就能夠轉化爲預測三元組(i, j, \ell)集合了。

固然通常還存在兩個小問題,一是若是存在一元產生式怎麼辦?一種解決方法就是將一元產生式上面的全部非終結符所有拼接成一個新的非終結符,這樣整個一元產生式就能夠當作一個非終結符了。另外一個問題是句法樹不必定是二叉樹,那麼解碼的時候就會增長許多搜索的複雜度。解決方法就是新增一個空的非終結符\varnothing,將非二叉產生式所有轉化爲多個二叉產生式,其中新增長的臨時結點的非終結符所有定義爲這個空的非終結符\varnothing,在還原句法樹的時候直接忽略它就好了。

編碼模型

給定句子(w_0, w_1, \ldots, w_{n-1}),編碼模型的目的就是得到每一個單詞的上下文表示,並進一步計算出每一個短語的向量表示。在實際實現中,通常將單詞x_i的輸入向量分爲三部分。首先是它對應的隨機初始化的嵌入向量e_i。而後是這個單詞的詞性對應的隨機初始化的嵌入向量p_i,通常它的詞性能夠經過外部詞性標註器來獲得。最後是這個單詞的字符級別表示c_i,這個通常能夠經過字符級別的CNN或者LSTM來獲得。最後將三部分向量拼接獲得最終的輸入向量x_i

x_i = [e_i; p_i; c_i].

而後將輸入向量送入編碼器,獲得每一個單詞的上下文表示。而根據採用的編碼器的不一樣,又能夠將編碼模型分爲如下幾種主要類型。

LSTM編碼

這是最爲經常使用的一種編碼方式了,首先將全部x_i輸入到雙向LSTM中,獲得每一個位置的前向隱層表示\overrightarrow h_{i}和後向隱層表示\overleftarrow h_{i}。而後對於短語(i, j),它能夠表示爲:

\boldsymbol{s}_{i j}=\left[\vec{h}_{j}-\vec{h}_{i} ; \overleftarrow h_{i}-\overleftarrow h_{j}\right]

這樣就獲得了短語(i, j)的向量表示s_{ij},接着就能夠計算出它的得分,而後利用解碼模型解碼出最優的句法樹。

Transformer編碼

雖然LSTM編碼用的最多,可是要問最近這段時間最火的模型是什麼,那固然是Transformer了(VaswaniSPUJGKP17)。它能夠充分利用GPU的並行計算優點,加快計算速度。還能夠利用注意力機制,加強對句子的表示能力。

圖2:Transformer結構。

Transformer的輸入有三個,查詢(query)向量矩陣Q,鍵(key)向量矩陣K和值(value)向量矩陣V。 輸出就是查詢向量對每一個鍵向量的注意力,而後對值向量加權求和的結果。用矩陣形式表示就是:

{\rm Attention}(Q, K, V) = {\rm softmax}(\frac{QK^{\top}}{\sqrt{d_k}})V.

固然還能夠加入多頭(multi-head)注意力機制,加強表示能力,具體這裏再也不贅述,能夠參看原論文。最後將輸出乘以參數矩陣{\bf W}_O映射回須要的輸出維度,獲得最終的輸出矩陣H,具體結構如圖2所示。

在本文中,QKV三個矩陣都是經過對句子的輸入向量拼接而成的矩陣X,分別乘以參數矩陣{\bf W}_Q{\bf W}_K{\bf W}_V獲得的。可是要注意的一點是,在此前的輸入向量x_i的基礎之上,還得再拼接上每一個單詞的位置向量p_i,否則矩陣運算會丟失單詞的位置信息。

獲得輸出矩陣以後,接下來計算短語的表示方法和LSTM編碼是相似的。

遞歸神經網絡編碼

遞歸神經網絡在天然語言處理中的應用最先是在(SocherBMN13)中提出的。雖然當時取得了不錯的效果,可是近些年來遞歸神經網絡已經不多有人使用了,主要由於它存在梯度消失,須要句法樹等問題,而且它的初衷(編碼樹結構信息)由循環神經網絡LSTM基本也能夠學到,因此沒有必要用這種不能並行的網絡結構。

對於短語(i, j),若是它的兩個兒子結點是(i, k)(k, j),那麼s_{ij}就能夠由s_{ik}s_{kj}計算獲得:

s_{ij} = f({\bf W}[s_{ik};s_{kj}]+{\bf b}),

其中,f是激活函數,通常能夠取{\rm tanh}

固然這種結構如今已經不多使用了,如今用的較多的遞歸結構是樹狀LSTM,網絡結構和遞歸神經網絡基本相同,惟一的區別就是將計算單元f替換成LSTM中的隱層單元,這樣能夠有效地解決梯度消失和長距離依賴的問題。

得分計算

採用以上幾種編碼模型獲得了每一個短語的向量表示以後,接下來能夠用兩層前饋神經網絡計算出它的得分:

\begin{aligned}
        s_{\rm{label}}(i, j, \ell) & = {\bf v}_{\ell}^{\top}f({\bf W}_{\ell}^2f({\bf W}_{\ell}^1s_{ij} + {\bf b}_{\ell}^1) + {\bf b}_{\ell}^2), \\\
        s_{\rm{span}}(i, j)        & = {\bf v}_s^{\top}f({\bf W}_{s}^2f({\bf W}_{s}^1s_{ij} + {\bf b}_{s}^1) + {\bf b}_{s}^2),
    \end{aligned}
    \tag{1}

其中f是激活函數,這裏一般取{\rm ReLU}。這裏咱們將短語(i, j)的得分分紅了兩部分,一部分是它的非終結符\ell的得分s_{\rm{label}}(i, j, \ell),一部分是跨度的得分s_{\rm{span}}(i, j)

最後,定義一棵句法樹的總得分爲它包含的全部短語的標籤得分與跨度得分之和:

s_{\rm tree}(T) = \sum\limits_{(i, j, \ell) \in T}{s_{\rm{label}}(i, j, \ell) + s_{\rm{span}}(i, j)}.

而接下來要介紹的解碼模型的任務,就是去尋找一棵句法樹,使得它的得分最高。

基於轉移系統的解碼算法

基於轉移系統的解碼模型主要分爲三種。第一種是自底向上的轉移系統,第二種是自頂向下的轉移系統,最後一種是基於中序遍歷的轉移系統。這些轉移系統的共同點是都包含兩個組成成分,一個是棧(stack),用來存放已分析的句法結構,另外一個是緩存(buffer),用來存放待分析的句子。而預測句法樹結構就轉化爲了預測轉移系統每個時刻應該採起的動做(action)序列。下面咱們分別介紹幾種不一樣的轉移系統,咱們用三元組[S, B, T]來表示轉移系統每個時刻的狀態,分別表明棧頂元素、緩存的第一個單詞和句法分析結束標誌。

自底向上的轉移系統

自底向上的轉移系統是根據句法樹的後序遍歷(post-order)順序進行句法分析的,首先將緩存中的單詞移進棧裏,而後將棧頂的若干個單詞歸約爲它們的父結點,直至最後緩存爲空而且棧裏只有一個根節點。

圖3:自底向上的轉移系統動做定義。

自底向上轉移系統的動做形式化定義如圖3所示,其中移進(SHIFT)動做就是將緩存裏面的第一個單詞移進棧裏。歸約(REDUCE-L/R-X)動做就是將棧頂的兩個元素出棧,而且歸約爲它們的父結點X,而後再將父結點入棧,而L和R就是用來區分左兒子和右兒子誰是頭結點。一元(Unary-X)動做就是將棧頂元素出棧,而且歸約爲父結點X,這個動做是用來預測一元產生式的。最後完成(FINISH)動做用來判斷句法分析是否結束。

注意到這裏有一個問題,自底向上轉移系統通常要提早對句法樹進行二叉化。主要緣由是由於自底向上系統有個弊端,就是在不停地移進以後,你不只要預測哪一步開始歸約,還得預測歸約的話要歸約棧頂的多少個元素,這樣預測的狀態數就大大增長,致使訓練時間也增長了許多。而二叉化後每次預測就只須要預測哪一步歸約就好了,每次歸約只歸約棧頂的兩個元素。

圖4:自底向上的轉移系統的一個例子。

對於圖1中的句法樹,用自底向上轉移系統分析的過程如圖4所示。

自底向上轉移系統的優勢就是能夠充分利用已經生成的子樹信息,來幫助父結點的非終結符預測。可是缺點也很顯然,由於沒法知道父結點以及再上層的父結點信息,因此丟失了許多有用的全局信息。另外一個缺點就是須要提早進行二叉化,雖然二叉化加入了頭結點(head)信息,事實證實是頗有用的,可是頭結點的標註須要許多語義學知識,很是的耗時耗力。一個較爲簡潔的作法就是,用空結點\varnothing來做爲句法分析中臨時結合兩個子結點而產生出的,可是在正確句法樹中不存在的結點。在還原樹結構的時候忽略這種空結點,這樣就能夠隱式地進行二叉化操做了。

自頂向下的轉移系統

自頂向下的轉移系統利用的是句法樹的前序遍歷(pre-order)序列,首先將父結點入棧,而後不斷操做直到它的子結點所有入棧,這時將父結點連同全部子結點所有歸約爲一個結點,也就是這個父結點自身。

圖5:自頂向下的轉移系統動做定義。

自頂向下轉移系統的動做形式化定義如圖5所示,其中移進動做和以前同樣,都是將緩存的第一個單詞入棧。而非終結符(NT-X)動做就是將非終結符X入棧,也就是接下來的子樹的父結點就是X。歸約動做就是將棧頂若干個元素,一直到以前移進的那個父結點爲止都出棧,而後歸約爲一個結點,再次入棧。注意到這裏不一樣於自底向上轉移系統的地方是沒有完成動做,由於自底向上系統存在一元動做,因此最後根節點可能會無限歸約下去,所以須要經過完成動做來提早終止分析。固然其實轉移系統的動做定義並無嚴格的要求,不一樣論文定義的也都不同,可是都大同小異,也就是都存在移進和歸約這兩個動做,因此這些轉移系統又能夠叫作移進-歸約系統。

對於圖1中的句法樹,用自頂向下系統分析的過程如圖6所示。

圖6:自頂向下的轉移系統的一個例子。

自頂向下轉移系統的優缺點和自底向上轉移系統剛好互補。優勢就是能夠充分利用全局信息,例如父結點的信息,而且不須要提早進行二叉化,由於歸約的時候只要找到棧裏第一個非終結符就好了。而缺點就是沒法利用局部信息,也就是已經分析好的子樹信息,一樣非終結符動做也可能會出現無限屢次執行的狀況,因此要加上一些限制條件。

基於中序遍歷的轉移系統

基於中序遍歷的轉移系統利用的是句法樹的中序遍歷(in-order)序列,首先將最左邊的子結點移進棧裏,而後將父結點入棧,再不斷操做直到該父結點的剩餘子結點所有入棧,而後對它們進行歸約。

圖7:基於中序遍歷的轉移系統動做定義。

基於中序遍歷的轉移系統的動做形式化定義如圖7所示,其中移進動做和以前同樣,都是將緩存的第一個單詞入棧。映射非終結符(PJ-X)動做是預測出當前棧頂的元素的父結點X。歸約動做就是將棧頂的若干個元素歸約爲最裏面倒數第二個元素,也就是它們的父結點。

圖8:基於中序遍歷的轉移系統的一個例子。

對於圖1中的句法樹,用基於中序遍歷的系統分析的過程如圖8所示。

根據經驗,當咱們讀一個短語時,咱們一般會注意到它的第一個單詞,而後咱們能夠根據觀察到的詞推斷出短語的類型。例如,當咱們讀到「likes」這個詞時,咱們能夠假設緊跟着這個詞的是一個動詞短語。然後面的單詞「red tomotoes」只是這個動詞短語的賓語。與自頂向下的轉移系統相比,「likes」中的局部信息對於識別這是一個動詞短語可能相當重要。此外,動詞短語(VP)中的全局信息也有利於以後的預測。

基於中序遍歷的轉移系統的優勢剛好結合了前面兩種轉移系統,既能夠考慮到局部信息,又能夠考慮到全局信息。

生成模型

以前介紹的三種轉移系統都屬於判別式模型,而基於自頂向下轉移系統,又誕生出了一種生成式模型——循環神經網絡文法(RNNG)。循環神經網絡文法本質上就是自頂向下的轉移系統,動做定義和章節自頂向下的轉移系統介紹的基本一致。只是以前介紹的自頂向下的轉移系統是判別式模型,每次移進的單詞都是緩存中給定正確的單詞。而循環神經網絡文法每次移進的單詞須要經過動做生成(GEN-X)預測得出,最終模型對預測出來的句子分析出句法樹。

正式定義就是,對於句子x和對應的句法樹y,判別式模型是對條件機率p(y | x)進行建模,而生成式模型是對聯合機率p(x, y)進行建模。

而循環神經網絡文法的另外一個重要應用是語言模型(language model),也就是建模p(x)。由於p(x) = \sum\nolimits_{y \in \mathcal{Y}(x)} {p(x,y)},因此只須要枚舉出全部可能的句法樹y便可,可是這是指數級別的,顯然不現實,這時候就須要用到「重要性採樣(importance sampling)」 (doucet2009tutorial)。

q(y | x)爲循環神經網絡文法做爲判別式模型的時候產生句子y的條件機率,那麼p(x)能夠改寫爲

\begin{aligned}
        p(x) & = \sum\nolimits_{y \in \mathcal{Y}(x)} {p(x,y)}       \\\
             & = \sum\nolimits_{y \in \mathcal{Y}(x)} {q(y|x)w(x,y)} \\\
             & = {\mathbb {E}_{q(y|x)}}w(x,y),
    \end{aligned}

其中w(x,y)=p(x,y)/q(y|x)。而後就能夠採用蒙特卡羅方法進行採樣了,從分佈q(y | x)中採樣N個樣本:

{y^{(i)}} \sim q(y|x),i = 1,2, \ldots ,N.

那麼p(x)就能夠近似表示爲:

\begin{aligned}
        p(x) & = {\mathbb{E}_{q(y|x)}}w(x,y)                                                                \\\
             & \mathop \approx \limits^{\rm MC} \frac{1}{N}\sum\limits_{i = 1}^N {w(x,{y^{(i)}})}.
    \end{aligned}

在實驗效果上,生成模型的效果要明顯好於判別模型,由於它不只對句法樹的機率進行了建模,還對整個句子的語言模型機率也進行了建模。固然在實現上也稍微複雜了一些,主要採樣這個操做耗時比較多,所以採樣數量不能太多,一般個位數就夠了,程序運行時間會成倍增長。

基於動態規劃的解碼算法及其變體

圖9:基於動態規劃解碼算法的句法分析模型圖。

這一類解碼算法是由傳統的CKY算法啓發而來的(cocke1970programming)。傳統的CKY算法是經過枚舉每個結點處的產生式來狀態轉移到下一個子結點,而後尋找出機率最大的那一個產生式。而這裏的基於動態規劃的解碼算法是採用神經網絡,計算出每一個短語的得分,而後枚舉它的全部子短語,計算出總得分最高的那棵子樹。圖9是這一類解碼算法加上編碼模型總體的模型結構。

動態規劃解碼

解碼算法的初衷是求出得分最高的那棵子樹,可是狀態空間太大了,不可能枚舉全部的句法樹,因此就只能用動態規劃算法求解了。

對於任意一個跨度(i, j),咱們利用公式1計算全部它全部非終結符的得分。直接取得分最高的那一個非終結符\hat \ell_{ij}做爲最優的非終結符。

而對於子短語,咱們只須要預測出(i, j)的最優分割點便可。遍歷全部的分割點k,取兩個子結點(i,k)(k,j)與結點(i, j)得分之和最高的那個分割點便可:

\begin{aligned}
        s_{\rm split}(i, j, k) & = s_{\rm label}(i, j, \hat \ell_{ij})                                        \\\
                               & + s_{\rm label}(i, k, \hat \ell_{ik}) + s_{\rm label}(k, j, \hat \ell_{kj}).
    \end{aligned}

注意這裏計算得分取了非終結符的得分s_{\rm label}(i, j, \ell),並無取跨度的得分s_{\rm span}(i, j)。由於在實際實現中,發現加不加這部分得分影響不大,因此爲了簡化運算,去掉了這項得分。

動態規劃解碼算法的時間複雜度是O(n^3)的,因此對於稍長一點的句子,運行起來仍是挺慢的。可是好處是能夠搜索到全部的狀態空間,因此準確率上比較高。

自頂向下貪心解碼

由於動態規劃解碼算法時間複雜度過高了,因此能夠用貪心解碼來近似求解最優句法樹。思路是自頂向下、貪心地去選擇每個跨度(i,j)的最優分割點和最優非終結符\hat \ell_{ij},這樣時間複雜度將降到O(n^2)

具體實現以下,首先從根結點也就是(0, n)開始,選擇一個分割點\hat k,使得兩個子結點(0, \hat k)(\hat k, n)與根結點(0, n)的得分之和最高,而非終結符仍是像以前那樣直接經過短語的向量表示計算得出。具體公式爲:

\begin{array}{l}
        \hat \ell = \mathop {\arg \max }\limits_l [{s_{\rm label}}(i,j,\ell)] \\\
        \hat k = \mathop {\arg \max }\limits_k [{s_{\rm split}}(i,j,k)].
    \end{array}

自頂向下貪心解碼時間複雜度低,並且實際運行中並無損失太多精度,因此能夠很好地近似動態規劃解碼算法。而由轉移系統的三種遍歷順序,天然而然還能夠想到,這裏也能推廣到自底向上和中序遍歷的貪心解碼,可是因爲這裏預測的時候只利用到了局部的短語特徵,因此僅僅更改遍歷的順序是沒有效果的,還得充分利用到預測的歷史信息才行。

基於序列到序列的解碼算法

前面幾個章節都是將句法樹視爲若干跨度的集合,並預測這個集合,最後還原出句法樹。這個章節將要介紹的方法都是基於序列的,也就是將句法樹序列化,經過預測句法樹對應的序列,而後還原出句法樹。

基於括號表達式

圖10:句子「John has a dog .」對應的句法樹及其括號表達式。

括號表達式是句法樹最爲常見的一種序列化方法,圖10展現了句子「John has a dog .」對應的括號表達式。能夠證實,括號表達式和句法樹是一一對應的,因此只要預測出了括號表達式,就能夠惟一映射到一棵句法樹。這樣句法分析任務就轉化爲了輸入一個句子,輸出一個括號表達式序列,這能夠用常見的序列到序列模型來解決(VinyalsKKPSH15)。類比到機器翻譯任務,能夠把輸入句子當成源語言,輸出的括號表達式當作目標語言,這就轉化爲了一個翻譯任務。

可是這種序列化方法存在一個較大的問題,就是限制性太強了,必需要知足輸出的序列是一個合法的括號表達式,這就大大增長了預測的難度。因此通常這種序列化方法都是用來重排序的,也就是先用現成的句法分析器預測出機率最大的若干棵句法樹,而後預測這幾棵句法樹對應的括號表達式的語言模型機率,挑選出機率最高的一棵做爲最終的模型輸出。

基於句法距離

圖11:句子「She enjoys playing tennis .」對應的句法樹及其句法距離序列。

句法距離(syntactic distance)是由(ShenLHC18)首次提出的新概念,句子中相鄰兩個單詞的句法距離定義爲它們倆的最近公共祖先的高度。圖11展現了句子「She enjoys playing tennis .」的句法距離序列,對於長度爲n的句子,它的句法距離序列長度爲n - 1,而且知足以下條件:對於任意兩個相鄰的單詞對,它們的最近公共祖先高度越高,那麼它們倆的句法距離就越大(BengioSCJLS18)。

以圖11爲例,「She」和「enjoys」的最近公共祖先是「S」,因此高度最高,對應的句法距離也最大。「enjoys」和「playing」的最近公共祖先是「VP」,高度排第三,因此對應的句法距離大小也是排第三。依次類推,剩下的句法距離也知足這個性質。能夠證實,這個數字序列和句法樹是一一對應的。更進一步能夠發現,這個序列其實就是「中序遍歷的結點的高度」,原文中將其稱爲句法距離。

固然實際實現中,句法距離並不必定要和結點高度徹底對應,甚至不須要是整數,只須要反映出彼此之間的大小關係就好了。預測這個序列也很簡單,原文中並無使用傳統的雙向LSTM序列標註的模型結構,而是首先將句子輸入到一個雙向LSTM,而後將每相鄰兩個單詞的隱層輸出作一次卷積操做(由於要預測相鄰兩個單詞的最近公共祖先的高度),而後再將卷積輸出送到一個雙向LSTM中去,最後經過一個前饋神經網絡獲得每相鄰兩個單詞的句法距離。

解碼過程十分簡單,對於一個句法距離序列d_1, d_2, \ldots, d_n,首先找出序列中最大的元素d_i,而後下標小於i的句子構成了左子樹,大於等於i的部分構成了右子樹,即句法樹的括號表達式爲((x_{<i})(x_{\ge i}))。而對於左右兩棵子樹,只須要遞歸解碼下去就好了。

固然這種解碼方式仍然存在一個問題,就是句法距離序列並不必定能惟一映射回句法樹。例如對於序列(1, 1, 1, 1),當出現相同句法距離時,最大的句法距離並不惟一,這時候選誰作根節點都有可能,因此這個句法距離序列能夠對應到任意一棵二叉樹。固然在實際運行中,由於預測結果都是浮點數,因此幾乎不會出現這種狀況。

其餘解碼算法

除了以上介紹的基於轉移系統的、基於動態規劃的和基於序列預測的解碼算法之外,還有一些其餘的解碼算法。

好比(TengZ18)提出了兩種局部模型。一種是直接預測每一個跨度(i, j)屬於句法樹的機率,而後使用CKY算法來進行解碼。另外一種是預測產生式(i, j) \to (i, k) (k, j)的機率,而後仍是使用CKY算法來進行解碼。這兩種模型都取得了很是高的F1值。

再好比(TuZZ18)提出了高斯混合隱向量文法(GM-LVeGs),來學習產生式的向量表示,最終的效果也是要好於以前的組合向量文法(CVG)(SocherBMN13)。

若干改進

上面介紹的幾種經典的句法分析模型或多或少都有一些問題,有些解碼速度很慢,有些效果不是很理想,有些實現起來比較麻煩,對於不一樣模型要作出不一樣的設計調整,所以許多工做針對這些模型提出了許多優化,下面選取兩個典型的優化來詳細說明。

動態指導

在基於轉移系統的模型和動態規劃模型的自頂向下近似解碼模中,都使用到了貪心的解碼算法。這樣就會出現一個問題,就是訓練的時候由於有標準的句法樹,因此不論你解碼到哪一步,均可以繼續按照正確的結果走下去。可是若是在測試階段,若是你預測出了一個歷來沒有在訓練階段出現過的狀態,那模型可能就沒法知道下一步該往哪走了。這時候就要採用動態指導(dynamic oracle),來告訴模型在錯誤的狀態該往哪走。

這裏只簡單說明一下動態規劃模型的自頂向下近似解碼中動態指導的定義,基於轉移系統的模型的動態指導相似。

假設如今模型預測出了一個跨度(i, j),那麼下面就要預測它的非終結符和分割點。

首先對於非終結符,若是(i, j)在標準的句法樹中,那麼它的非終結符就是標準的非終結符,不然的話就定義爲空集\varnothing

而後對於分割點,若是(i, j)在標準的句法樹中,那麼分割點就是標準的分割點。不然的話就在標準的句法樹中尋找包含(i, j)的最小的跨度(i', j'),而後找出(i', j')的全部分割點中,位於(i, j)之間的分割點,任意取一個均可以做爲動態指導。在實際實現中,取知足條件的最左邊一個分割點。不一樣的分割點對應了不一樣的二叉化方式,其實可有可無。在(CrossH16)中有關於動態指導詳細的證實過程。

策略梯度

除了動態指導解決的問題以外,貪心解碼還存在一個問題,就是它只針對當前時刻來進行優化,而不是針對全局優化,因此獲得的並不是是全局最優解。此外動態指導針對不一樣的模型要進行單獨的設計,這就比較麻煩,因此能夠採用強化學習中的策略梯度(policy gradient)來替代它(FriedK18)。

首先用風險函數(risk objective)來做爲模型的損失函數:

\mathcal{R}(\theta ) = \sum\limits_{i = 1}^N {\sum\limits_y {p(y|{x^{(i)}};\theta )\Delta (y,{y^{(i)}})} },

其中(x^{(i)}, y^{(i)})是訓練集中的標準數據。能夠看出,風險函數其實就是全部可能的句法樹和標準樹的差別{\Delta (y,{y^{(i)}})}的指望,訓練的目的就是最小化全部句法樹和標準樹的差別,這樣就解決了以前提到的兩個問題。

可是顯然不可能枚舉全部可能的句法樹,這就得用到重要性採樣(important sampling)方法。可是不能直接對風險函數進行重要性採樣,否則採樣後的函數\theta消失了,就沒有辦法對其求導了,因此要先對風險函數求導獲得:

\nabla \mathcal{R}(\theta ) \approx \sum\limits_{i = 1}^N {\sum\limits_{y \in \mathcal{Y}({x^{(i)}})} {\Delta (y,{y^{(i)}})\nabla \log p(y|{x^{(i)}};\theta )} },

這裏的y是根據分佈p(y|x^{(i)})採樣獲得的結果。具體實現中能夠將標準樹也加入到採樣結果中,能夠提高準確率。

實驗

數據集

成分句法分析使用最爲普遍的英文數據集是華爾街日報的PTB數據集,其中第2~21章節劃分爲了訓練集,22章節爲驗證集,23章節爲測試集。中文數據集爲CTB數據集,目前已經有5.0,6.0以及8.0等多個版本,可是使用最爲普遍的仍是5.0版本。

實驗結果

表1:不一樣模型在PTB測試集上的最終結果,其中$^*$表明生成式模型。

表1列舉了一些句法分析模型的測試結果,分爲了單模型和非單模型兩部分。其中單模型就是不使用任何外部知識及重排序等操做的模型,而非單模型則使用了外部語料、預訓練模型、模型融合和重排序等各類方法。目前單模型最好的結果來自於(KleinK18),他們採用了Transformer做爲編碼器,使其結果獲得了大大提高。因而可知,目前成分句法分析領域編碼器的影響要遠遠大於解碼器。而非單模型領域最好結果則來自於相同團隊的工做(abs-1812-11760),這裏他們使用了更爲強大的預訓練模型BERT,使結果上升到了一個難以逾越的高度。

總結與將來展望

本文介紹了成分句法分析領域近些年來的進展,列舉了幾種不一樣類型的成分句法分析模型(基於轉移系統、基於動態規劃、基於序列到序列),並對比分析了它們之間的優缺點,最後提出了幾種常見的改進。

能夠預見,將來成分句法分析的研究方向將會是在編碼模型方面,由於解碼模型對性能的提高已經到了瓶頸期,而編碼模型不只能夠大大提高模型效果,還能夠運用在無監督成分句法分析上。

參考文獻

  • Attention is All you Need
  • Transition-based Neural Constituent Parsing
  • Span-Based Constituency Parsing with a Structure-Label System and Provably Optimal Dynamic Oracles
  • In-Order Transition-based Constituent Parsing
  • A Minimal Span-Based Neural Constituency Parser
  • Constituency Parsing with a Self-Attentive Encoder
  • Straight to the Tree: Constituency Parsing with Neural Syntactic Distance
  • Constituent Parsing as Sequence Labeling
  • Grammar as a Foreign Language
  • Two Local Models for Neural Constituent Parsing
  • Long Short-Term Memory Over Tree Structures
  • Dependencies vs. Constituents for Tree-Based Alignment
  • A tutorial on particle filtering and smoothing: Fifteen years later
  • Programming languages and their compilers: Preliminary notes
  • Parsing with Compositional Vector Grammars
  • Policy Gradient as a Proxy for Dynamic Oracles in Constituency Parsing
  • Multilingual Constituency Parsing with Self-Attention and Pre-Training
  • Fast and Accurate Shift-Reduce Constituent Parsing
  • Shift-Reduce Constituent Parsing with Neural Lookahead Features
  • Linear-time Constituency Parsing with RNNs and Dynamic Programming
  • Recurrent Neural Network Grammars
  • Effective Inference for Generative Neural Parsing
  • Parsing as Language Modeling
  • Extending a Parser to Distant Domains Using a Few Dozen Partially Annotated Examples
  • Improving Neural Parsing by Disentangling Model Combination and Reranking Effects
  • Neural Language Modeling by Jointly Learning Syntax and Lexicon
  • Gaussian Mixture Latent Vector Grammars
相關文章
相關標籤/搜索