什么是依存句法樹
依存句法樹就是表示一個句子中詞與詞之間的依存關系,如下圖
其中兩個詞之前的弧表示這兩個詞有依存關系,弧上的標簽為二者的關系,弧的始發(fā)點為父親節(jié)點,箭頭指向為孩子節(jié)點。比如The 和 fox 是冠詞+名詞(det)的名詞短語。
除了一個詞,即根節(jié)點(這里為jumped)外,其他詞都有詞作為父親節(jié)點,而該根節(jié)點(jumped)的父親節(jié)點為root。
但是注意,依存句法樹是不允許弧之間有交叉或者回路!
依存句法樹數(shù)據(jù)表示
依存句法樹的文本表示格式為conll格式,如表
根據(jù)該表的父親節(jié)點索引和對應的弧上關系就能還原該依存句法樹。其中-1表示根節(jié)點。
依存句法樹的用途
我們通常將依存句法的特征融入到其他任務模型里,比如機器翻譯、意見挖掘、語篇分析等,一般能得到更好的性能。
那怎么得到依存句法特征呢?通常有兩種方法:
將依存句法樹喂給遞歸神經(jīng)網(wǎng)絡,得到的隱層表示可以作為該依存句法的特征表示。
將依存句法樹交給特征模板,從而得到該依存句法的特征表示。
什么是Transition-based基于轉(zhuǎn)移的框架?
這個框架由狀態(tài)和動作兩部分構成,其中狀態(tài)用來記錄不完整的預測結果,動作則用來控制狀態(tài)之間的轉(zhuǎn)移。
用在生成依存句法樹上,則具體表示為從空狀態(tài)開始,通過動作轉(zhuǎn)移到下一個狀態(tài),一步一步生成依存句法樹,最后的狀態(tài)保存了一個完整的依存樹。依存分析就是用來預測詞與詞之間的關系,現(xiàn)在轉(zhuǎn)為預測動作序列。在基于轉(zhuǎn)移的框架中,我們定義了4種動作(棧頂?shù)脑卦叫”硎倦x棧頂越近):
移進(shift):隊列首元素出棧,壓入棧成為。
左規(guī)約(arc_left_l):棧頂2個元素規(guī)約,下沉成為的左孩子節(jié)點,l為弧上關系。
右規(guī)約(arc_right_l):棧頂2個元素規(guī)約,下沉成為的右孩子節(jié)點,l為弧上關系。
根出棧(pop_root):根節(jié)點出棧,分析完畢。
ps:下沉的意思
0下沉,視覺效果能看出是1的孩子
所以,我們基于轉(zhuǎn)移的依存句法分析器就由預測樹結構問題轉(zhuǎn)為預測動作序列問題。使得問題簡單了不少。
Transition-based基于轉(zhuǎn)移的具體例子
還是以上面的依存樹為例:
一整套依存分析的動作序列(金標,訓練數(shù)據(jù))就變?yōu)椋?/p>
詳細解釋下:
初始狀態(tài)
棧為空,隊列為整個文本的數(shù)字序列。這個時候只能進行移進shift操作:
因為左邊棧對一個元素0,還是只能進行移進shift操作:
這個時候棧中有2個元素,我們此時看依存樹
0、1之間并沒有弧,不能進行規(guī)約,所以還是只能shift:
此時看棧頂兩元素,發(fā)現(xiàn)依存樹中1、2之間有依存關系
而且1為2的孩子,所以此時的動作為左規(guī)約arc_left,1下沉,為2的孩子(此時實際操作為1被踢出棧,棧里剩為0、2,踢出是因為最后能根據(jù)動作序列還原整個依存樹,當然也為了接下來的操作方便),此時標簽為amod:
此時棧里為0、2,再次查看依存樹
發(fā)現(xiàn)0、2之間有依存關系,其中0為2的孩子,所以此時操作為左規(guī)約,此時標簽為det
...
中間略過一些步驟,因為都是同理,這次說下第9步:
此時棧中為3、4,查看依存樹
按照正常操作,此時應該arc_right右規(guī)約,但是如果真的4就下沉,就沒了。而一會5要入棧,再查看依存樹發(fā)現(xiàn)4是自己的爸爸,天吶,5的爸爸沒了,找不到了,消失了,其他詞都有爸爸,就5沒有,還有比這個更慘的嗎?這就沒發(fā)再進行操作了!所以,還有一個潛規(guī)則如果操作為棧頂元素要進行arc_right時,不執(zhí)行該操作,而選擇shift。
而你可能會問arc_left會有這樣的問題嗎?不會啦,比如3、4進行arc_left操作,3下沉,如果右邊的隊列中有父親節(jié)點是3,那么就表示該依存樹有交叉或者回路!這種是不可能發(fā)生的,因為依存樹不允許有交叉或者回路?。ú恍诺脑挘阕约寒嫯嬙囋嚕?/p>
最后說下,pop_root根彈出操作,只能發(fā)生在最后
右下角的數(shù)據(jù)為詞與詞之間的關系,這個就是根據(jù)動作序列生成的依存關系(父親,孩子,關系),根據(jù)該關系,就能還原成原來的依存樹。
神經(jīng)網(wǎng)絡模型
我們用神經(jīng)網(wǎng)絡來進行特征抽取,該網(wǎng)絡共分為2部分:
編碼端:用來負責計算詞的隱層向量表示
解碼端:用來解碼計算當前狀態(tài)的所有動作得分
編碼端
我們用Bi-LSTM來編碼一個句子
,計算對應的隱層表示
。公式表示為:
其中,為詞向量,為詞性向量,為向量拼接。
具體解釋:
就是咱們平時用的詞的embedding
就是詞性,比如是NN,VV,VP等。將它當成詞的操作一樣,用它自己的embedding(和詞的embedding不是一個?。┍硎?。
就是向量拼接,咋拼接都行,cat呀,add呀都行的。自己嘗試哪個效果好用哪個,沒有死規(guī)定。而我們這里用的是cat。
解碼端
解碼端就需要對每一個狀態(tài)打出所有動作的得分。根據(jù)經(jīng)驗,認為棧頂三元素和隊列首元素為動作預測關鍵特征,于是將棧頂三元素(下標越小離棧頂越近)和隊列首元素進行拼接。然后用線性變換計算每一個動作的分數(shù):
模型預測
對每一個動作的分數(shù)進行Softmax概率化,然后輸入到交叉熵中,作為目標函數(shù)。然后再用Adam來進行更新模型參數(shù),最小化目標函數(shù):
其中為金標動作序列的概率,為模型參數(shù)。
-
神經(jīng)網(wǎng)絡
+關注
關注
42文章
4733瀏覽量
100420 -
框架
+關注
關注
0文章
398瀏覽量
17404 -
機器翻譯
+關注
關注
0文章
139瀏覽量
14862
原文標題:詳解Transition-based Dependency parser基于轉(zhuǎn)移的依存句法解析器
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論