NLP教程(4) - 句法分析與依存解析

ShowMeAI發表於2022-05-05

作者:韓信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/36
本文地址http://www.showmeai.tech/article-detail/237
宣告:版權所有,轉載請聯絡平臺與作者並註明出處

收藏ShowMeAI檢視更多精彩內容


句法分析與依存解析
本系列為史丹佛CS224n《自然語言處理與深度學習(Natural Language Processing with Deep Learning)》的全套學習筆記,對應的課程視訊可以在 這裡 檢視。

句法分析與依存解析
ShowMeAI為CS224n課程的全部課件,做了中文翻譯和註釋,並製作成了 GIF動圖!點選 第5講-句法分析與依存解析 檢視的課件註釋與帶學解讀。更多資料獲取方式見文末。


概述

CS224n是頂級院校史丹佛出品的深度學習與自然語言處理方向專業課程,核心內容覆蓋RNN、LSTM、CNN、transformer、bert、問答、摘要、文字生成、語言模型、閱讀理解等前沿內容。

筆記核心詞

  • Dependency Grammar
  • Dependency Structure
  • Neural Dependency Parsing
  • 依存解析
  • 依存句法
  • 語法依賴

1.依存語法與依存結構

與編譯器中的解析樹類似,NLP中的解析樹是用於分析句子的句法結構。使用的結構主要有兩種型別——短語結構依存結構

短語結構文法使用短語結構語法將片語織成巢狀成分。後面的內容會展開對它做更詳細的說明。我們現在關注依存語法。

句子的依存結構展示了單詞依賴於另外一個單詞 (修飾或者是引數)。詞與詞之間的二元非對稱關係稱為依存關係,描述為從head (被修飾的主題) 用箭頭指向dependent (修飾語)。一般這些依存關係形成樹結構,他們通常用語法關係的名稱 (主體,介詞賓語,同位語等)。

Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas. 依存樹的例子如下圖所示:

依存樹的示例

有時,在依存樹的頭部增加一個假的ROOT節點,這樣每個單詞都依存於唯一一個節點。

1.1 依存分析

依存語法是給定一個輸入句子 \(S\),分析句子的句法依存結構的任務。依存句法的輸出是一棵依存語法樹,其中輸入句子的單詞是通過依存關係的方式連線。

正式一點定義,依存語法問題就是建立一個輸入句子的單詞 \(S=w_{0}w_{1} \cdots w_{n}\) (其中 \(w_{0}\) 是 ROOT) 到它的依存語法樹的對映圖 \(G\)。最近幾年提出了很多以依存句法為基礎的的變體,包括基於神經網路的方法,我們將會在後面介紹。

確切地說,在依存語法中有兩個子問題:

  • 學習:給定用依賴語法圖示註的句子的訓練集 \(D\),建立一個可以用於解析新句子的解析模型 \(M\)
  • 解析:給定解析模型 \(M\) 和句子 \(S\),根據 \(M\) 得到 \(S\) 的最優依存語法圖

1.2 基於轉移的依存分析

Transition-based 依存語法依賴於定義可能轉換的狀態機,以建立從輸入句到依存句法樹的對映。

  • 學習」問題是建立一個可以根據轉移歷史來預測狀態機中的下一個轉換的模型。
  • 解析」問題是使用在學習問題中得到的模型對輸入句子構建一個最優的轉移序列

大多數 Transition-based 系統不會使用正式的語法。

1.3 Greedy Deterministic Transition-Based Parsing

這個系統是由 Nivre 在 2003 年提出,與當時的常用方法截然不同。

這個轉換系統是一個狀態機,它由狀態和這些狀態之間的轉換組成。該模型匯出了從初始狀態到幾種終端狀態之一的一系列轉換。

1) 狀態

對任意句子 \(S=w_{0}w_{1} \cdots w_{n}\),一個狀態可以描述為一個三元組 \(c=(\sigma, \beta,A)\)

  • ① 來自 \(S\) 的單詞 \(w_{i}\) 的堆 \(\sigma\)

  • ② 來自 \(S\) 的單詞 \(w_{i}\) 的緩衝區 \(\beta\)

  • ③ 一組形式為 \((w_{i},r,w_{j})\) 的依存弧,其中 \(w_{i},w_{j}\) 是來自 \(S\),和 \(r\) 描述依存關係。


因此,對於任意句子 \(S=w_{0}w_{1} \cdots w_{n}\)

  • ① 一個形式為 \(([w_{0}]_{\sigma},[w_{1}, \cdots ,w_{n}]_{\beta},\varnothing)\) 的初始狀態 \(c_{0}\) (現在只有 ROOT 在堆 \(\sigma\) 中,沒有被選擇的單詞都在緩衝區 \(\beta\) 中。

  • ② 一個形式為 \((\sigma,[]_{\beta},A)\) 的終點狀態。

2) 轉移

在狀態之間有三種不同型別的轉移:

  • \(SHIFT\):移除在緩衝區的第一個單詞,然後將其放在堆的頂部 (前提條件:緩衝區不能為空)。

  • \(Left\text{-}Arc_{r}\):向依存弧集合 \(A\) 中加入一個依存弧 \((w_{j},r,w_{i})\),其中 \(w_{i}\) 是堆頂的第二個單詞, \(w_{j}\) 是堆頂部的單詞。從棧中移除 \(w_{i}\) (前提條件:堆必須包含兩個單詞以及 \(w_{i}\) 不是 ROOT )

  • \(Right\text{-}Arc_{r}\):向依存弧集合 \(A\) 中加入一個依存弧 \((w_{i},r,w_{j})\),其中 \(w_{i}\) 是堆頂的第二個單詞, \(w_{j}\) 是堆頂部的單詞。從棧中移除 \(w_{j}\) (前提條件:堆必須包含兩個單詞)

下圖給出了這三個轉換的更正式的定義:

依賴解析的轉換

1.4 神經網路依存解析器

雖然依賴項解析有很多深層模型,這部分特別側重於貪心,基於轉移的神經網路依存語法解析器。與傳統的基於特徵的判別依存語法解析器相比,神經網路依存語法解析器效能和效果更好。與以前模型的主要區別在於這類模型依賴稠密而不是稀疏的特徵表示。

我們將要描述的模型採用上一部分中講述的標準依存弧轉換系統。最終,模型的目標是預測從一些初始狀態 \(c\) 到一個終點狀態的轉換序列,對模型中的依存語法樹進行編碼的。

由於模型是貪心的,它基於從當前的狀態 \(c=(\sigma, \beta, A)\) 提取特徵,然後嘗試一次正確地預測一次轉移 \(T\in \{SHIFT, Left\text{-}Arc_{r},Right\text{-}Arc_{r}\}\)。回想一下, \(\sigma\) 是棧,\(\beta\) 是快取, \(A\) 是對於一個給定的句子的依賴弧的集合。

1) 特徵選擇

根據該模型所需的複雜性,定義神經網路的輸入是靈活的。對給定句子 \(S\) 的特徵包含一些子集:

  • \(S_{word}\):在堆 \(\sigma\) 的頂部和緩衝區 \(\beta\)\(S\) 中一些單詞的詞向量 (和它們的依存)。

  • \(S_{tag}\):在 \(S\) 中一些單詞的詞性標註 ( POS )。詞性標註是由一個離散集合組成:\(\mathcal{P}=\{NN,NNP,NNS,DT,JJ, \cdots \}\)

  • \(S_{label}\):在 \(S\) 中一些單詞的依存標籤。依存標籤是由一個依存關係的離散集合組成:\(\mathcal{L}=\{amod,tmod,nsubj,csubj,dobj, \cdots \}\)


對每種特徵型別,我們都有一個對應的將特徵的 one-hot 編碼對映到一個 \(d\) 維的稠密的向量表示的嵌入矩陣。

  • \(S_{word}\) 的完全嵌入矩陣是 \(E^{w}\in \mathbb{R}^{d\times N_{w}}\),其中 \(N_{w}\) 是字典/詞彙表的大小。

  • POS 和依存標籤的嵌入矩陣分別為 \(E^{t}\in \mathbb{R}^{d\times N_{t}}\)\(E^{l}\in \mathbb{R}^{d\times N_{l}}\),其中 \(N_{t}\)\(N_{l}\) 分別為不同詞性標註和依存標籤的個數。

最後,定義從每組特徵中選出的元素的數量分別為 \(n_{word}\)\(n_{tag}\)\(n_{label}\)

2) 特徵選擇的例子

作為一個例子,考慮一下對 \(S_{word}\)\(S_{tag}\)\(S_{label}\) 的選擇:

  • \(S_{word}\):在堆和緩衝區的前三個單詞:\(s_{1},s_{2},s_{3},b_{1},b_{2},b_{3}\)。棧頂部兩個單詞的第一個和第二個的 leftmost / rightmost 的子單詞:\(lc_{1}(s_{i}),rc_{1}(s_{i}),lc_{2}(s_{i}),rc_{2}(s_{i}),i=1,2\)。棧頂部兩個單詞的第一個和第二個的 leftmost of leftmost / rightmost of rightmost 的子單詞:\(lc_{1}(lc_{1}(s_{i})),rc_{1}(rc_{1}(s_{i})),i=1,2\)\(S_{word}\) 總共含有 \(n_{word}=18\) 個元素。

  • \(S_{tag}\):相應的詞性標註,則 \(S_{tag}\) 含有 \(n_{tag}=18\) 個元素。

  • \(S_{label}\):單詞的對應的依存標籤,不包括堆/緩衝區上的 \(6\) 個單詞,因此 \(S_{label}\) 含有 \(n_{label}=12\) 個元素。

注意我們使用一個特殊的 \(NULL\) 表示不存在的元素:當堆和緩衝區為空或者還沒有指定依存關係時。

對一個給定句子例子,我們按照上述的方法選擇單詞,詞性標註和依存標籤,從嵌入矩陣 \(E^{w},E^{t},E^{l}\) 中提取它們對應的稠密的特徵的表示,然後將這些向量連線起來作為輸入 \([x^{w},x^{t},x^{l}]\)

在訓練階段,我們反向傳播到稠密的向量表示,以及後面各層的引數。

3) 前饋神經網路模型

(關於前饋神經網路的內容也可以參考ShowMeAI的對吳恩達老師課程的總結文章深度學習教程 | 神經網路基礎深度學習教程 | 淺層神經網路深度學習教程 | 深層神經網路

這個神經網路包含一個輸入層 \([x^{w},x^{t},x^{l}]\),一個隱藏層,以及具有交叉熵損失函式的最終 softmax 層。

我們可以在隱藏層中定義單個權值矩陣,與 \([x^{w},x^{t},x^{l}]\) 進行運算,我們可以使用三個權值矩陣 \([W^{w}_{1},W^{t}_{1},W^{l}_{1}]\),每個矩陣對應著相應的輸入型別,如下圖所示。

然後我們應用一個非線性函式並使用一個額外的仿射層 \([W_{2}]\),使得對於可能的轉移次數 (輸出維度) ,有相同數量的 softmax 概率。

前饋神經網路模型

  • Softmax layer: \(p=\operatorname{softmax}\left(W_{2} h\right)\)
  • Hidden layer: \(h=\left(W_{1}^{w} x^{w}+W_{1}^{t} x^{t}+W_{1}^{l} x^{l}+b_{1}\right)^{3}\)
  • Input layer:\(\left[x^{w}, x^{t}, x^{l}\right]\)

注意在上圖中,使用的非線性函式是 \(f(x)=x^{3}\)

有關 greedy transition-based 神經網路依存語法解析器的更完整的解釋,請參考論文:[A Fast and Accurate Dependency Parser using Neural Networks](https://cs.stanford.edu/~danqi/papers/emnlp2014.pdf)。

2.參考資料

ShowMeAI 系列教程推薦

NLP系列教程文章

史丹佛 CS224n 課程帶學詳解

相關文章