paddlepaddle中文詞法分析LAC


摘自:https://aistudio.baidu.com/aistudio/projectdetail/305812

 

相關代碼:

鏈接:https://pan.baidu.com/s/1uK9Cq55RZinAIDAcdCOLuw
提取碼:sjpy

分詞基本知識

什么是分詞

詞是最小的能夠獨立活動的有意義的語言成分,英文單詞之間是以空格作為自然分界符的,而漢語是以字為基本的書寫單位,詞語之間沒有明顯的區分標記,因此,中文詞語分析是中文分詞的基礎與關鍵。

由於英文單詞本來就有空格進行分割,所以處理起來相對方便。但是,由於中文是沒有分隔符的,所以分詞的問題就比較重要。

分詞常用的手段是基於字典的最長串匹配,但是歧義分詞很難。舉個例子,‘他 將來 我 校 講學’ ,也可切分成’他 將 來 我 校 講學‘。

中文分詞是中文文本處理的一個基礎步驟,也是中文人機自然語言交互的基礎模塊。不同於英文的是,中文句子中沒有詞的界限,因此在進行中文自然語言處理時,通常需要先進行分詞,分詞效果將直接影響詞性、句法樹等模塊的效果。當然分詞只是一個工具,場景不同,要求也不同。在人機自然語言交互中,成熟的中文分詞算法能夠達到更好的自然語言處理效果,幫助計算機理解復雜的中文語言。中文分詞根據實現原理和特點,主要分為以下2個類別:

 

分詞基本知識

常見的分詞方法

1、基於詞典分詞算法也稱字符串匹配分詞算法。

該算法是按照一定的策略將待匹配的字符串和一個已建立好的“充分大的”詞典中的詞進行匹配,若找到某個詞條,則說明匹配成功,識別了該詞。常見的基於詞典的分詞算法分為以下幾種:正向最大匹配法、逆向最大匹配法和雙向匹配分詞法等。基於詞典的分詞算法是應用最廣泛、分詞速度最快的。很長一段時間內研究者都在對基於字符串匹配方法進行優化,比如最大長度設定、字符串存儲和查找方式以及對於詞表的組織結構,比如采用TRIE索引樹、哈希索引等。

2、基於統計的機器學習算法

這類目前常用的是算法是HMM、CRF、SVM、深度學習等算法,比如stanford、Hanlp分詞工具是基於CRF算法。以CRF為例,基本思路是對漢字進行標注訓練,不僅考慮了詞語出現的頻率,還考慮上下文,具備較好的學習能力,因此其對歧義詞和未登錄詞的識別都具有良好的效果。Nianwen Xue在其論文《Combining Classifiers for Chinese Word Segmentation》中首次提出對每個字符進行標注,通過機器學習算法訓練分類器進行分詞,在論文《Chinese word segmentation as character tagging》中較為詳細地闡述了基於字標注的分詞法。常見的分詞器都是使用機器學習算法和詞典相結合,一方面能夠提高分詞准確率,另一方面能夠改善領域適應性。隨着深度學習的興起,也出現了基於神經網絡的分詞器,例如有人員嘗試使用雙向LSTM+CRF實現分詞器,其本質上是序列標注,所以有通用性,命名實體識別等都可以使用該模型,據報道其分詞器字符准確率可高達97.5%。算法框架的思路與論文《Neural Architectures for Named Entity Recognition》類似,利用該框架可以實現中文分詞,

分詞器當前存在問題

目前中文分詞難點主要有三個:

  • 1、分詞標准:比如人名,在哈工大的標准中姓和名是分開的,但在Hanlp中是合在一起的。這需要根據不同的需求制定不同的分詞標准。
  • 2、歧義:對同一個待切分字符串存在多個分詞結果。歧義又分為組合型歧義、交集型歧義和真歧義三種類型。
      1. 組合型歧義:分詞是有不同的粒度的,指某個詞條中的一部分也可以切分為一個獨立的詞條。比如“中華人民共和國”,粗粒度的分詞就是“中華人民共和國”,細粒度的分詞可能是“中華/人民/共和國”
      1. 交集型歧義:在“鄭州天和服裝廠”中,“天和”是廠名,是一個專有詞,“和服”也是一個詞,它們共用了“和”字。
      1. 真歧義:本身的語法和語義都沒有問題, 即便采用人工切分也會產生同樣的歧義,只有通過上下文的語義環境才能給出正確的切分結果。例如:對於句子“美國會通過對台售武法案”,既可以切分成“美國/會/通過對台售武法案”,又可以切分成“美/國會/通過對台售武法案”。一般在搜索引擎中,構建索引時和查詢時會使用不同的分詞算法。常用的方案是,在索引的時候使用細粒度的分詞以保證召回,在查詢的時候使用粗粒度的分詞以保證精度。
  • 3、新詞:也稱未被詞典收錄的詞,該問題的解決依賴於人們對分詞技術和漢語語言結構的進一步認識。

NLP基礎知識-中文分詞詞性表

詞性編碼 詞性名稱 注 解
Ag 形語素 形容詞性語素。形容詞代碼為 a,語素代碼g前面置以A。
a 形容詞 取英語形容詞 adjective的第1個字母。
ad 副形詞 直接作狀語的形容詞。形容詞代碼 a和副詞代碼d並在一起。
an 名形詞 具有名詞功能的形容詞。形容詞代碼 a和名詞代碼n並在一起。
b 區別詞 取漢字“別”的聲母。
c 連詞 取英語連詞 conjunction的第1個字母。
dg 副語素 副詞性語素。副詞代碼為 d,語素代碼g前面置以D。
d 副詞 取 adverb的第2個字母,因其第1個字母已用於形容詞。
e 嘆詞 取英語嘆詞 exclamation的第1個字母。
f 方位詞 取漢字“方”。
g 語素 絕大多數語素都能作為合成詞的“詞根”,取漢字“根”的聲母。
h 前接成分 取英語 head的第1個字母。
i 成語 取英語成語 idiom的第1個字母。
j 簡稱略語 取漢字“簡”的聲母。
k 后接成分。  
l 習用語 習用語尚未成為成語,有點“臨時性”,取“臨”的聲母。
m 數詞 取英語 numeral的第3個字母,n,u已有他用。
Ng 名語素 名詞性語素。名詞代碼為 n,語素代碼g前面置以N。
n 名詞 取英語名詞 noun的第1個字母。
nr 人名 名詞代碼 n和“人(ren)”的聲母並在一起。
ns 地名 名詞代碼 n和處所詞代碼s並在一起。
nt 機構團體 “團”的聲母為 t,名詞代碼n和t並在一起。
nz 其他專名 “專”的聲母的第 1個字母為z,名詞代碼n和z並在一起。
o 擬聲詞 取英語擬聲詞 onomatopoeia的第1個字母。
p 介詞 取英語介詞 prepositional的第1個字母。
q 量詞 取英語 quantity的第1個字母。
r 代詞 取英語代詞 pronoun的第2個字母,因p已用於介詞。
s 處所詞 取英語 space的第1個字母。
tg 時語素 時間詞性語素。時間詞代碼為 t,在語素的代碼g前面置以T。
t 時間詞 取英語 time的第1個字母。
u 助詞 取英語助詞 auxiliary
vg 動語素 動詞性語素。動詞代碼為 v。在語素的代碼g前面置以V。
v 動詞 取英語動詞 verb的第一個字母。
vd 副動詞 直接作狀語的動詞。動詞和副詞的代碼並在一起。
vn 名動詞 指具有名詞功能的動詞。動詞和名詞的代碼並在一起。
w 標點符號  
x 非語素字 非語素字只是一個符號,字母 x通常用於代表未知數、符號。
y 語氣詞 取漢字“語”的聲母。
z 狀態詞 取漢字“狀”的聲母的前一個字母。
un 未知詞 不可識別詞及用戶自定義詞組。取英文Unkonwn首兩個字母。

縮略版本可見下表:

標簽 含義 標簽 含義 標簽 含義 標簽 含義
n 普通名詞 f 方位名詞 s 處所名詞 t 時間
nr 人名 ns 地名 nt 機構名 nw 作品名
nz 其他專名 v 普通動詞 vd 動副詞 vn 名動詞
a 形容詞 ad 副形詞 an 名形詞 d 副詞
m 數量詞 q 量詞 r 代詞 p 介詞
c 連詞 u 助詞 xc 其他虛詞 w 標點符號
PER 人名 LOC 地名 ORG 機構名 TIME 時間

 

中文詞法分析LAC

Lexical Analysis of Chinese,簡稱 LAC,是一個聯合的詞法分析模型,在單個模型中完成中文分詞、詞性標注、專名識別任務。我們在自建的數據集上對分詞、詞性標注、專名識別進行整體的評估效果,具體數值見下表

 

模型 Precision Recall F1-score
Lexical Analysis 89.2% 89.4% 89.3%
BERT finetuned 90.2% 90.4% 90.3%
ERNIE finetuned 91.7% 91.7% 91.7%

 

一、數據准備

可通過腳本下載數據集和預訓練模型

  • 全部下載
python downloads.py all

或者

sh downloads.sh
  • 訓練數據集 下載數據集文件,解壓后會生成 ./data/ 文件夾
python downloads.py dataset
  • 預訓練模型 可下載三種模型:baseline、finetuned、ernie
# download baseline model python downloads.py lac # download ERNIE finetuned model python downloads.py finetuned # download ERNIE model for training python downloads.py ernie 
 

二、模型評估

我們基於自建的數據集訓練了一個詞法分析的模型,可以直接用這個模型對測試集 ./data/test.tsv 進行驗證

# baseline model sh run.sh eval # ERNIE finetuned model sh run_ernie.sh eval 
  • 評估結果
baseline model:    [test] P: 0.89211, R: 0.89442, F1: 0.89326, elapsed time: 0.955 s
ernie finetuned model:   [test] loss: 3.13399, P: 0.91724, R: 0.91663, F1: 0.91694, elapsed time: 598.154 s
 

三、模型訓練

我們可在./data/train.tsv 上進行訓練,示例包含程序在單機單卡/多卡,以及CPU多線程的運行設置,若需進行ERNIE Finetune訓練,需先行下載ERNIE開放的模型,通過命令python downloads.py ernie可完成下載

多機模式不建議在AI Studio下嘗試,會崩潰

多機模式不建議在AI Studio下嘗試,會崩潰

多機模式不建議在AI Studio下嘗試,會崩潰(重要的事說三遍!有條件的可以在自己的本地環境嘗試)

# baseline model, using single GPU sh run.sh train_single_gpu # baseline model, using multi GPU sh run.sh train_multi_gpu # baseline model, using multi CPU sh run.sh train_multi_cpu # ERNIE finetuned model sh run_ernie.sh train # ERNIE finetuned model, using single GPU sh run_ernie.sh train_single_gpu # ERNIE finetuned model, using multi CPU sh run_ernie.sh train_multi_cpu 
 

四、模型的預測

使用預訓練的模型可以對未知的數據進行預測

  • 數據集格式
In[4]
!head  LAC/lexical_analysis/data/test.tsv
text_a	label
除了他續任十二屆政協委員,馬化騰,雷軍,李彥宏也被推選為新一屆全國人大代表或全國政協委員	p-Bp-Ir-Bv-Bv-Im-Bm-Im-IORG-BORG-In-Bn-Iw-BPER-BPER-IPER-Iw-BPER-BPER-Iw-BPER-BPER-IPER-Id-Bp-Bv-Bv-Iv-Ba-Bm-Bm-IORG-BORG-IORG-IORG-In-Bn-Ic-Bn-Bn-IORG-BORG-In-Bn-I
其中,這也和應屆生就業市場疲軟有關	r-Br-Iw-Br-Bd-Bp-Bn-Bn-In-Iv-Bv-In-Bn-Ia-Ba-Iv-Bv-I
此外,創傷及大面積燒傷,由於嚴重的失血,脫水,造成血液濃縮,血細胞增多也可增加血液的凝固度	d-Bd-Iw-Bn-Bn-Ic-Bn-Bn-In-Ivn-Bvn-Iw-Bp-Bp-Ia-Ba-Iu-Bvn-Bvn-Iw-Bvn-Bvn-Iw-Bv-Bv-In-Bn-Iv-Bv-Iw-Bn-Bn-In-Iv-Bv-Id-Bv-Bv-Bv-In-Bn-Iu-Bn-Bn-In-I
設計理念精益求精,以合理的價格建造優質放心的工程	vn-Bvn-In-Bn-Iv-Bv-Iv-Iv-Iw-Bp-Ba-Ba-Iu-Bn-Bn-Iv-Bv-Ia-Ba-Iv-Bv-Iu-Bn-Bn-I
負責醫療廣告的技術出證	v-Bv-In-Bn-In-Bn-Iu-Bn-Bn-Iv-Bn-B
工作中,細化過程,注重抽查檢查,切實抓好常規教學,安全教育,食堂衛生,校外寄宿生管理等工作	n-Bn-If-Bw-Bv-Bv-In-Bn-Iw-Bv-Bv-Ivn-Bvn-Ivn-Bvn-Iw-Bad-Bad-Iv-Bv-In-Bn-Ivn-Bvn-Iw-Ban-Ban-Ivn-Bvn-Iw-Bn-Bn-Ian-Ban-Iw-Bs-Bs-In-Bn-In-Ivn-Bvn-Iu-Bn-Bn-I
七是負責全市機關,事業單位的工資制度改革和工資福利工作	m-Bv-Bv-Bv-In-Bn-In-Bn-Iw-Bn-Bn-In-In-Iu-Bn-Bn-In-Bn-Ivn-Bvn-Ic-Bn-Bn-In-Bn-In-Bn-I
唐婉質問林致遠,可林致遠卻說沒什么.	PER-BPER-Iv-Bv-IPER-BPER-IPER-Iw-Bc-BPER-BPER-IPER-Iv-Bv-Iv-Br-Br-Iw-B
宋思明喜歡這種十里洋場的明暗交替,醉心這種慵懶的步履	PER-BPER-IPER-Iv-Bv-Ir-Br-In-Bn-In-In-Iu-Bn-Bn-Ivn-Bvn-Iw-Bv-Bv-Ir-Br-Ia-Ba-Iu-Bn-Bn-I
 
  • 預測方法
# baseline model sh run.sh infer # ERNIE finetuned model sh run_ernie.sh infer 
  • 預測結果

舉例說明,全部結果可執行命令后在終端查看

(用戶, n)(應, v)(關閉, v)(現在, TIME)(的, u)(led, n)(繼承, vn)
(姐姐, n)(我, r)(休息, v)(一下, m)(,, w)(馬上, d)(就, d)(煮面, v)
(顯然, ad)(,, w)(東風標致308, nz)(也, d)(開始, v)(見證, v)(東風標致, ORG)(品牌, n)(的, u)(崛起, vn)
(可能, v)(是, v)(我, r)(長期, n)(勞累, a)(經常, d)(出汗, v)(所以, c)(下面, f)(長期, n)(比較, d)(潮濕, a)(的, u)(原因, n)
(兩人, n)(在, p)(兩派, n)(中, f)(都是, v)(地位, n)(不俗, a)(,, w)(如今, TIME)(互相, d)(牽制, v)(,, w)(使得, v)(楚曉燕, PER)(處境, n)(不, d)(至於, d)(太, d)(為難, a)
 

五、如何使用自己的數據訓練

構建自己的數據

第一行是 text_a\tlabel 固定的開頭,后面的每行數據都是由兩列組成,以制表符分隔,第一列是 utf-8 編碼的中文文本,以 \002 分割,第二列是對應每個字的標注,以 \002 分隔。我們采用 IOB2 標注體系,即以 X-B 作為類型為 X 的詞的開始,以 X-I 作為類型為 X 的詞的持續,以 O 表示不關注的字(實際上,在詞性、專名聯合標注中,不存在 O )。示例如下:

除\002了\002他\002續\002任\002十\002二\002屆\002政\002協\002委\002員\002,\002馬\002化\002騰\002,\002雷\002軍\002,\002李\002彥\002宏\002也\002被\002推\002選\002為\002新\002一\002屆\002全\002國\002人\002大\002代\002表\002或\002全\002國\002政\002協\002委\002員	p-B\002p-I\002r-B\002v-B\002v-I\002m-B\002m-I\002m-I\002ORG-B\002ORG-I\002n-B\002n-I\002w-B\002PER-B\002PER-I\002PER-I\002w-B\002PER-B\002PER-I\002w-B\002PER-B\002PER-I\002PER-I\002d-B\002p-B\002v-B\002v-I\002v-B\002a-B\002m-B\002m-I\002ORG-B\002ORG-I\002ORG-I\002ORG-I\002n-B\002n-I\002c-B\002n-B\002n-I\002ORG-B\002ORG-I\002n-B\002n-I
  • 模型依賴數據包括:
    1. 輸入文本的詞典,在conf目錄下,對應word.dic
    2. 對輸入文本中特殊字符進行轉換的字典,在conf目錄下,對應q2b.dic
    3. 標記標簽的詞典,在conf目錄下,對應tag.dic
  • 在訓練和預測階段,我們都需要進行原始數據的預處理,具體處理工作包括:
    1. 從原始數據文件中抽取出句子和標簽,構造句子序列和標簽序列
    2. 將句子序列中的特殊字符進行轉換
    3. 依據詞典獲取詞對應的整數索引

代碼結構說明

.
├── README.md                           # 本文檔 ├── conf/ # 詞典及程序默認配置的目錄 ├── compare.py # 執行LAC與其他開源分詞的對比腳本 ├── creator.py # 執行創建網絡和數據讀取器的腳本 ├── data/ # 存放數據集的目錄 ├── downloads.py # 用於下載數據和模型的腳本 ├── downloads.sh # 用於下載數據和模型的腳本 ├── eval.py # 詞法分析評估的腳本 ├── inference_model.py # 執行保存inference_model的腳本,用於准備上線部署環境 ├── gru-crf-model.png # README 用到的模型圖片 ├── predict.py # 執行預測功能的腳本 ├── reader.py # 文件讀取相關函數 ├── run_ernie_sequence_labeling.py # 用於 finetune ERNIE 的代碼 ├── run_ernie.sh # 啟用上面代碼的腳本 ├── train.py # 詞法分析訓練腳本 ├── run.sh # 啟用上面代碼的腳本 └── utils.py # 常用工具函數 

如何組建自己的模型

可以根據自己的需求,組建自定義的模型,具體方法如下所示:

  1. 定義自己的詞法分析模型,可以在 ../models/sequence_labeling/nets.py 中添加自己的網絡結構,具體接口要求可以參考默認的 lex_net 函數。
  2. 模型訓練、評估、預測的邏輯,需要在 run.sh 和 run_ernie.sh 中修改對應的模型路徑、數據路徑和詞典路徑等參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM