日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.依存句法分析--提取用户评论

發(fā)布時間:2024/7/5 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .依存句法分析--提取用户评论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接:https://cloud.tencent.com/developer/article/1590322

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

0

筆記轉(zhuǎn)載于GitHub項目:https://github.com/NLP-LOVE/Introduction-NLP

12. 依存句法分析

語法分析(syntactic parsing )是自然語言處理中一個重要的任務(wù),其目標(biāo)是分析句子的語法結(jié)構(gòu)并將其表示為容易理解的結(jié)構(gòu)(通常是樹形結(jié)構(gòu))。同時,語法分析也是所有工具性NLP任務(wù)中較為高級、較為復(fù)雜的一種任務(wù)。 通過掌握語法分析的原理、實現(xiàn)和應(yīng)用,我們將在NLP工程師之路上跨越一道分水嶺。 本章將會介紹短語結(jié)構(gòu)樹依存句法樹兩種語法形式,并且著重介紹依存句法分析的原理和實現(xiàn)。

12.1 短語結(jié)構(gòu)樹

語言其實具備自頂而下的層級關(guān)系,固定數(shù)量的語法結(jié)構(gòu)能夠生成無數(shù)句子。比如,僅僅利用下列兩個語法規(guī)律,我們就能夠生成所有名詞短語。

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

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

在語言學(xué)中,這樣的語法被稱為上下文無關(guān)文法,它由如下組件構(gòu)成:

  • 終結(jié)符結(jié)合 Σ,比如漢語的一個詞表。
  • 非終結(jié)符集合 V,比如“名詞短語”“動詞短語”等短語結(jié)構(gòu)組成的集合。V 中至少包含一個特殊的非終結(jié)符,即句子符或初始符,計作 S。
  • 推到規(guī)則 R,即推到非終結(jié)符的一系列規(guī)則: V -> V U Σ。

基于上下文無關(guān)文法理論,我們可以從 S 出發(fā),逐步推導(dǎo)非終結(jié)符。一個非終結(jié)符至少產(chǎn)生一個下級符號,如此一層一層地遞推下去,我們就得到了一棵語法樹。但在NLP中,我們稱其為短語結(jié)構(gòu)樹。也就是說,計算機科學(xué)中的術(shù)語“上下文無關(guān)文法”在語言學(xué)中被稱作“短語結(jié)構(gòu)語法”。

  • 短語結(jié)構(gòu)樹 短語結(jié)構(gòu)語法描述了如何自頂而下的生成一個句子,反過來,句子也可以用短語結(jié)構(gòu)語法來遞歸的分解。層級結(jié)構(gòu)其實是一種樹形結(jié)構(gòu),例如這句話“上海 浦東 開發(fā) 與 法制 建設(shè) 同步”,分解成如下圖的短語結(jié)構(gòu)樹:
  • 這樣的樹形結(jié)構(gòu)稱為短語結(jié)構(gòu)樹,相應(yīng)的語法稱為*短語結(jié)構(gòu)語法**或上下文無關(guān)文法。至于樹中的字母下面開始介紹。

  • 賓州樹庫和中文樹庫 語言學(xué)家制定短語結(jié)構(gòu)語法規(guī)范,將大量句子人工分解為樹形結(jié)構(gòu),形成了一種語料庫,稱為樹庫( treebank )。常見的英文樹庫有賓州樹庫,相應(yīng)地,中文領(lǐng)域有CTB。上圖中葉子節(jié)點(詞語)的上級節(jié)點為詞性,詞性是非終結(jié)符的一種,滿足“詞性生成詞語”的推導(dǎo)規(guī)則。 常見的標(biāo)記如下: 標(biāo)記 釋義 IP-HLN 單句-標(biāo)題 NP-SBJ 名詞短語-主語 NP-PN 名詞短語-代詞 NP 名詞短語 VP 動詞短語 但是由于短語結(jié)構(gòu)語法比較復(fù)雜,相應(yīng)句法分析器的準(zhǔn)確率并不高,現(xiàn)在研究者絕大部分轉(zhuǎn)向了另一種語法形式。
  • 12.2 依存句法樹

    不同于短語結(jié)構(gòu)樹,依存句法樹并不關(guān)注如何生成句子這種宏大的命題。依存句法樹關(guān)注的是句子中詞語之間的語法聯(lián)系,并且將其約束為樹形結(jié)構(gòu)。

  • 依存句法理論 依存語法理論認(rèn)為詞與詞之間存在主從關(guān)系,這是一種二元不等價的關(guān)系。在句子中,如果一個詞修飾另一個詞,則稱修飾詞為從屬詞( dependent ),被修飾的詞語稱為支配詞(head),兩者之間的語法關(guān)系稱為依存關(guān)系( dependency relation)。比如句子“大夢想”中形容詞“大”與名詞“夢想"之間的依存關(guān)系如圖所示:
  • 圖中的箭頭方向由支配詞指向從屬詞,這是可視化時的習(xí)慣。將一個句子中所有詞語的依存關(guān)系以有向邊的形式表示出來,就會得到一棵樹,稱為依存句法樹( dependency parse tree)。比如句子“弱小的我也有大夢想”的依存句法樹如圖所示。

    現(xiàn)代依存語法中,語言學(xué)家 Robinson 對依存句法樹提了 4 個約束性的公理。

    • 有且只有一個詞語(ROOT,虛擬根節(jié)點,簡稱虛根)不依存于其他詞語。
    • 除此之外所有單詞必須依存于其他單詞。
    • 每個單詞不能依存于多個單詞。
    • 如果單詞 A 依存于 B,那么位置處于 A 和 B 之間的單詞 C 只能依存于 A、B 或 AB 之間的單詞。

    這 4 條公理分別約束了依存句法樹(圖的特例)的根節(jié)點唯一性、 連通、無環(huán)和投射性( projective )。這些約束對語料庫的標(biāo)注以及依存句法分析器的設(shè)計奠定了基礎(chǔ)。

  • 中文依存句法樹庫 目前最有名的開源自由的依存樹庫當(dāng)屬UD ( Universal Dependencies),它以“署名-非商業(yè)性使用-相同方式共享4.0”等類似協(xié)議免費向公眾授權(quán)。UD是個跨語種的語法標(biāo)注項目,一共有 200 多名貢獻(xiàn)者為 70 多種語言標(biāo)注了 100 多個樹庫。具體到中文,存在4個不同領(lǐng)域的樹庫。本章選取其中規(guī)模最大的 UD_ Chinese GSD 作為示例。該樹庫的語種為繁體中文,將其轉(zhuǎn)換為簡體中文后,供大家下載使用。 http://file.hankcs.com/corpus/chs-gsd-ud.zip 該樹庫的格式為 CoNLL-U,這是一種以制表符分隔的表格格式。CoNLL-U 文件有10列,每行都是一個單詞, 空白行表示句子結(jié)束。單元中的下劃線 _ 表示空白, 結(jié)合其中一句樣例,解釋如表所示。
  • 詞性標(biāo)注集合依存關(guān)系標(biāo)注集請參考 UD 的官方網(wǎng)站: http://niversaldependencies.org/guidelines.html 另一份著名的語料庫依然是 CTB,只不過需要額外利用一些工具將短語結(jié)構(gòu)樹轉(zhuǎn)換為依存句法樹。讀者可以直接下載轉(zhuǎn)換后的 CTB 依存句法樹庫,其格式是類似于 CoNLl-U 的 CoNLL。

  • 依存句法樹的可視化 工具如下:
    • 南京大學(xué)湯光超開發(fā)的 Dependency Viewer。導(dǎo)入 .conll 擴展名的樹庫文件即可。
    • brat 標(biāo)注工具。

    可視化工具可以幫助我們理解句法樹的結(jié)構(gòu),比較句子之間的不同。

  • 12.3 依存句法分析

    依存句法分析( dependency parsing )指的是分析句子的依存語法的一種中高級 NLP任務(wù),其輸人通常是詞語和詞性,輸出則是一棵依存句法樹。 本節(jié)介紹實現(xiàn)依存句法分析的兩種宏觀方法,以及依存句法分析的評價指標(biāo)。

  • 基于圖的依存句法分析 正如樹是圖的特例一樣,依存句法樹其實是完全圖的一個子圖。如果為完全圖中的每條邊是否屬于句法樹的可能性打分,然后就可以利用 Prim 之類的算法找出最大生成樹( MST )作為依存句法樹了。這樣將整棵樹的分?jǐn)?shù)分解( factorize )為每條邊上的分?jǐn)?shù)之和,然后在圖上搜索最優(yōu)解的方法統(tǒng)稱為基于圖的算法。 在傳統(tǒng)機器學(xué)習(xí)時代,基于圖的依存句法分析器往往面臨運行開銷大的問題。這是由于傳統(tǒng)機器學(xué)習(xí)所依賴的特征過于稀疏,訓(xùn)練算法需要在整個圖上進(jìn)行全局的結(jié)構(gòu)化預(yù)測等。考慮到這些問題,另一種基于轉(zhuǎn)移的路線在傳統(tǒng)機器學(xué)習(xí)框架下顯得更加實用。
  • 基于轉(zhuǎn)移的依存句法分析 我們以“人 吃 魚”這個句子為例子,手動構(gòu)建依存句法樹。
    • 從“吃”連線到“人”建立依存關(guān)系,主謂關(guān)系。
    • 從“吃”連線到“魚”建立依存關(guān)系,動賓關(guān)系。

    如此,我們將一棵依存句法樹的構(gòu)建過程表示為兩個動作。如果機器學(xué)習(xí)模型能夠根據(jù)句子的某些特征準(zhǔn)確地預(yù)測這些動作,那么計算機就能夠根據(jù)這些動作拼裝出正確的依存句法樹了。這種拼裝動作稱為轉(zhuǎn)移( transition),而這類算法統(tǒng)稱為基于轉(zhuǎn)移的依存句法分析

  • 12.4 基于轉(zhuǎn)移的依存句法分析

  • Arc-Eager 轉(zhuǎn)移系統(tǒng) 一個轉(zhuǎn)移系統(tǒng) S 由 4 個部件構(gòu)成: S = (C,T,Cs,Ct),其中:
    • C 是系統(tǒng)狀態(tài)的集合
    • T 是所有可執(zhí)行的轉(zhuǎn)移動作的集合。
    • Cs 是一個初始化函數(shù)
    • Ct 為一系列終止?fàn)顟B(tài),系統(tǒng)進(jìn)入該狀態(tài)后即可停機輸出最終的動作序列。

    而系統(tǒng)狀態(tài)又由 3 元祖構(gòu)成: C = (σ,β,A) 其中:

    • σ 為一個存儲單詞的棧。
    • β 為存儲單詞的隊列
    • A 為已確定的依存弧的集合。

    Arc-Eager 轉(zhuǎn)移系統(tǒng)的轉(zhuǎn)移動作集合詳見下表: 動作名稱 條件 解釋 Shift 隊列 β 非空 將隊首單詞 i 壓棧 LeftArc 棧頂單詞 i 沒有支配詞 將棧頂單詞 i 的支配詞設(shè)為隊首單詞 j,即 i 作為 j 的子節(jié)點 RightArc 隊首單詞 j 沒有支配詞 將隊首單詞 j 的支配詞設(shè)為棧頂單詞 i,即 j 作為 i 的子節(jié)點 Reduce 棧頂單詞 i 已有支配詞 將棧頂單詞 i 出棧 對于上面的“人 吃 魚”案例,Arc-Eager 的執(zhí)行步驟如下: 裝填編號 σ 轉(zhuǎn)移動作 β A 0 [] 初始化 [人,吃,魚,虛根] {} 1 [人] Shift [吃,魚,虛根] {} 2 [] LeftArc(主謂) [吃,魚,虛根] {人←主謂吃}\{人\xleftarrow{主謂}吃\}{人主謂?吃} 3 [吃] Shift [魚,虛根] {人←主謂吃}\{人\xleftarrow{主謂}吃\}{人主謂?吃} 4 [吃,魚] RightArc(動賓) [虛根] {人←主謂吃,吃→動賓魚}\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚\}{人主謂?吃,吃動賓?魚} 5 [吃] Reduce [虛根] {人←主謂吃,吃→動賓魚}\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚\}{人主謂?吃,吃動賓?魚} 6 [] LeftArc(核心) [虛根] {人←主謂吃,吃→動賓魚,吃←核心虛根}\{人\xleftarrow{主謂}吃,吃\xrightarrow{動賓}魚,吃\xleftarrow{核心}虛根\}{人主謂?吃,吃動賓?魚,吃核心?虛根} 此時集合 A 中的依存弧為一顆依存句法樹。

  • 訓(xùn)練原理 對基于轉(zhuǎn)移的依存句法分析器而言,它學(xué)習(xí)和預(yù)測的對象是一系列轉(zhuǎn)移動作。然而依存句法樹庫是一棵樹,并不是現(xiàn)成的轉(zhuǎn)移動作序列。這時候就需要一個算法將語料庫中的依存句法樹轉(zhuǎn)移為正確地轉(zhuǎn)移動作序列。 這里可以使用感知機進(jìn)行訓(xùn)練得到轉(zhuǎn)移動作序列,原理詳見: 5. 感知機分類與序列標(biāo)注 訓(xùn)練句法分析器時,結(jié)構(gòu)化感知機算法迭代式的優(yōu)化線性模型,目標(biāo)是使其將最高的分值賦予可抵達(dá)正確句法樹的轉(zhuǎn)移序列。 訓(xùn)練分為以下幾個步驟:
    • 讀入一個訓(xùn)練樣本,提取特征,創(chuàng)建 ArcEager 的初始狀態(tài) c。
    • 若 c 不是終止?fàn)顟B(tài),反復(fù)進(jìn)行轉(zhuǎn)移序列,修正參數(shù)。
    • 算法終止,返回返回模型參數(shù) w。
  • 12.5 依存句法分析 API

  • 訓(xùn)練模型 本節(jié)使用的語料庫是 CTB8.0,運行代碼的時候會自動下載語料庫: train_parser.py https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch12/train_parser.py 訓(xùn)練時間比較長,結(jié)果如下: 1 人 人 N NN _ 2 nsubj _ _ 2 吃 吃 V VV _ 0 ROOT _ _ 3 魚 魚 N NN _ 2 dobj _ _ UAS=83.3% LAS=81.0%
  • 標(biāo)準(zhǔn)化評測 給定兩棵樹,一棵樹為標(biāo)準(zhǔn)答案(來自測試集),一棵樹為預(yù)測結(jié)果,評測的目標(biāo)是衡量這兩棵樹的差異。如果將樹的節(jié)點編號,拆解為依存弧并分別存入兩個集合 A ( 標(biāo)準(zhǔn)答案)和 B (預(yù)測結(jié)果),則可以利用分類任務(wù)的 F1 評價指標(biāo)。 依存句法分析任務(wù)采用的評測指標(biāo)為 UAS (unlabeled atachment score) 和 LAS (labeled attachment score ),分別對應(yīng)忽略標(biāo)簽和包括標(biāo)簽的 F1 值。以 LAS 為例,具體計算方式如下: P=∣A∩B∣∣B∣R=∣A∩B∣∣A∣LAS=2?P?RP+R P=\frac{|A\cap B|}{|B|}\\ R=\frac{|A\cap B|}{|A|}\\ LAS=\frac{2*P*R}{P+R} P=∣B∣∣A∩B∣?R=∣A∣∣A∩B∣?LAS=P+R2?P?R? UAS 的計算也是同理,只不過將每條依存弧上的標(biāo)簽去掉后放人集合參與運算即可。相較于 LAS, UAS 僅僅衡量支配詞的預(yù)測準(zhǔn)確率,不衡量依存關(guān)系的準(zhǔn)確率,一般分?jǐn)?shù)更高。 在上面的訓(xùn)練模型中已經(jīng)做了評測 UAS=83.3% LAS=81.0% 這個分?jǐn)?shù)說明,在測試集上有 83% 的支配詞被準(zhǔn)確預(yù)測,有 81% 的依存弧被準(zhǔn)確預(yù)測。
  • 12.6 案例: 基于依存句法分析的意見抽取

    其實許多人都有一個疑問,依存句法分析究竟可以用來干什么。本節(jié)就來利用依存句法分析實現(xiàn)一個意見抽取的例子,提取下列商品評論中的屬性和買家評價。

    電池非常棒,機身不長,長的是待機,但是屏幕分辨率不高。

    為了提取“電池”“機身”“待機”和“分辨率”所對應(yīng)的意見,樸素的處理方式是在分司和詞性標(biāo)注之后編寫正則表達(dá)式,提取名詞后面的形容詞。然而正則表達(dá)式無法處理“長的是待機”這樣句式靈活的例子。

    這時就可以對這句話進(jìn)行依存句法分析,分析代碼如下:

    from pyhanlp import *

    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)

    運行結(jié)果如下:

    1 電池 電池 N NN _ 3 nsubj _ _
    2 非常 非常 A AD _ 3 advmod _ _
    3 棒 棒 V VA _ 0 ROOT _ _
    4 , , P PU _ 3 punct _ _
    5 機身 機身 N NN _ 7 nsubj _ _
    6 不 不 A AD _ 7 neg _ _
    7 長 長 V VA _ 3 conj _ _
    8 , , P PU _ 7 punct _ _
    9 長 長 V VA _ 11 top _ _
    10 的 的 D DEC _ 9 cpm _ _
    11 是 是 V VC _ 7 conj _ _
    12 待機 待機 N NN _ 11 attr _ _
    13 , , P PU _ 3 punct _ _
    14 但是 但是 A AD _ 18 advmod _ _
    15 屏幕 屏幕 N NN _ 16 nn _ _
    16 分辨率 分辨率 N NN _ 18 nsubj _ _
    17 不 不 A AD _ 18 neg _ _
    18 高 高 V VA _ 3 conj _ _
    19 。 。 P PU _ 3 punct _ _

    進(jìn)行可視化后:

    仔細(xì)觀察,不難發(fā)現(xiàn)“電池”與“棒”、“機身”與“長”、“分辨率”與“高”之間的依存關(guān)系都是 nsubj (名詞性主語)。

  • 利用這一規(guī)律, 不難寫出第一版遍歷算法, 也就是用個for 循環(huán)去遍歷樹中的每個節(jié)點。對于算法遍歷樹中的每一個詞語, 如果其詞性為名詞且作為某個形容詞的名詞性主語,則認(rèn)為該名詞是屬性,而形容詞是意見。運行代碼如下:
  • #2020年09月08日。比如電池非常棒,機身不長,長的是待機,但是屏幕分辨率不高。 # 仔細(xì)觀察,不難發(fā)現(xiàn)“電池”與“棒”、“機身”與“長”、“分辨率”與“高”之間的依存關(guān)系都是 nsubj (名詞性主語) #2020年09月08日。比如電池非常棒,機身不長,長的是待機,但是屏幕分辨率不高。 # 仔細(xì)觀察,不難發(fā)現(xiàn)“電池”與“棒”、“機身”與“長”、“分辨率”與“高”之間的依存關(guān)系都是 nsubj (名詞性主語) def extactOpinion1(tree):for word in tree.iterator():if word.POSTAG == "NN" and word.DEPREL == "nsubj":print("%s = %s" % (word.LEMMA, word.HEAD.LEMMA))print("第一版")extactOpinion1(tree)

    結(jié)果如下:
    第一版 電池 = 棒 機身 = 長 分辨率 = 高

    • 雖然的確提取出了一些意見,然而后兩個都是錯誤的。這一版算法存在的問題之一是沒有考慮到“機身不長””“分辨率不高"等否定修飾關(guān)系。否定修飾關(guān)系在依存句法中的標(biāo)記為 neg,于是我們只需檢查形容詞是否存在否定修飾的支配詞即可。于是得出第二版算法:
    • def extactOpinion2(tree):for word in tree.iterator():if word.POSTAG == "NN" and word.DEPREL == "nsubj":if tree.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)

      結(jié)果如下:
      第二版 電池 = 棒 機身 = 不長 分辨率 = 不高

    • 接下來思考如何提取“待機”的意見,“待機”與“長”之間的公共父節(jié)點為“是”,于是我們得到第三版算法如下:
    • def extactOpinion3(tree):for word in tree.iterator():if word.POSTAG == "NN":# 檢測名詞詞語的依存弧是否是“屬性關(guān)系”,# 如果是,則尋找支配詞的子節(jié)點中的主題詞# 以該主題詞作為名詞的意見。if word.DEPREL == "nsubj": # ①屬性if tree.findChildren(word.HEAD, "neg").isEmpty():print("%s = %s" % (word.LEMMA, word.HEAD.LEMMA))else:print("%s = 不%s" % (word.LEMMA, word.HEAD.LEMMA))elif word.DEPREL == "attr": \top = tree.findChildren(word.HEAD, "top") # ②主題if not top.isEmpty():print("%s = %s" % (word.LEMMA, top.get(0).LEMMA))print("第三版")extactOpinion3(tree)

      結(jié)果如下:
      第三版 電池 = 棒 機身 = 不長 待機 = 長 分辨率 = 不高

      至此,4 個屬性被完整正確地提取出來了,讀者可以嘗試搜集更多的句子,通過分析句法結(jié)構(gòu)總結(jié)更多的提取規(guī)則。

      12.7 GitHub

      HanLP何晗–《自然語言處理入門》筆記:

      https://github.com/NLP-LOVE/Introduction-NLP

      項目持續(xù)更新中…

      目錄


      章節(jié)

      第 1 章:新手上路

      第 2 章:詞典分詞

      第 3 章:二元語法與中文分詞

      第 4 章:隱馬爾可夫模型與序列標(biāo)注

      第 5 章:感知機分類與序列標(biāo)注

      第 6 章:條件隨機場與序列標(biāo)注

      第 7 章:詞性標(biāo)注

      第 8 章:命名實體識別

      第 9 章:信息抽取

      第 10 章:文本聚類

      第 11 章:文本分類

      第 12 章:依存句法分析

      第 13 章:深度學(xué)習(xí)與自然語言處理

    總結(jié)

    以上是生活随笔為你收集整理的.依存句法分析--提取用户评论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。