隱馬爾可夫(HMM)/感知機/條件隨機場(CRF)----詞性標註
筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP
7. 詞性標註
7.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 形容詞 詞性的用處
詞性的作用是提供詞語的抽象表示,詞的數量是無窮的,但詞性的數量是有限的。詞性支撐著許多高階應用,當下遊應用遇到 OOV 時,可以通過 OOV 的詞性猜測用法,比如上面的句子“林晚霞”就識別為人名進行處理,而不會拆開。
詞性也可以直接用於抽取一些資訊,比如抽取所有描述特定商品的形容詞等。
詞性標註
詞性標註指的是為句子中每個單詞預測一個詞性標籤的任務。它有以下兩個難點:
漢語中一個單詞多個詞性的現象很常見,但在具體語境下一定是唯一詞性。
OOV 是任何自然語言處理任務的難題。
詞性標註模型
統計方法為這兩個難點提供瞭解決方案,那就是我們熟悉的序列標註模型。只需將中文分詞中的漢字替換為詞語,{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 提供了自定義詞性功能。具體有兩種實現。
樸素實現
可以使用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
從結果來看,詞典只是機械的匹配,將“吃蘋果”也當成了手機品牌,犯了所有規則系統的通病,看來詞典同樣解決不了詞性標註,詞性標註還是應當交給統計方法。
標註語料
詞性的確定需要根據上下文語境,這恰好是統計模型所擅長的。為了實現自定義詞性,最佳實踐是標註一份語料庫,然後訓練一個統計模型。
至於語料庫規模,與所有機器學習問題一樣,資料越多,模型越準。
7.8 GitHub
HanLP何晗--《自然語言處理入門》筆記:
https://github.com/NLP-LOVE/Introduction-NLP
專案持續更新中......
目錄
章節 |
---|
第 1 章:新手上路 |
第 2 章:詞典分詞 |
第 3 章:二元語法與中文分詞 |
第 4 章:隱馬爾可夫模型與序列標註 |
第 5 章:感知機分類與序列標註 |
第 6 章:條件隨機場與序列標註 |
第 7 章:詞性標註 |
第 8 章:命名實體識別 |
第 9 章:資訊抽取 |
第 10 章:文字聚類 |
第 11 章:文字分類 |
第 12 章:依存句法分析 |
第 13 章:深度學習與自然語言處理 |