1. 程式人生 > 實用技巧 >NLP入門概覽(9) ——句法分析c:區域性句法分析、依存關係分析

NLP入門概覽(9) ——句法分析c:區域性句法分析、依存關係分析

  在上一部分中,我們介紹了基於規則法、概率統計法、神經網路法的完全句法分析方法(NLP入門概覽(8)——句法分析b:完全句法分析)。
  在這一部分中,我們將介紹句法分析中的另外兩種型別:區域性句法分析、依存關係分析。

1.區域性句法分析

  相比於完全句法分析要求對整個句子構建句法分析樹,區域性句法分析(淺層句法分析、語塊分析)僅要求識別句子中某些結構相對簡單的獨立成分,如非遞迴的名詞短語、動詞短語等。這些識別出來的結構通常被稱作語塊(chunk),語塊和短語這兩個概念可以換用。
  例如:
在這裡插入圖片描述

  由此可見,在區域性句法分析中,可以將組塊的分析轉化成序列標註問題解決,在這裡就不進行贅述。
  對序列標註問題不太瞭解的朋友們可以參考部落格:NLP入門概覽(4)——序列標註a:隱馬爾科夫模型(HMM)

2.依存文法

  與完全句法分析以及區域性句法分析不同,依存句法分析的主要任務是分析出詞與詞之間的依存關係,例如:
在這裡插入圖片描述

  現代依存語法理論認為句法關係和詞義體現在詞之間的依存關係中。而且,參加組成一個結構的成分(詞)之間是不平等(有方向)的,一些成分從屬於另一些成分,每個成分只能從屬於至多一個成分。
  而且,哪個兩個詞之間有依存關係是根據句法規則和詞義來定義的。例如:主語、賓語從屬於謂語等。
  對於這樣的依存關係,我們以“北京是中國的首都”為例,可以得到依存關係樹:
在這裡插入圖片描述

  很明顯,在一句話中,動詞是句子的中心,它支配其他成分,而不受其他成分支配。在上例中,動詞“是” 是句子的中心,其他成分依存於它。

  我們可以用有向圖和依存樹的形式表示依存語法,上例“北京是中國的首都”就是用依存樹的方式表示的。有向圖表示方法舉例如下:
在這裡插入圖片描述

  圖中,SBV、VOB、DE、ATT表示詞與詞之間不同的依存關係。

  對於依存文法理論的其他內容,例如:依存關係的細化、依存語法的公理、句法的投射性與非投射性以及中文依存樹語料庫等等,就不再一一進行贅述,有興趣的朋友們可以自行查閱相關內容~

3.依存句法分析方法

  目前,依存句法分析主要是在大規模訓練語料的基礎上用機器學習的方法(資料驅動方法)得到依存句法分析器。

  資料驅動的依存句法分析方法主要有兩種主流方法:
  1.基於圖(graph-based) 的依存句法分析方法

將依存句法分析問題看成從完全有向圖中尋找最大生成樹的問題。
  2.基於轉移(transition-based) 的依存句法分析方法
將依存樹的構成過程建模為一個動作序列,將依存分析問題轉化為尋找最優動作序列的問題。

3.1基於圖的依存句法分析

  基於圖的生成式分析方法基本思路如下:
  1.生成所有節點的完全有向圖
  2.用各種概率統計法(如最大似然估計)計算各邊的概率
  3.取權值最大的邊加入有向圖中
  4.使用Prim最大生成樹演算法,計算出最大生成樹,格式化輸出
  很明顯,問題可以轉化為傳統最小生成樹問題(將邊概率取負對數即可)。
  可以看出,上述過程中最重要的部分是依存邊概率的計算。

  舉個例子:分析句子“我吃米飯”的依存關係
  值得注意的是,進行句法分析的輸入是進行過詞法分析的句子,如下:
  [ 我 / rr,吃 / v,米飯 / nf ]

3.1.1 第一步:生成完全有向圖

在這裡插入圖片描述

  值得注意的是,依存句法樹中有虛根的存在,因此,為完全有向圖加入一個虛節點,這樣圖中一共有( n + 1 n+1 n+1)個節點( n n n為句子中的詞數),句子變成:
[ “核心” / root,我 / rr,吃 / v,米飯 / n ]

  以此例為例,每個節點都與另外三個節點構成一條有向邊,一共 4 ∗ 3 = 12 4 * 3 = 12 43=12條。

3.1.2 第二步:計算各邊權值

  假設 wordA 為詞 A,wordB 為詞 B,tagA 為 A 的詞性,tagB 為 B 的詞性。
  那麼各邊權值如下:
W A t o B = − l o g ( w o r d A t o w o r d B 依 存 關 系 數 / 總 數 ) W_{AtoB} =−log(wordA to wordB 依存關係數 / 總數) WAtoB=log(wordAtowordB/)

W A t o B = − l o g ( w o r d A t o t a g B 依 存 關 系 數 / 總 數 ) ∗ 10 W_{AtoB} =−log(wordA to tagB 依存關係數 / 總數) *10 WAtoB=log(wordAtotagB/)10

W A t o B = − l o g ( t a g A t o w o r d B 依 存 關 系 數 / 總 數 ) ∗ 10 W_{AtoB} =−log(tagA to wordB 依存關係數 / 總數) *10 WAtoB=log(tagAtowordB/)10

W A t o B = − l o g ( t a g A t o t a g B 依 存 關 系 數 / 總 數 ) ∗ 100 W_{AtoB} =−log(tagA to tagB 依存關係數 / 總數) *100 WAtoB=log(tagAtotagB/)100

  對數函式中的內容依然從語料中利用最大似然估計統計獲得。

  其中,詞到詞(第一行)的轉移概率作為主要因素,其餘轉移概率主要為平滑操作使用(防止零概率問題)。
  此外,為了各種權重的公平起見,對後三行的轉移概率進行了加權操作(*10,*100)。
  加權值的獲取在這裡不進行詳細描述,有疑問或者感興趣的朋友可以自行查閱相關資料或私聊本人~

3.1.3 第三步:獲取最小生成樹

  對上圖進行最小生成樹演算法,得到最小生成樹:
在這裡插入圖片描述

3.1.4 第四步:格式化輸出

  根據最小生成樹,得到依存關係樹並輸出視覺化結果:
在這裡插入圖片描述

  該種生成式方法準確率較高,但是演算法的複雜度較高,一般為 O ( n 3 ) 或 O ( n 5 ) O (n^3) 或 O (n^5) O(n3)O(n5),而且不易加入語言特徵。

3.2 基於轉移的依存句法分析

  基於轉移的決策式(確定性)分析概率方法基本思想如下:
  模仿人的認知過程,按照特定方向每次讀入一個詞。
  每讀入一個詞,根據當前狀態做出決策(比如,判斷是否與前一個詞發生依存關係)。一旦決策做出,將不再改變。
  分析過程可以看作是一步步作用於輸入句子之上的分析動作序列。
  該種演算法用三元組$ (S,I,A)$表示分析狀態格局,仿照人類從左
到右的閱讀順序,不斷地讀入單詞,每讀入一個單詞便根據該單詞特徵和當前分析狀態格局特徵確定當前最佳動作,逐個讀入單詞並一步步“拼裝”句法樹。
  三元組 ( S , I , A ) (S,I,A) (S,I,A) 分別表示棧、佇列、依存弧集合:
  棧( S S S):用來儲存系統已經處理過的句法子樹的根節點。初始狀態下 S = [ R o o t ] S= [ Root] S=[Root];定義從棧頂起的第 i i i個元素為 s i s_i si,棧頂元素為 s 1 s_1 s1
  棧結構如圖所示:
在這裡插入圖片描述

  圖中 s 1 s_1 s1稱為右焦點詞, s 2 s_2 s2稱為左焦點詞,後記動作都是圍繞著這兩個焦點詞展開的。
  佇列( I I I):用來存放未處理結點序列。初始狀態下佇列就是整個句子 b = [ w 1 , w 2 , . . . , w n ] b=[w_1,w_2,...,w_n ] b=[w1,w2,...,wn]
  佇列結構如圖所示:
在這裡插入圖片描述

  依存弧集合( A A A):一條依存弧有兩個資訊:動作型別+依存關係名稱。
  依存關係名稱取決於語料庫中依存關係的label;
  而在Arc-eager 分析法中,動作型別有如下4種:
  1.入棧(Shift):
  Shift操作
在這裡插入圖片描述

  2.依存弧向左指(Left-Arc):
  Left-Arc操作
在這裡插入圖片描述

  3.依存弧向右指(Right-Arc):
  Right-Arc操作
在這裡插入圖片描述

4.出棧(Reduce):
Reduce操作
在這裡插入圖片描述
  該種方法每讀入一個單詞便根據該單詞特徵和當前分析狀態格局特徵確定當
  前最佳動作,逐個“拼裝”句法樹。
  對該過程不太明確的朋友們可以私信我進行交流探討,在這裡就不再贅述啦~
  值得注意的是,在傳統統計學習方法中,上文提到的兩種特徵均由人提取出來,例如單詞資訊、詞性資訊等等,在這裡同樣不再進行贅述,有興趣的朋友們可以自行查閱資料~
  最終,我們可以通過輸入的句子和根據每一步的特徵得到的一組操作得到依存關係樹:
在這裡插入圖片描述

3.3 基於神經網路的依存句法分析

  一般來說,任何提取特徵的工作都可以交給神經網路去做。於是,我們可以利用神經網路實現上述方法:將構成特徵的資訊項(詞、句子、詞性等)作為神經網路的輸入,由神經網路自動進行特徵提取和組合。

3.3.1 DNN方法

  網路結構如圖所示:
在這裡插入圖片描述

  輸入是構成特徵的資訊項,輸出是四種動作(Shift、Left-Arc、Right-Arc、Reduce)的概率分佈:
在這裡插入圖片描述
  圖中 X 為輸入,Y 為輸出。
  模型的訓練和學習過程與普通的DNN類似,這裡就不再進行贅述。

3.3.2 RNN方法

  前文介紹的DNN方法只使用了格局中部分結點的上下文資訊進行依存分析,於是人們想到了用RNN使用全部資訊(已生成的部分依存子樹、輸入佇列子串、已有的分析動作序列)進行句法分析:
  將分析狀態格局的棧、佇列和動作分別用三個stack-LSTM(棧式LSTM)表示(分析格局資訊為全部上下文資訊),分析過程仍是每讀入一個單詞,根據該單詞的當前格局和動作歷史資訊確定當前最佳動作,最後一步步拼裝句法樹。

  棧式LSTM(stack-LSTM) 結構如下圖所示:
在這裡插入圖片描述

  從圖中不難看出,該種結構利用棧指標確定當前詞,即當前步驟中,三個棧(分析狀態格局的棧、佇列棧和動作棧)中需要考慮的詞。

  棧操作對stack-LSTM的影響如下:
在這裡插入圖片描述

  其中,push操作為:輸入加到棧頂;pop操作為:棧指標回到先前位置。

  於是,利用RNN的依存句法分析方法模型結構如下:
在這裡插入圖片描述

  很明顯,圖中棧 A 只做push操作,加入新動作;而棧 S 的棧頂可以是單個單詞,也可以是部分已經建立好的句法樹片段。
  模型的訓練與RNN的訓練方式類似,這裡不再進行贅述。

  最後,我們可以通過讀取棧 A 所儲存的動作序列集合拼裝句法樹。

4.依存句法分析評價方法


  依存句法分析評價方法分為三種:
  1.無標記依存正確率(unlabeled attachment score, UA):所有詞中找到其正確支配詞的詞所佔的百分比,根結點也算在內。
  2.帶標記依存正確率(labeled attachment score, LA):所有詞中找到其正確支配詞並且依存關係型別也標註正確的詞所佔的百分比,根結點也算在內。
  3.依存正確率(dependency accuracy, DA):所有非根結點詞中找到其正確支配詞的詞所佔的百分比。

  看起來有些複雜,沒關係我們舉個例子:
在這裡插入圖片描述

  圖中,系統輸出與標準答案之間不完全相同的有兩個:“外資(3,nmod)”以及“重要(6,sbj)”。
  對於無標記依存正確率UA而言,不考慮標記,只考慮支配詞。所以“重要(6,sbj)”的支配詞正確即算作正確,而“外資(3,nmod)”支配詞不正確,所以不算作正確;
  而對於帶標記依存正確率LA而言,考慮標記同時考慮支配詞,所以二者均不算作正確;
  依存正確率DA相當於不考慮根節點的UA,只考慮支配詞,不考慮標記。

5.短語結構樹與依存結構樹

  短語機構也成為完全句法結構(NLP入門概覽(8)——句法分析b:完全句法分析),短語結構和依存結構是目前句法分析中研究最廣泛的兩類文法體系,依存樹偏重關係結構,短語樹偏重組成結構,故語義分析中常用依存句法分析。而且,二者可以相互轉換。
  實現方法如下:
  (1) 定義中心詞抽取規則,產生中心詞表;
  (2) 根據中心詞表,為句法樹中每個節點選擇中心子節點;
  (3) 將非中心子節點的中心詞依存到中心子節點的中心詞上,得到相應的依存結構。
  第一步中,漢語和英語的中心詞抽取規則很多文獻都有提到,這裡不再進行贅述,有需要的朋友可以自行查閱或者私信我~

  實現方法很容易理解,下面我們舉個例子:
  假設短語結構樹如下:
在這裡插入圖片描述

  根據中心詞表為每個節點選擇中心子節點(中心詞通過自底向上傳遞得到),然後將非中心子節點的中心詞依存到中心子節點的中心詞上。
  於是,我們可以得到:
在這裡插入圖片描述

  在這一部分中,我們主要介紹了依存關係分析,針對規則法、統計法、神經網路法介紹了實現依存關係的各種方法。
  在下一部分的內容中,我們將會介紹NLP領域的另外一個重要問題:語義分析。

參考文獻

[1] https://blog.csdn.net/echoKangYL/article/details/89230394