nlp 筆記:A Fast and Accurate Dependency Parser using Neural Networks
概要:本文使用神經網絡完成了一個快速準確的依存語法分析程序,也就是句子的結構。
- introduction:
以前的depenency parser效果很好,但是有幾個問題:
- 所用的特征很稀疏,而數據不夠訓練這些權重。
- 特征都是人工提取的模版,需要專業知識的情況下還經常不全面。
- 計算這些特征十分費時。
作者想出了一個好方法來解決這些問題,其實我覺得這些都是第一個問題帶來的。
- Transition-Based Dependency Parsing
先解釋什麽是Dependency Parsing。依存語法是一種二元非對稱關系,一個詞A有一個箭頭指向另外一個詞B, 箭頭上通常有標簽(label
此圖是論文中的例子,比如He就dependent於has,因為has說明了he要幹嘛,所以has是head。而he是has的名詞主語(nominal subjective),就是label。可以看出圖中的關系形成了一棵樹。
接下來解釋什麽叫transition-based。依舊是論文的例子。圖:
parser有以下幾項:
- 一個stack S,root第一個入棧,棧頂靠右,圖中棧頂是詞good。
- 一個buffer B,第一個元素是在最左邊,按照句子的順序開始。
- 一個放dependency邊的集合A。
- transition的集合
在本文中,有如下幾種transition:
- LEFT-ARC(l): 往A中增加一條s1到s2的邊,label是l
- RIGHT-ARC(l): 往A中增加一條s2到s1的邊,label是l
- SHIFT: 把b1移到stack中,前提是buffer的長度大於等於1
對於論文中的例子,有下圖:
這樣就可以得到句子的dependency 樹了,也就是句子的結構。
-
Neural Network Based Parser
本文的目的是通過現有的信息,預測出下一步的transition。首先是所用的模型:
如圖所示:
輸入由三部分組成,詞,詞的詞性,詞的箭頭的label,但是全都是embedding的形式。一共選18個詞xw:(1)stack和buffer的前3個單詞:s1、s2、s3、b1、b2、b3;(2)棧頂兩個單詞的第一個和第二個最左邊/最右邊的子單詞:lc1(si), rc1(si), lc2(si), rc2(si), i = 1,2。(3)最左邊的最左邊/最右邊的最右邊——堆棧上最上面兩個單詞的大多數子元素:lc1(lc1(si))、rc1(rc1(si))、i = 1,2。xt:使用這18個詞的詞性標記,xl對應的單詞arc的label,不包括Sl堆棧/緩沖區上的那6個單詞,有12個,沒有的元素用null來代替。embedding的長度是50,直接行向量的形式連接起來,所以輸入長度是50*(18+18+12)。
隱藏層的長度是200,由圖中公式算出,值得註意的是,公式不僅是進行了線性變換,加了一個三次方,論文中說比起tanh或者sigmoid效果很不錯,但是原因說不出,說是有待理論調查。
最終輸出層是softmax,有2n+1個transition待選,選出其中可能性最高的。n是總的label的數量。leftarc * n+rightarc * n +shift,共2n+1個transition可選。
最終實驗效果很好,速度很快。
具體的訓練實驗細節和模型評估等請看論文A Fast and Accurate Dependency Parser using Neural Networks。
感嘆:word2vec對於nlp的影響真大。
nlp 筆記:A Fast and Accurate Dependency Parser using Neural Networks