《自然語言處理入門》12.依存句法分析--提取使用者評論

文章推薦指數: 80 %
投票人數:10人

常見的英文樹庫有賓州樹庫,相應地,中文領域有CTB。

... 依存句法分析( dependency parsing )指的是分析句子的依存語法的一種中高階NLP任務,其輸人 ... 程式人生>>《自然語言處理入門》12.依存句法分析--提取使用者評論 《自然語言處理入門》12.依存句法分析--提取使用者評論 阿新••發佈:2020-02-18 筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP 12.依存句法分析 語法分析(syntacticparsing)是自然語言處理中一個重要的任務,其目標是分析句子的語法結構並將其表示為容易理解的結構(通常是樹形結構)。

同時,語法分析也是所有工具性NLP任務中較為高階、較為複雜的一種任務。

通過掌握語法分析的原理、實現和應用,我們將在NLP工程師之路上跨越一道分水嶺。

本章將會介紹短語結構樹和依存句法樹兩種語法形式,並且著重介紹依存句法分析的原理和實現。

12.1短語結構樹 語言其實具備自頂而下的層級關係,固定數量的語法結構能夠生成無數句子。

比如,僅僅利用下列兩個語法規律,我們就能夠生成所有名詞短語。

名詞短語可以由名詞和名詞短語組成。

名詞短語還可以由名詞和名片語成。

例如,“上海+浦東+機場+航站樓”,所以,漢語中大部分句子都可以通過這樣的語法來生成。

在語言學中,這樣的語法被稱為上下文無關文法,它由如下元件構成: 終結符結合Σ,比如漢語的一個詞表。

非終結符集合V,比如“名詞短語”“動詞短語”等短語結構組成的集合。

V中至少包含一個特殊的非終結符,即句子符或初始符,計作S。

推到規則R,即推到非終結符的一系列規則:V->VUΣ。

基於上下文無關文法理論,我們可以從S出發,逐步推導非終結符。

一個非終結符至少產生一個下級符號,如此一層一層地遞推下去,我們就得到了一棵語法樹。

但在NLP中,我們稱其為短語結構樹。

也就是說,電腦科學中的術語“上下文無關文法”在語言學中被稱作“短語結構語法”。

短語結構樹 短語結構語法描述瞭如何自頂而下的生成一個句子,反過來,句子也可以用短語結構語法來遞迴的分解。

層級結構其實是一種樹形結構,例如這句話“上海浦東開發與法制建設同步”,分解成如下圖的短語結構樹: 這樣的樹形結構稱為短語結構樹,相應的語法稱為*短語結構語法**或上下文無關文法。

至於樹中的字母下面開始介紹。

賓州樹庫和中文樹庫 語言學家制定短語結構語法規範,將大量句子人工分解為樹形結構,形成了一種語料庫,稱為樹庫(treebank)。

常見的英文樹庫有賓州樹庫,相應地,中文領域有CTB。

上圖中葉子節點(詞語)的上級節點為詞性,詞性是非終結符的一種,滿足“詞性生成詞語”的推導規則。

常見的標記如下: IP-HLN 單句-標題 NP-SBJ 名詞短語-主語 NP-PN 名詞短語-代詞 NP 名詞短語 VP 動詞短語 但是由於短語結構語法比較複雜,相應句法分析器的準確率並不高,現在研究者絕大部分轉向了另一種語法形式。

12.2依存句法樹 不同於短語結構樹,依存句法樹並不關注如何生成句子這種巨集大的命題。

依存句法樹關注的是句子中詞語之間的語法聯絡,並且將其約束為樹形結構。

依存句法理論 依存語法理論認為詞與詞之間存在主從關係,這是一種二元不等價的關係。

在句子中,如果一個詞修飾另一個詞,則稱修飾詞為從屬詞(dependent),被修飾的詞語稱為支配詞(head),兩者之間的語法關係稱為依存關係(dependencyrelation)。

比如句子“大夢想”中形容詞“大”與名詞“夢想"之間的依存關係如圖所示: 圖中的箭頭方向由支配詞指向從屬詞,這是視覺化時的習慣。

將一個句子中所有詞語的依存關係以有向邊的形式表示出來,就會得到一棵樹,稱為依存句法樹(dependencyparsetree)。

比如句子“弱小的我也有大夢想”的依存句法樹如圖所示。

現代依存語法中,語言學家Robinson對依存句法樹提了4個約束性的公理。

有且只有一個詞語(ROOT,虛擬根節點,簡稱虛根)不依存於其他詞語。

除此之外所有單詞必須依存於其他單詞。

每個單詞不能依存於多個單詞。

如果單詞A依存於B,那麼位置處於A和B之間的單詞C只能依存於A、B或AB之間的單詞。

這4條公理分別約束了依存句法樹(圖的特例)的根節點唯一性、連通、無環和投射性(projective)。

這些約束對語料庫的標註以及依存句法分析器的設計奠定了基礎。

中文依存句法樹庫 目前最有名的開源自由的依存樹庫當屬UD(UniversalDependencies),它以“署名-非商業性使用-相同方式共享4.0”等類似協議免費向公眾授權。

UD是個跨語種的語法標註專案,一共有200多名貢獻者為70多種語言標註了100多個樹庫。

具體到中文,存在4個不同領域的樹庫。

本章選取其中規模最大的UD_ChineseGSD作為示例。

該樹庫的語種為繁體中文,將其轉換為簡體中文後,供大家下載使用。

http://file.hankcs.com/corpus/chs-gsd-ud.zip 該樹庫的格式為CoNLL-U,這是一種以製表符分隔的表格格式。

CoNLL-U檔案有10列,每行都是一個單詞,空白行表示句子結束。

單元中的下劃線_表示空白,結合其中一句樣例,解釋如表所示。

詞性標註集合依存關係標註集請參考UD的官方網站: http://niversaldependencies.org/guidelines.html 另一份著名的語料庫依然是CTB,只不過需要額外利用一些工具將短語結構樹轉換為依存句法樹。

讀者可以直接下載轉換後的CTB依存句法樹庫,其格式是類似於CoNLl-U的CoNLL。

依存句法樹的視覺化 工具如下: 南京大學湯光超開發的DependencyViewer。

匯入.conll副檔名的樹庫檔案即可。

brat標註工具。

視覺化工具可以幫助我們理解句法樹的結構,比較句子之間的不同。

12.3依存句法分析 依存句法分析(dependencyparsing)指的是分析句子的依存語法的一種中高階NLP任務,其輸人通常是詞語和詞性,輸出則是一棵依存句法樹。

本節介紹實現依存句法分析的兩種巨集觀方法,以及依存句法分析的評價指標。

基於圖的依存句法分析 正如樹是圖的特例一樣,依存句法樹其實是完全圖的一個子圖。

如果為完全圖中的每條邊是否屬於句法樹的可能性打分,然後就可以利用Prim之類的演算法找出最大生成樹(MST)作為依存句法樹了。

這樣將整棵樹的分數分解(factorize)為每條邊上的分數之和,然後在圖上搜索最優解的方法統稱為基於圖的演算法。

在傳統機器學習時代,基於圖的依存句法分析器往往面臨執行開銷大的問題。

這是由於傳統機器學習所依賴的特徵過於稀疏,訓練演算法需要在整個圖上進行全域性的結構化預測等。

考慮到這些問題,另一種基於轉移的路線在傳統機器學習框架下顯得更加實用。

基於轉移的依存句法分析 我們以“人吃魚”這個句子為例子,手動構建依存句法樹。

從“吃”連線到“人”建立依存關係,主謂關係。

從“吃”連線到“魚”建立依存關係,動賓關係。

如此,我們將一棵依存句法樹的構建過程表示為兩個動作。

如果機器學習模型能夠根據句子的某些特徵準確地預測這些動作,那麼計算機就能夠根據這些動作拼裝出正確的依存句法樹了。

這種拼裝動作稱為轉移(transition),而這類演算法統稱為基於轉移的依存句法分析。

12.4基於轉移的依存句法分析 Arc-Eager轉移系統 一個轉移系統S由4個部件構成:S=(C,T,Cs,Ct),其中: C是系統狀態的集合 T是所有可執行的轉移動作的集合。

Cs是一個初始化函式 Ct為一系列終止狀態,系統進入該狀態後即可停機輸出最終的動作序列。

而系統狀態又由3元祖構成:C=(σ,β,A)其中: σ為一個儲存單詞的棧。

β為儲存單詞的佇列 A為已確定的依存弧的集合。

Arc-Eager轉移系統的轉移動作集合詳見下表: Shift 佇列β非空 將隊首單詞i壓棧 LeftArc 棧頂單詞i沒有支配詞 將棧頂單詞i的支配詞設為隊首單詞j,即i作為j的子節點 RightArc 隊首單詞j沒有支配詞 將隊首單詞j的支配詞設為棧頂單詞i,即j作為i的子節點 Reduce 棧頂單詞i已有支配詞 將棧頂單詞i出棧 對於上面的“人吃魚”案例,Arc-Eager的執行步驟如下: 0 [] 初始化 [人,吃,魚,虛根] {} 1 [人] Shift [吃,魚,虛根] {} 2 [] LeftArc(主謂) [吃,魚,虛根] \(\{人\xleftarrow{主謂}吃\}\) 3 [吃] Shift [魚,虛根] \(\{人\xleftarrow{主謂}吃\}\) 4 [吃,魚] RightArc(動賓) [虛根] \(\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚\}\) 5 [吃] Reduce [虛根] \(\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚\}\) 6 [] LeftArc(核心) [虛根] \(\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚,吃\xleftarrow{核心}虛根\}\) 此時集合A中的依存弧為一顆依存句法樹。

訓練原理 對基於轉移的依存句法分析器而言,它學習和預測的物件是一系列轉移動作。

然而依存句法樹庫是一棵樹,並不是現成的轉移動作序列。

這時候就需要一個演算法將語料庫中的依存句法樹轉移為正確地轉移動作序列。

這裡可以使用感知機進行訓練得到轉移動作序列,原理詳見: 5.感知機分類與序列標註 訓練句法分析器時,結構化感知機演算法迭代式的優化線性模型,目標是使其將最高的分值賦予可抵達正確句法樹的轉移序列。

訓練分為以下幾個步驟: 讀入一個訓練樣本,提取特徵,建立ArcEager的初始狀態c。

若c不是終止狀態,反覆進行轉移序列,修正引數。

演算法終止,返回返回模型引數w。

12.5依存句法分析API 訓練模型 本節使用的語料庫是CTB8.0,執行程式碼的時候會自動下載語料庫:train_parser.py https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch12/train_parser.py 訓練時間比較長,結果如下: 1人人NNN_2nsubj__ 2吃吃VVV_0ROOT__ 3魚魚NNN_2dobj__ UAS=83.3%LAS=81.0% 標準化評測 給定兩棵樹,一棵樹為標準答案(來自測試集),一棵樹為預測結果,評測的目標是衡量這兩棵樹的差異。

如果將樹的節點編號,拆解為依存弧並分別存入兩個集合A(標準答案)和B(預測結果),則可以利用分類任務的F1評價指標。

依存句法分析任務採用的評測指標為UAS(unlabeledatachmentscore)和LAS(labeledattachmentscore),分別對應忽略標籤和包括標籤的F1值。

以LAS為例,具體計算方式如下: \[ P=\frac{|A\capB|}{|B|}\\ R=\frac{|A\capB|}{|A|}\\ LAS=\frac{2*P*R}{P+R} \] UAS的計算也是同理,只不過將每條依存弧上的標籤去掉後放人集合參與運算即可。

相較於LAS,UAS僅僅衡量支配詞的預測準確率,不衡量依存關係的準確率,一般分數更高。

在上面的訓練模型中已經做了評測 UAS=83.3%LAS=81.0% 這個分數說明,在測試集上有83%的支配詞被準確預測,有81%的依存弧被準確預測。

12.6案例:基於依存句法分析的意見抽取 其實許多人都有一個疑問,依存句法分析究竟可以用來幹什麼。

本節就來利用依存句法分析實現一個意見抽取的例子,提取下列商品評論中的屬性和買家評價。

電池非常棒,機身不長,長的是待機,但是螢幕解析度不高。

為了提取“電池”“機身”“待機”和“解析度”所對應的意見,樸素的處理方式是在分司和詞性標註之後編寫正則表示式,提取名詞後面的形容詞。

然而正則表示式無法處理“長的是待機”這樣句式靈活的例子。

這時就可以對這句話進行依存句法分析,分析程式碼如下: frompyhanlpimport* CoNLLSentence=JClass('com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLSentence') CoNLLWord=JClass('com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord') IDependencyParser=JClass('com.hankcs.hanlp.dependency.IDependencyParser') KBeamArcEagerDependencyParser=JClass('com.hankcs.hanlp.dependency.perceptron.parser.KBeamArcEagerDependencyParser') parser=KBeamArcEagerDependencyParser() tree=parser.parse("電池非常棒,機身不長,長的是待機,但是螢幕解析度不高。

") print(tree) 執行結果如下: 1電池電池NNN_3nsubj__ 2非常非常AAD_3advmod__ 3棒棒VVA_0ROOT__ 4,,PPU_3punct__ 5機身機身NNN_7nsubj__ 6不不AAD_7neg__ 7長長VVA_3conj__ 8,,PPU_7punct__ 9長長VVA_11top__ 10的的DDEC_9cpm__ 11是是VVC_7conj__ 12待機待機NNN_11attr__ 13,,PPU_3punct__ 14但是但是AAD_18advmod__ 15螢幕螢幕NNN_16nn__ 16解析度解析度NNN_18nsubj__ 17不不AAD_18neg__ 18高高VVA_3conj__ 19。



PPU_3punct__ 進行視覺化後: 仔細觀察,不難發現“電池”與“棒”、“機身”與“長”、“解析度”與“高”之間的依存關係都是nsubj(名詞性主語)。

利用這一規律,不難寫出第一版遍歷演算法,也就是用個for迴圈去遍歷樹中的每個節點。

對於演算法遍歷樹中的每一個詞語,如果其詞性為名詞且作為某個形容詞的名詞性主語,則認為該名詞是屬性,而形容詞是意見。

執行程式碼如下: defextactOpinion1(tree): forwordintree.iterator(): ifword.POSTAG=="NN"andword.DEPREL=="nsubj": print("%s=%s"%(word.LEMMA,word.HEAD.LEMMA)) print("第一版") extactOpinion1(tree) 結果如下: 第一版 電池=棒 機身=長 解析度=高 雖然的確提取出了一些意見,然而後兩個都是錯誤的。

這一版演算法存在的問題之一是沒有考慮到“機身不長””“解析度不高"等否定修飾關係。

否定修飾關係在依存句法中的標記為neg,於是我們只需檢查形容詞是否存在否定修飾的支配詞即可。

於是得出第二版演算法: defextactOpinion2(tree): forwordintree.iterator(): ifword.POSTAG=="NN"andword.DEPREL=="nsubj": iftree.findChildren(word.HEAD,"neg").isEmpty(): print("%s=%s"%(word.LEMMA,word.HEAD.LEMMA)) else: print("%s=不%s"%(word.LEMMA,word.HEAD.LEMMA)) print("第二版") extactOpinion2(tree) 結果如下: 第二版 電池=棒 機身=不長 解析度=不高 接下來思考如何提取“待機”的意見,“待機”與“長”之間的公共父節點為“是”,於是我們得到第三版演算法如下: defextactOpinion3(tree): forwordintree.iterator(): ifword.POSTAG=="NN": #檢測名詞詞語的依存弧是否是“屬性關係”, #如果是,則尋找支配詞的子節點中的主題詞 #以該主題詞作為名詞的意見。

ifword.DEPREL=="nsubj":#①屬性 iftree.findChildren(word.HEAD,"neg").isEmpty(): print("%s=%s"%(word.LEMMA,word.HEAD.LEMMA)) else: print("%s=不%s"%(word.LEMMA,word.HEAD.LEMMA)) elifword.DEPREL=="attr": top=tree.findChildren(word.HEAD,"top")#②主題 ifnottop.isEmpty(): print("%s=%s"%(word.LEMMA,top.get(0).LEMMA)) print("第三版") extactOpinion3(tree) 結果如下: 第三版 電池=棒 機身=不長 待機=長 解析度=不高 至此,4個屬性被完整正確地提取出來了,讀者可以嘗試蒐集更多的句子,通過分析句法結構總結更多的提取規則。

12.7GitHub HanLP何晗--《自然語言處理入門》筆記: https://github.com/NLP-LOVE/Introduction-NLP 專案持續更新中...... 目錄 第1章:新手上路 第2章:詞典分詞 第3章:二元語法與中文分詞 第4章:隱馬爾可夫模型與序列標註 第5章:感知機分類與序列標註 第6章:條件隨機場與序列標註 第7章:詞性標註 第8章:命名實體識別 第9章:資訊抽取 第10章:文字聚類 第11章:文字分類 第12章:依存句法分析 第13章:深度學習與自然語言處理 < 全網最詳細的Linux命令系列-Screen遠端會話命令 «上一篇 Linux系統監控工具atop下一篇» 相關推薦 《自然語言處理入門》12.依存句法分析--提取使用者評論 筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP 12.依存句法分析 語法分析(synta... 斯坦福大學-自然語言處理入門筆記第十課關係抽取(relationextraction) 一、簡介 關係抽取就是從文件中抽取關係,例子如下: 為什麼進行關係抽取 建立新的關係型知識庫(know... 斯坦福大學-自然語言處理入門筆記第九課資訊抽取(informationextraction) 一、介紹 1、資訊抽取(informationextraction) 資訊抽取(IE)系統 找到並理解文... HanLP《自然語言處理入門》筆記--2.詞典分詞 筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP 2.詞典分詞 中文分詞:指的是將一段文... Hanlp中文自然語言處理入門基礎知識 watermarkholobottomava領域elastic最短oid變化自然語言處理定義:自然語言處理... 斯坦福大學-自然語言處理入門筆記第二十一課問答系統(2) 一、問答系統中的總結(summarization) 目標:產生一個摘要文字包含那些對使用者重要和相關的資訊 總結的應用領域:... 斯坦福大學-自然語言處理入門筆記第二十課問答系統(questionanswering) 1、什麼是問答系統 問答系統是最早的NLP任務,根據問題的依存關係,找到適合的依存關係的回答。

在現代系統中問題被分... 斯坦福大學-自然語言處理入門筆記第十九課單詞含義與相似性 一、單詞含義與單詞關係 回顧:詞目(lemma)與單詞形式(wordform) 詞目:表示相同的詞根、詞性以及... 斯坦福大學-自然語言處理入門筆記第十八課排序檢索介紹(rankedretrieval) 一、介紹 之前我們的請求都是布林型別。

對於那些明確知道自己的需求並且瞭解集合體情況的使用者而言,布林型別的請求是很有效的。

但是對於... 斯坦福大學-自然語言處理入門筆記第十七課資訊檢索(informationretrieval) 一、介紹 資訊檢索(informationretrieval)是從海量集合體(一般是儲存在計算機中的文字)中找到滿足資訊需求(i... 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 最近訪問 《自然語言處理入門》12.依存句法分析--提取使用者評論 oracle++判斷今天是星期幾 溝通技巧系列+-+給予和接受反饋的正確姿勢 整數逆序輸出 使用Azure+Function玩轉Serverless thinkPHP5+資料庫+新增資料 機器學習中的kNN演算法及Matlab例項 python中return和print的區別(詳細) RabbitMQ+3.8.7+在+centos7+上安裝 希爾伯特變換(Hilbert+Transform)簡介及其物理意義



請為這篇文章評分?