自然語言處理NLP(8)——句法分析b:完全句法分析
在上一部分中,我們簡單介紹了完全句法分析的概念,並詳細介紹了句法分析的基礎:Chomsky形式文法(自然語言處理NLP(7)——句法分析a:Chomsky(喬姆斯基)形式文法)。
在這一部分中,我們將對完全句法分析進行詳細介紹。
回顧一下,句法分析共有三種型別:完全句法分析、區域性句法分析、依存關係分析。
對於完全句法分析,還是NLP領域中常用的三種解決方法:規則法、概率統計法、神經網路方法。
下面我們從這三個方法入手,對完全句法分析演算法進行介紹。
【一】規則句法分析演算法
從上述句法分析樹的生成過程來看,很明顯,句法分析演算法大致上由三種策略:
1.自底向上
2.自頂向下
3.自底向上於自頂向下相結合
自底向上的方法從句子中的詞語出發,基本操作是將一個符號序列匹配歸約為其產生式的左部(用每條產生式左邊的符號來改寫右邊的符號),逐漸減少符號序列直到只剩下開始符S為止。
自頂向下的方法從符號S開始搜尋,用每條產生式右邊的符號來改寫左邊的符號,然後通過不同的方式搜尋並改寫非終結符,直到生成了輸入的句子或者遍歷了所有可能的句子為止。
常用的句法分析演算法有線圖(chart)分析演算法、CYK分析演算法等等。
線圖法將每個詞看作一個結點,通過在結點間連邊的方式進行分析,演算法的時間複雜度為 ,其中為句子中詞的個數;
CYK方法通過構造識別矩陣進行分析,時間複雜度相對線圖法有所減小。
具體演算法在這裡不進行贅述,有興趣的朋友們可以自行查閱相關資料~
無論對於上述任何一種方法而言,都由一個共同的缺點:難以區分歧義結構。
因此,引入概率統計法進行句法分析。
【二】概率統計句法分析演算法
利用概率統計法進行句法分析,主要採用概率上下文無關文法(PCFG),它是CFG的概率拓廣,可以直接統計語言學中詞與詞、詞與片語以及片語與片語之間的規約資訊,並且可以由語法規則生成給定句子的概率。
在這裡多說一句,在NLP領域中,如果引入了概率,那麼這種方法的作用很有可能是消歧,因為我們可以根據概率的大小對可能出現的情況進行選擇。
而概率上下文無關文法(PCFG)的主要任務有兩個:
1.句法分析樹的消歧
2.求最佳分析樹
二者之間有很大的相似之處。
概率上下文無關文法(PCFG)
一個PCFG由如下五個部分組成:
1.一個非終結符號集
2.一個終結符號集
3.一個開始非終結符
4.一個產生式集
5.對任意產生式 ,其概率為 ,產生式具有形式:
其中,,且
前四個部分與Chomsky形式文法中的概念類似,在這裡不再進行贅述。
舉個例子(這裡只列出重寫規則——產生式集 ):
朋友們可能還是沒有一個直觀的瞭解,那麼我們來對比一下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.祖先無關性:子樹的概率與推匯出該子樹的祖先結點無關。
三個假設都很好理解,在這裡就不做過多解釋了。
還是以上例分析:
生成的整棵句法樹的概率就是以這種方式計算出來的(其實就是概率值按照樹結構的累乘,很容易理解)。
有了概率,消歧就很容易了:
假設上面的句子可以生成兩個不同的句法樹 :
很明顯,選擇概率大的句法樹 作為句法分析的結果。
對於給定的句子 ,如有兩棵句法分析樹的概率不等且 ,則分析結果 正確的可能性大於 ,據此可以進行句法歧義消解。
特別地,語句在文法的概率等於所有分析樹概率之和。
有了概率,有了選擇分析樹的方法,對於給定的一個句子,能不能求出最佳分析樹呢?
很明顯,我們有一種稍顯笨拙的方法:窮舉法——找到每一個可能的句法樹,計算概率,然後取概率最大的句法樹作為分析結果。但是這種方法有很大的弊端:效率非常低,尤其是當句子較長,生成句法樹有多棵時,效率極低。
之前在HMM評估問題和解碼問題中(自然語言處理NLP(4)——序列標註a:隱馬爾科夫模型(HMM)),我們曾經介紹過以動態規劃改進窮舉演算法的Viterbi演算法,對於求解最佳分析樹問題,也有類似的演算法——PCFG Viterbi演算法。
PCFG Viterbi演算法
首先,與Viterbi演算法類似,先定義PCFG Viterbi演算法中的變數:
:非終結符 推匯出語句 中子字串 的最大概率
:記憶字串 的Viterbi語法分析結果
此外,我們的輸入是文法 以及語句
PCFG Viterbi演算法流程如下:
1.初始化:
2.歸納計算:對於,重複下列計算
輸出:分析樹根結點為 (文法開始符號),從開始回溯,得到最優樹。
上述過程可能有些抽象,我們來舉個例子。
假設有如下PCFG:
輸入的句子為:‘John ate fish with bone’,求它的最佳分析樹。
過程如下圖所示:
上圖中,PCFG Viterbi演算法是從最底層開始執行的:最底層的豎線連結相當於初始化過程;
此後,按照上面描述的演算法過程分別計算兩個詞、三個詞(圖中的結點)構成文法的概率,直到最後一層。
最後,對整個句子進行回溯即可得到最佳分析樹:
【三】神經網路句法分析
在介紹神經網路句法分析方法之前,首先要了解遞迴神經網路RvNN。
很明顯,在句法分析中,我們希望將句子按照結構進行分解,得到分析樹。
以此為目標,RvNN的基本思想很簡單:希望將問題在結構上分解為一系列相同的“單元”,單元的神經網路可以在結構上展開,且能沿展開方向傳遞資訊。
具體有關RvNN的內容在這裡就不再贅述,不瞭解的朋友們可以參考部落格:神經網路基礎:DNN、CNN、RNN、RvNN、梯度下降、反向傳播,裡面有很詳細的介紹。
現在,我們有了RvNN,想要對一句話進行句法分析,要怎麼做呢?
其實過程與上述PCFG Viterbi演算法有相似之處,我們來舉個例子。
假設有一句話:“我弟弟準備一切用品”,我們已經對它做好了詞法分析,於是這句話成了這個樣子:
“我/PN 弟弟/NN 準備/VV 一切/QP 用品/NN”(空格表示分詞)。
在這裡再次強調一下,所有句法分析的輸入一定是詞法分析之後具有詞性等資訊的,已經分好詞的句子。
然後,我們將分好詞的句子輸入神經網路:
此時,神經網路可以得到“我弟弟”、“弟弟準備”、“準備一切”、“一切用品”這四種組合的打分,假設“我弟弟”的打分最高,那麼神經網路將選出這兩個詞進行組合。
組合之後,“我弟弟”就成了一個詞,各組成部分不可單獨與句子中的其他詞進行組合,網路結構變成了這個樣子:
接下來,繼續對相鄰兩個詞進行組合:
假設這一步中“一切用品”的打分最高,神經網路選出這兩個詞進行組合,各組成部分不可再單獨與句子中的其他詞進行組合,網路結構調整如下:
我們可以看到,“準備一切”的組合已經消失,因為“一切”已經和“用品”組成一個詞“一切用品”。
而“準備”還未與任何詞(或片語)進行組合,因此計算“我弟弟準備”和“準備一切用品”的打分,假設後者得分更高。
那麼下一步:
最後,我們得到:
至此,句法分析完成,我們得到了句向量和該種結構的打分。
【四】句法分析評價標準
在瞭解了各種句法分析方法之後,我們來看看如何評價一個句法分析結果的好壞。
分析樹中 非終結符節點 (短語)標記格式如下:
XP-(起始位置:終止位置)
其中,XP為短語名稱,(起始位置:終止位置)為該節點的跨越範圍,起始位置指該節點所包含的子節點的起始位置,終止位置為該節點所包含的子節點的終止位置。
舉個例子:
效能指標依然是老三樣:精度(precision, P)、召回率(recall, R)以及F值。
對這三個概念不瞭解的朋友們可以參考:自然語言處理NLP(6)——詞法分析中的第五部分:詞法分析評價指標。
假設我們有這樣一句話:
‘Sales executives were examining the figures with great care yesterday.’
我們給出的標準句法分析答案如下:
模型給出的答案如下:
二者結果中紅色部分是相同的部分,表示系統分析結果只有3個短語與標準答案完全一樣,且標準輸出和系統分析結果都有8個短語,那麼:
在這一部分中,我們主要介紹了完全句法分析,並詳細介紹瞭解決完全句法分析問題的三種方法:規則法、概率法、神經網路法。
在下一部分的內容中,我們將會介紹句法分析領域的另外兩個主題:區域性句法分析、依存關係分析。
如果本文中某些表述或理解有誤,歡迎各位大神批評指正。
謝謝!
相關文章
- 自然語言處理NLP(7)——句法分析a:Chomsky(喬姆斯基)形式文法自然語言處理
- python自然語言處理學習筆記(八)—— 句法分析Python自然語言處理筆記
- 自然語言處理NLP(四)自然語言處理
- 自然語言處理(NLP)概述自然語言處理
- 自然語言處理(NLP)系列(一)——自然語言理解(NLU)自然語言處理
- 自然語言處理(NLP)簡介 | NLP課程自然語言處理
- 自然語言處理NLP快速入門自然語言處理
- Pytorch系列:(六)自然語言處理NLPPyTorch自然語言處理
- 2023nlp影片教程大全 NLP自然語言處理教程 自然語言處理NLP從入門到專案實戰自然語言處理
- 自然語言處理NLP(6)——詞法分析自然語言處理詞法分析
- 自然語言處理(NLP)路線圖 - kdnuggets自然語言處理
- NLP教程(4) - 句法分析與依存解析
- Python自然語言處理實戰(1):NLP基礎Python自然語言處理
- 中文和英文NLP自然語言處理異同點分析自然語言處理
- NLP自然語言處理中的hanlp分詞例項自然語言處理HanLP分詞
- NLP神經語言學的12條假設(不是自然語言處理哪個NLP哈)自然語言處理
- 《NLP漢語自然語言處理原理與實踐》學習四自然語言處理
- 「NLP」一文彙總自然語言處理主要研究方向自然語言處理
- 自然語言處理(NLP)- 一個英文拼寫糾錯系統自然語言處理
- 史丹佛NLP團隊釋出最新自然語言處理Python庫自然語言處理Python
- Pytext 簡介——Facebook 基於 PyTorch 的自然語言處理 (NLP) 框架PyTorch自然語言處理框架
- HanLP 自然語言處理 for nodejsHanLP自然語言處理NodeJS
- 自然語言處理 NLP 基本概念大全,讓非技術也能看懂 NLP自然語言處理
- NLP(十二)依存句法分析的視覺化及圖分析視覺化
- NLP之統計句法分析(PCFG+CYK演算法)演算法
- 一文概覽NLP句法分析:從理論到PyTorch實戰解讀PyTorch
- NLP漢語自然語言處理入門基礎知識自然語言處理
- [譯] 自然語言處理真是有趣!自然語言處理
- 自然語言處理:分詞方法自然語言處理分詞
- NLP 與 NLU:從語言理解到語言處理
- 如何將Python自然語言處理速度提升100倍:用spaCy/Cython加速NLPPython自然語言處理
- 什麼是NLP,NLP主要有什麼用,為什麼要學自然語言處理?自然語言處理
- 配置Hanlp自然語言處理進階HanLP自然語言處理
- 自然語言處理的最佳實踐自然語言處理
- 自然語言處理之jieba分詞自然語言處理Jieba分詞
- 人工智慧 (06) 自然語言處理人工智慧自然語言處理
- 自然語言處理與情緒智慧自然語言處理
- 精通Python自然語言處理 2 :統計語言建模Python自然語言處理