自然語言處理任務中,有很重要的一塊,就是分析語言的結構。語言的結構,一般可以有兩種視角:
前者,主要關心的是句子是怎麼構成的,詞怎麼組成短語。所以研究Constituency,主要是研究忽略語義的「語法」結構(context-free grammars)。
後者,依賴關係,則主要關心的是句子中的每一個詞,都依賴於哪個其他的詞。
比如下面這個句子:
「瞧這個可愛的小傻瓜!」「傻瓜」,是「瞧」這個動作的對象,因此「傻瓜」是依賴於「瞧」的;「可愛的」、「小」都是修飾「傻瓜」的,因此,這兩個形容詞都是依賴於「傻瓜」的;「這個」,同樣是指示「傻瓜」的,因此它也依賴於「傻瓜」。這樣,我們就清楚了這個句子中的所有依賴關係,畫成依賴關係圖則是這樣:
依賴關係注意,在圖中我們增加了一個根節點「Root」,這是為了讓「瞧」這個字也有依賴的對象。
當然,關係依存分析,還有很多的規則,裡面比較複雜,我不太感興趣,所以這裡不多寫了。
下面我們來介紹如何讓機器自動地幫我們來分析句子的結構。
傳統的基於轉移的依存分析(Transition-based Parsing)這裡主要介紹Nivre在2003年提出的「Greedy Deterministic Transition-Based Parsing」方法,一度成為依存分析的標準方法。這裡我簡單地介紹一下它的工作原理。
我們構造一個三元組,分別是Stack、Buffer和一個Dependency Set。
Set中則保存我們分析出來的依賴關係,最開始是空的。我們要做的事情,就是不斷地把Buffer中的詞往Stack中推,跟Stack中的詞判斷是否有依賴關係,有的話則輸出到Set中,直到Buffer中的詞全部推出,Stack中也僅剩一個Root,就分析完畢了。
下面,我通過一個十分簡單的例子,來演示這個過程。這次,我們分析的句子是:
分析的過程如下:
上面的過程怎麼理解呢?比方從第二行,這個時候Stack中只有[Root,I],不構成依賴關係,所以我們需要從Buffer中「進貨」了,因此採取的Action是Shift(把Buffer中的首個詞,移動到Stack中),於是就到了第三行。
第三行,我們的Stack變成了[Root,I,love],其中I和Love構成了依賴關係,且是Love指向I,即「向左指」的依賴關係,因此我們將採取「Left Arc」的action,把被依賴的詞(此時就是關係中的左邊的詞)給移除Stack,把這個關係給放入到Dependency Set中。
按照這樣的方法,我們一直進行,不斷地根據Stack和Buffer的情況,來從Shift、Left-arc、Right-arc三種動作中選擇我們下一步應該怎麼做,知道Stack中只剩一個Root,Buffer也空了,這個時候,分析就結束,我們就得到了最終的Dependency Set。
以上的過程,應該不難理解,但是相信大家此時一定會有疑問:
❝我怎麼讓機器去決定當前的Action呢?即機器怎麼知道,Stack中是否構成了依賴關係?
❞在Nivre的年代,這裡使用是機器學習的方法,需要做繁重的特徵工程。這裡的特徵,往往有
神經依存分析方法,是斯坦福團隊2014年的研究成果,主要就是利用了神經網絡的方法代替了傳統機器學習方法、用低維分布式表示來代替傳統方法的複雜的高維稀疏特徵表示。而整個解析的過程,依然是根據之前的Transition-based方法。
首先明確,我們的預測任務,是「根據當前的狀態,即Stack、Buffer、Set的當前狀態,來構建特徵,然後預測出下一步的動作」。
在神經依存分析中,我們的特徵是怎麼構建的呢?我們可以利用的信息包括詞(word)、詞性(pos tag)和依賴關係的標籤(label)。我們對這三者,都進行低維分布式表示,即通過Embedding的方法,把離散的word、label、tag都轉化成低維向量表示。
對於一個狀態,我們可以選取stack、Buffer、set中的某些詞和關係,構成一個集合,然後把他們所有的embedding向量都拼接起來,這樣就構成了該狀態的特徵表示。
至於選擇哪些詞、關係,這個就是一個「經驗性」的東西了,在斯坦福的論文中可以詳細了解。整個模型的網絡結構也十分簡潔:
A Fast and AccurateDependency Parser using Neural Networks對於Dependency Parsing的簡單介紹就到此為止。依存分析,並不是我們NLP中最常見的任務之一,我們也很少看到直接將依存分析做應用的,我們更常見的是分類、實體識別、閱讀理解、對話等任務。但是依存分析,作為自然語言處理的一項基礎技術,試圖讓機器去理解語言的內部結構,理解了結構,NLU(Natural Language Understanding)才成為可能。
cs224n的Assignment3就是Neural Dependency Parsing的實現,代碼見github:
https://github.com/beyondguo/CS224n-notes-and-codes/tree/master/assignment3
由於微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:
(1)點擊頁面最上方"AINLP",進入公眾號主頁。
(2)點擊右上角的小點點,在彈出頁面點擊「設為星標」,就可以啦。
感謝支持,比心。
進群請添加AINLP小助手微信 AINLPer(id: ainlper),備註NLP技術交流推薦閱讀
這個NLP工具,玩得根本停不下來
徵稿啟示| 200元稿費+5000DBC(價值20個小時GPU算力)
完結撒花!李宏毅老師深度學習與人類語言處理課程視頻及課件(附下載)
從數據到模型,你可能需要1篇詳實的pytorch踩坑指南
如何讓Bert在finetune小數據集時更「穩」一點
模型壓縮實踐系列之——bert-of-theseus,一個非常親民的bert壓縮方法
文本自動摘要任務的「不完全」心得總結番外篇——submodular函數優化
Node2Vec 論文+代碼筆記
模型壓縮實踐收尾篇——模型蒸餾以及其他一些技巧實踐小結
中文命名實體識別工具(NER)哪家強?
學自然語言處理,其實更應該學好英語
史丹福大學NLP組Python深度學習自然語言處理工具Stanza試用
關於AINLP
AINLP 是一個有趣有AI的自然語言處理社區,專注於 AI、NLP、機器學習、深度學習、推薦算法等相關技術的分享,主題包括文本摘要、智能問答、聊天機器人、機器翻譯、自動生成、知識圖譜、預訓練模型、推薦系統、計算廣告、招聘信息、求職經驗分享等,歡迎關注!加技術交流群請添加AINLPer(id:ainlper),備註工作/研究方向+加群目的。
閱讀至此了,分享、點讚、在看三選一吧🙏