筆記轉載于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 章:深度學習與自然語言處理 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/49859.html
標籤:其他
下一篇:Django資料庫的安全配置問題
