LAC中文詞法分析解決方案
中文詞法分析(LAC)
中文分詞(Word Segmentation)是將連續(xù)的自然語言文本,切分出具有語義合理性和完整性的詞匯序列的過程。因為在漢語中,詞是承擔語義的最基本單位,切詞是文本分類、情感分析、信息檢索等眾多自然語言處理任務(wù)的基礎(chǔ)。 詞性標注(Part-of-speech Tagging)是為自然語言文本中的每一個詞匯賦予一個詞性的過程,這里的詞性包括名詞、動詞、形容詞、副詞等等。 命名實體識別(Named Entity Recognition,NER)又稱作“專名識別”,是指識別自然語言文本中具有特定意義的實體,主要包括人名、地名、機構(gòu)名、專有名詞等。 我們將這三個任務(wù)統(tǒng)一成一個聯(lián)合任務(wù),稱為詞法分析任務(wù),基于深度神經(jīng)網(wǎng)絡(luò),利用海量標注語料進行訓練,提供了一個端到端的解決方案。
我們把這個聯(lián)合的中文詞法分析解決方案命名為 LAC 。LAC 既可以認為是 Lexical Analysis of Chinese 的首字母縮寫,也可以認為是 LAC Analyzes Chinese 的遞歸縮寫。
特別注意:本項目依賴Paddle v0.14.0版本。如果您的Paddle安裝版本低于此要求,請按照安裝文檔中的說明更新Paddle安裝版本。
項目結(jié)構(gòu)
. ├── AUTHORS # 貢獻者列表 ├── CMakeLists.txt # cmake配置文件 ├── conf # 運行本例所需的模型及字典文件 ├── data # 運行本例所需要的數(shù)據(jù)依賴 ├── include # 頭文件 ├── LICENSE # 許可證信息 ├── python # 訓練使用的python文件 ├── README.md # 本文檔 ├── src # 源碼 ├── technical-report # 技術(shù)報告 └── test # Demo程序
引用
如果您的學術(shù)工作成果中使用了LAC,請您增加下述引用。我們非常欣慰LAC能夠?qū)δ膶W術(shù)工作帶來幫助。
@article{jiao2018LAC,
title={Chinese Lexical Analysis with Deep Bi-GRU-CRF Network},
author={Jiao, Zhenyu and Sun, Shuqi and Sun, Ke},
journal={arXiv preprint arXiv:1807.01882},
year={2018},
url={https://arxiv.org/abs/1807.01882}
}
模型
詞法分析任務(wù)的輸入是一個字符串(我們后面使用『句子』來指代它),而輸出是句子中的詞邊界和詞性、實體類別。序列標注是詞法分析的經(jīng)典建模方式。我們使用基于GRU的網(wǎng)絡(luò)結(jié)構(gòu)學習特征,將學習到的特征接入CRF解碼層完成序列標注。CRF解碼層本質(zhì)上是將傳統(tǒng)CRF中的線性模型換成了非線性神經(jīng)網(wǎng)絡(luò),基于句子級別的似然概率,因而能夠更好的解決標記偏置問題。模型要點如下,具體細節(jié)請參考python/train.py代碼。
輸入采用one-hot方式表示,每個字以一個id表示
one-hot序列通過字表,轉(zhuǎn)換為實向量表示的字向量序列;
字向量序列作為雙向GRU的輸入,學習輸入序列的特征表示,得到新的特性表示序列,我們堆疊了兩層雙向GRU以增加學習能力;
CRF以GRU學習到的特征為輸入,以標記序列為監(jiān)督信號,實現(xiàn)序列標注。
詞性和專名類別標簽集合如下表,其中詞性標簽24個(小寫字母),專名類別標簽4個(大寫字母)。這里需要說明的是,人名、地名、機名和時間四個類別,在上表中存在兩套標簽(PER / LOC / ORG / TIME 和 nr / ns / nt / t),被標注為第二套標簽的詞,是模型判斷為低置信度的人名、地名、機構(gòu)名和時間詞。開發(fā)者可以基于這兩套標簽,在四個類別的準確、召回之間做出自己的權(quán)衡。

數(shù)據(jù)
訓練使用的數(shù)據(jù)可以由用戶根據(jù)實際的應(yīng)用場景,自己組織數(shù)據(jù)。數(shù)據(jù)由兩列組成,以制表符分隔,第一列是utf8編碼的中文文本,第二列是對應(yīng)每個字的標注,以空格分隔。我們采用IOB2標注體系,即以X-B作為類型為X的詞的開始,以X-I作為類型為X的詞的持續(xù),以O(shè)表示不關(guān)注的字(實際上,在詞性、專名聯(lián)合標注中,不存在O)。示例如下:
在抗日戰(zhàn)爭時期,朝鮮族人民先后有十幾萬人參加抗日戰(zhàn)斗 p-B vn-B vn-I n-B n-I n-B n-I w-B nz-B nz-I nz-I n-B n-I d-B d-I v-B m-B m-I m-I n-B v-B v-I vn-B vn-I vn-B vn-I
我們隨同代碼一并發(fā)布了完全版的模型和相關(guān)的依賴數(shù)據(jù)。但是,由于模型的訓練數(shù)據(jù)過于龐大,我們沒有發(fā)布訓練數(shù)據(jù),僅在
data目錄下的train_data和test_data文件中放置少數(shù)樣本用以示例輸入數(shù)據(jù)格式。模型依賴數(shù)據(jù)包括:
輸入文本的詞典,在
conf目錄下,對應(yīng)word.dic對輸入文本中特殊字符進行轉(zhuǎn)換的字典,在
conf目錄下,對應(yīng)q2b.dic標記標簽的詞典,在
conf目錄下,對應(yīng)tag.dic
在訓練和預測階段,我們都需要進行原始數(shù)據(jù)的預處理,具體處理工作包括:
在訓練階段,這些工作由python/train.py調(diào)用python/reader.py完成;在預測階段,由C++代碼完成。
從原始數(shù)據(jù)文件中抽取出句子和標簽,構(gòu)造句子序列和標簽序列
將句子序列中的特殊字符進行轉(zhuǎn)換
依據(jù)詞典獲取詞對應(yīng)的整數(shù)索引
