1. 程式人生 > >隱馬爾可夫(HMM)/感知機/條件隨機場(CRF)----詞性標註

隱馬爾可夫(HMM)/感知機/條件隨機場(CRF)----詞性標註

筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP

7. 詞性標註

7.1 詞性標註概述

  1. 什麼是詞性

    在語言學上,詞性(Par-Of-Speech, Pos )指的是單詞的語法分類,也稱為詞類。同一個類別的詞語具有相似的語法性質,所有詞性的集合稱為詞性標註集。不同的語料庫採用了不同的詞性標註集,一般都含有形容詞、動詞、名詞等常見詞性。下圖就是HanLP輸出的一個含有詞性的結構化句子。

    我/r 的/u 希望/n 是/v 希望/v 張晚霞/nr 的/u 背影/n 被/p 晚霞/n 映/v 紅/a

    每個單詞的後邊跟的就是詞性標籤:

    詞性標籤 詞性
    r 代詞
    u 動詞
    n 名詞
    v 動詞
    nr 人名
    p 介詞
    a 形容詞
  2. 詞性的用處

    詞性的作用是提供詞語的抽象表示,詞的數量是無窮的,但詞性的數量是有限的。詞性支撐著許多高階應用,當下遊應用遇到 OOV 時,可以通過 OOV 的詞性猜測用法,比如上面的句子“林晚霞”就識別為人名進行處理,而不會拆開。

    詞性也可以直接用於抽取一些資訊,比如抽取所有描述特定商品的形容詞等。

  3. 詞性標註

    詞性標註指的是為句子中每個單詞預測一個詞性標籤的任務。它有以下兩個難點:

    • 漢語中一個單詞多個詞性的現象很常見,但在具體語境下一定是唯一詞性。

    • OOV 是任何自然語言處理任務的難題。

  4. 詞性標註模型

    統計方法為這兩個難點提供瞭解決方案,那就是我們熟悉的序列標註模型。只需將中文分詞中的漢字替換為詞語,{B,M,E,S} 替換為“名詞、動詞、形容詞等”,序列標註模型馬上就可以用來做詞性標註。

    詞性標註既可以看作中文分詞的後續任務,也可以與中文分詞整合為同一個任務。其中就可以把分詞語料庫加上詞性標籤就可以了,這樣同時進行多個任務的模型稱為聯合模型。由於綜合考慮了多種監督訊號,聯合模型在幾乎所有問題上都要優於獨立模型。

    然而工業界就沒有那麼理想,同時具有分詞和詞性標註的語料庫非常少,需要大量的人力進行標註。

7.2 詞性標註語料庫與標註集

同中文分詞一樣,語言學界在標註規範上存在分歧,導致目前還沒有一個被廣泛接受的漢語詞性劃分標準。無論是詞性劃分的顆粒度,還是詞性標籤都不統一。一方面,各研究機構各持己見、派系林立,標註了大量互不相容的語料庫。另一方面,部分語料庫受到嚴格版權控制,成為內部材料,得不到充分共享利用。

本節選取其中一些授權寬鬆, 容易獲得的語料庫作為案例。

以下示例我們選取 PKU 標註的《人民日報》語料庫的標註集。

7.3 基於隱馬爾可夫模型的詞性標註

之前我們就介紹過隱馬爾可夫模型,詳細見: 4.隱馬爾可夫模型與序列標註

隱馬爾可夫模型詞性標註程式碼見(程式會自動下載 PKU 語料庫): hmm_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/hmm_pos.py

執行程式碼後結果如下:

一階隱馬爾可夫模型:
r, u, n, v, v, v
他/r 的/u 希望/n 是/v 希望/v 上學/v
他/代詞 的/助詞 希望/名詞 是/動詞 希望/動詞 上學/動詞
李狗蛋/動詞 的/動詞 希望/動詞 是/動詞 希望/動詞 上學/動詞

二階隱馬爾可夫模型:
r, u, n, v, v, v
他/r 的/u 希望/n 是/v 希望/v 上學/v
他/代詞 的/助詞 希望/名詞 是/動詞 希望/動詞 上學/動詞
李狗蛋/動詞 的/動詞 希望/動詞 是/動詞 希望/動詞 上學/動詞

可見隱馬爾可夫模型成功的辨別出“希望”的兩種詞性 n 和 v。但 OOV問題就出現了,無法把“李狗蛋”識別成人名,隱馬爾可夫模型一步走錯滿盤皆輸,其根本原因在於隱馬爾可夫模型只能利用單詞這一個狀態特徵,無法通過姓氏“李”來推測“李狗蛋”是人名。

7.4 基於感知機的詞性標註

之前我們就介紹過感知機模型,詳細見: 5.感知機分類與序列標註

按照中文分詞時的經驗,感知機能夠利用豐富的上下文特徵,是優於隱馬爾可夫模型的選擇,對於詞性標註也是如此。

感知機模型詞性標註程式碼見(程式會自動下載 PKU 語料庫): perceptron_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/perceptron_pos.py

執行會有些慢,結果如下:

李狗蛋/nr 的/u 希望/n 是/v 希望/v 上學/v
李狗蛋/人名 的/助詞 希望/名詞 是/動詞 希望/動詞 上學/動詞

這次的執行結果完全正確,感知機成功的識別出 OOV “李狗蛋”的詞性。

7.5 基於條件隨機場的詞性標註

之前我們就介紹過條件隨機場模型,詳細見: 6.條件隨機場與序列標註

條件隨機場模型詞性標註程式碼見(程式會自動下載 PKU 語料庫): crf_pos.py

https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch07/crf_pos.py

執行時間會比較長,結果如下:

李狗蛋/nr 的/u 希望/n 是/v 希望/v 上學/v
李狗蛋/人名 的/助詞 希望/名詞 是/動詞 希望/動詞 上學/動詞

依然可以成功識別 OOV “李狗蛋”的詞性。

7.6 詞性標註評測

將 PKU 語料庫按 9:1 分隔為訓練集和測試集,分別用以上三種模型來訓練,準確率如下:

演算法 準確率
一階隱馬爾可夫模型 44.99%
二階隱馬爾可夫模型 40.53%
結構化感知機 83.07%
條件隨機場 82.12%

從上圖可知,結構化感知機和條件隨機場都要優於隱馬爾可夫模型,判別式模型能夠利用更多的特徵來進行訓練,從而提高更多的精度。

7.7 自定義詞性

在工程上,許多使用者希望將特定的一些詞語打上自定義的標籤,稱為自定義詞性。比如,電商領域的使用者希望將一些手機品牌打上相應標籤,以便後續分析。HanLP 提供了自定義詞性功能。具體有兩種實現。

  1. 樸素實現

    可以使用HanLP掛載的方式實現:

    from pyhanlp import *
    
    CustomDictionary.insert("蘋果", "手機品牌 1")
    CustomDictionary.insert("iPhone X", "手機型號 1")
    analyzer = PerceptronLexicalAnalyzer()
    analyzer.enableCustomDictionaryForcing(True)
    print(analyzer.analyze("你們蘋果iPhone X保修嗎?"))
    print(analyzer.analyze("多吃蘋果有益健康"))

    當然,此處以程式碼的方式插入自定義詞語,在實際專案中也可以用詞典檔案的方式,執行效果如下:

    你們/r 蘋果/手機品牌 iPhone X/手機型號 保修/v 嗎/y ?/w
    多/ad 吃/v 蘋果/手機品牌 有益健康/i

    從結果來看,詞典只是機械的匹配,將“吃蘋果”也當成了手機品牌,犯了所有規則系統的通病,看來詞典同樣解決不了詞性標註,詞性標註還是應當交給統計方法。

  2. 標註語料

    詞性的確定需要根據上下文語境,這恰好是統計模型所擅長的。為了實現自定義詞性,最佳實踐是標註一份語料庫,然後訓練一個統計模型。

    至於語料庫規模,與所有機器學習問題一樣,資料越多,模型越準。

7.8 GitHub

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

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

專案持續更新中......

目錄


<
章節
第 1 章:新手上路
第 2 章:詞典分詞
第 3 章:二元語法與中文分詞
第 4 章:隱馬爾可夫模型與序列標註
第 5 章:感知機分類與序列標註
第 6 章:條件隨機場與序列標註
第 7 章:詞性標註
第 8 章:命名實體識別
第 9 章:資訊抽取
第 10 章:文字聚類
第 11 章:文字分類
第 12 章:依存句法分析
第 13 章:深度學習與自然語言處理