【NLP】基于預(yù)訓(xùn)練的中文NLP工具介紹:ltp 和 fastHan
1. 簡(jiǎn)介
2. ltp
2.1 工作流程
2.2 demo
2.3 詞典分詞
2.4 詞性標(biāo)注集
2.5 模型算法
3. fastHan
3.1 模型結(jié)構(gòu)
3.2 demo
3.3 詞典分詞
3.4 微調(diào)模型
3.5 詞性標(biāo)注集
4. 速度對(duì)比實(shí)驗(yàn)
1. 簡(jiǎn)介
今天給大家介紹兩個(gè)中文自然語(yǔ)言處理工具:ltp 和 fastHan,兩者都支持基本的中文自然語(yǔ)言處理任務(wù),包括中文分詞、詞性標(biāo)注、命名實(shí)體識(shí)別和依存句法分析等。ltp 是由哈工大社會(huì)計(jì)算與信息檢索研究中心(HIT-SCIR)開(kāi)源,基于 pytorch 與 transformers 實(shí)現(xiàn)的語(yǔ)言技術(shù)平臺(tái),其內(nèi)核為基于 Electra 的聯(lián)合模型。
paper:?N-LTP:?An?Open-source?Neural?Language?Technology?Platform?for?Chinese?
link:?https://arxiv.org/pdf/2009.11616.pdf
code:?https://github.com/HIT-SCIR/ltp
fastHan 是由復(fù)旦大學(xué)自然語(yǔ)言處理實(shí)驗(yàn)室邱錫鵬組研發(fā),基于 fastNLP 與 pytorch 實(shí)現(xiàn)的中文自然語(yǔ)言處理工具,其內(nèi)核為基于 BERT 的聯(lián)合模型。
paper:?fastHan:?A?BERT-based?Multi-Task?Toolkit?for?Chinese?NLP
link:?https://arxiv.org/pdf/2009.08633v2.pdf
code:?https://github.com/fastnlp/fastHan
2. ltp
2.1 工作流程

如上為 N-LTP 的工作流程,輸入為中文語(yǔ)料庫(kù),輸出為相對(duì)豐富和快速的分析結(jié)果,包括詞法分析(中文分詞、詞性標(biāo)注和命名實(shí)體識(shí)別),依存句法分析和語(yǔ)義分析(語(yǔ)義依存分析和語(yǔ)義角色標(biāo)注)等。

上圖展示了 N-LTP 的基本模型結(jié)構(gòu),主要由一個(gè)共享編碼器和幾個(gè)處理不同任務(wù)的解碼器組成。整個(gè)框架共享一個(gè)編碼器,用于利用在所有任務(wù)中共享的知識(shí)。每個(gè)任務(wù)分別使用各自的任務(wù)解碼器。所有任務(wù)通過(guò)一個(gè)聯(lián)合學(xué)習(xí)機(jī)制同時(shí)進(jìn)行優(yōu)化。此外,還引入了知識(shí)蒸餾技術(shù),以鼓勵(lì)多任務(wù)模型性能超越其單任務(wù)教師模型。
2.2 demo
使用 pip 安裝 ltp:
pip?install?ltp
快速使用:
from?ltp?import?LTP
model?=?LTP()
#?默認(rèn)加載?small?模型
#?model?=?LTP(path="small")
#?path?可以為下載下來(lái)的包含ltp.model和vocab.txt的模型文件夾
#?也可以接受一些已注冊(cè)可自動(dòng)下載的模型名:
#?base/base1/base2/small/tiny/GSD/GSD+CRF/GSDSimp/GSDSimp+CRF
sent_list?=?['俄羅斯總統(tǒng)普京決定在頓巴斯地區(qū)開(kāi)展特別軍事行動(dòng)。']
#?中文分詞
seg,?hidden?=?model.seg(sent_list)
#?詞性標(biāo)注
pos?=?model.pos(hidden)
#?命名實(shí)體識(shí)別
ner?=?model.ner(hidden)
#?語(yǔ)義角色標(biāo)注
srl?=?model.srl(hidden)
#?依存句法分析
dep?=?model.dep(hidden)
#?語(yǔ)義依存分析
sdp?=?model.sdp(hidden)
部分分析結(jié)果:
seg:
[['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開(kāi)展',?'特別',?'軍事',?'行動(dòng)',?'。']]
pos:
[['ns',?'n',?'nh',?'v',?'p',?'ns',?'n',?'v',?'a',?'n',?'v',?'wp']]
ner:
[[('Ns',?0,?0),?('Nh',?2,?2),?('Ns',?5,?6)]]
詞性標(biāo)注結(jié)果中的每個(gè)元素表示分詞結(jié)果中相應(yīng)的單詞詞性,命名實(shí)體識(shí)別結(jié)果中的每個(gè)元素為一個(gè)三元組,分別表示實(shí)體類(lèi)型、單詞開(kāi)始編號(hào)和單詞結(jié)束編號(hào)。
2.3 詞典分詞
LTP 允許用戶使用 init_dict 函數(shù)和 add_words 函數(shù)添加自定義詞典:
#?model.init_dict(user_dict_path)
model.add_words(['俄羅斯總統(tǒng)',?'頓巴斯地區(qū)'])
seg,?_?=?model.seg(sent_list)
seg:
[['俄羅斯總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯地區(qū)',?'開(kāi)展',?'特別',?'軍事',?'行動(dòng)',?'。']]
2.4 詞性標(biāo)注集
LTP 使用的是 863 詞性標(biāo)注集,其各個(gè)詞性含義如下表。
| Tag | Description | Example | Tag | Description | Example |
|---|---|---|---|---|---|
| a | adjective | 美麗 | ni | organization name | 保險(xiǎn)公司 |
| b | other noun-modifier | 大型, 西式 | nl | location noun | 城郊 |
| c | conjunction | 和, 雖然 | ns | geographical name | 北京 |
| d | adverb | 很 | nt | temporal noun | 近日, 明代 |
| e | exclamation | 哎 | nz | other proper noun | 諾貝爾獎(jiǎng) |
| g | morpheme | 茨, 甥 | o | onomatopoeia | 嘩啦 |
| h | prefix | 阿, 偽 | p | preposition | 在, 把 |
| i | idiom | 百花齊放 | q | quantity | 個(gè) |
| j | abbreviation | 公檢法 | r | pronoun | 我們 |
| k | suffix | 界, 率 | u | auxiliary | 的, 地 |
| m | number | 一, 第一 | v | verb | 跑, 學(xué)習(xí) |
| n | general noun | 蘋(píng)果 | wp | punctuation | ,。! |
| nd | direction noun | 右側(cè) | ws | foreign words | CPU |
| nh | person name | 杜甫, 湯姆 | x | non-lexeme | 萄, 翱 |
| z | descriptive words | 瑟瑟,匆匆 |
LTP 中的 NER 模塊識(shí)別三種命名實(shí)體,分別如下:
| 標(biāo)記 | 含義 |
|---|---|
| Nh | 人名 |
| Ni | 機(jī)構(gòu)名 |
| Ns | 地名 |
2.5 模型算法
默認(rèn)加載的 small 模型各個(gè)模塊使用的算法如下,詳細(xì)介紹可參考原論文。
分詞:Electra Small + Linear
詞性:Electra Small + Linear
命名實(shí)體:Electra Small + Adapted Transformer + Linear
依存句法:Electra Small + BiAffine + Eisner
語(yǔ)義依存:Electra Small + BiAffine
語(yǔ)義角色:Electra Small + BiAffine + CRF
3. fastHan
3.1 模型結(jié)構(gòu)

如上展示了 fastHan 的基本模型結(jié)構(gòu),其采用基于 BERT 的聯(lián)合模型在 13 個(gè)語(yǔ)料庫(kù)上進(jìn)行多任務(wù)學(xué)習(xí),可以處理中文分詞、詞性標(biāo)注、命名實(shí)體識(shí)別和依存句法分析四項(xiàng)基本任務(wù)。
fastHan 有 base 和 large 兩個(gè)版本,large 模型使用 BERT 的前 8 層,base 模型使用 Theseus 策略將 large 模型的 8 層壓縮至 4 層。base 版本在總參數(shù)量 150MB 的情況下在各項(xiàng)任務(wù)上均有不錯(cuò)表現(xiàn),large 版本則接近甚至超越 SOTA 模型。
3.2 demo
使用 pip 安裝 fastHan:
pip?install?fastHan
快速使用:
from?fastHan?import?FastHan
model?=?FastHan()
#?默認(rèn)加載base模型
#?使用large模型如下
#?model?=?FastHan(model_type="large")
model.set_device(0)
sent_list?=?['俄羅斯總統(tǒng)普京決定在頓巴斯地區(qū)開(kāi)展特別軍事行動(dòng)。']
#?中文分詞
seg?=?model(sent_list)
#?詞性標(biāo)注
pos?=?model(sent_list,?target="POS")
#?命名實(shí)體識(shí)別
ner?=?model(sent_list,?target="NER",?return_loc=True)
#?依存句法分析
dep?=?model(sent_list,?target="Parsing")
分析結(jié)果:
seg:
[['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開(kāi)展',?'特別',?'軍事',?'行動(dòng)',?'。']]
pos:
[[['俄羅斯',?'NR'],?['總統(tǒng)',?'NN'],?['普京',?'NR'],?['決定',?'VV'],?['在',?'P'],?['頓巴斯',?'NR'],?['地區(qū)',?'NN'],?['開(kāi)展',?'VV'],?['特別',?'JJ'],?['軍事',?'NN'],?['行動(dòng)',?'NN'],?['。',?'PU']]]
ner:
[[['俄羅斯',?'NS',?0],?['普京',?'NR',?5],?['頓巴斯',?'NS',?10]]]
dep:
[[['俄羅斯',?2,?'nn',?'NR'],?['總統(tǒng)',?3,?'nn',?'NN'],?['普京',?8,?'xsubj',?'NR'],?['決定',?0,?'root',?'VV'],?['在',?8,?'prep',?'P'],?['頓巴斯',?7,?'nn',?'NR'],?['地區(qū)',?5,?'pobj',?'NN'],?['開(kāi)展',?4,?'ccomp',?'VV'],?['特別',?11,?'amod',?'JJ'],?['軍事',?11,?'nn',?'NN'],?['行動(dòng)',?8,?'dobj',?'NN'],?['。',?4,?'punct',?'PU']]]
當(dāng)設(shè)置 return_loc=True 時(shí),結(jié)果會(huì)返回單詞的第一個(gè)字符在原始輸入句子中的位置。
3.3 詞典分詞
fastHan 允許用戶使用 add_user_dict 函數(shù)添加自定義詞典,該詞典會(huì)影響模型在分詞任務(wù)中的權(quán)重分配。進(jìn)行分詞任務(wù)時(shí),首先利用詞典和正向、反向最大匹配法進(jìn)行分詞,并將詞典方法的分詞結(jié)果乘上權(quán)重系數(shù)融入到深度學(xué)習(xí)模型的結(jié)果中。add_user_dict 函數(shù)的參數(shù)可以是由單詞組成的列表,也可以是文件路徑(文件中的內(nèi)容是由 '\n' 分隔開(kāi)的詞)。
用戶可使用 set_user_dict_weight 函數(shù)設(shè)置自定義詞典中的單詞權(quán)重系數(shù)(若不設(shè)置,默認(rèn)為 0.05)。
model.add_user_dict(["俄羅斯總統(tǒng)",?"頓巴斯地區(qū)"])
#?自定義詞典中的單詞權(quán)重系數(shù)默認(rèn)為0.05
model.set_user_dict_weight()
seg1?=?model(sent_list,?use_dict=True)
#?自定義詞典中的單詞權(quán)重系數(shù)設(shè)置為1.0
model.set_user_dict_weight(1.0)
seg2?=?model(sent_list,?use_dict=True)
seg1:
[['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開(kāi)展',?'特別',?'軍事',?'行動(dòng)',?'。']]
seg2:
[['俄羅斯總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯地區(qū)',?'開(kāi)展',?'特別',?'軍事',?'行動(dòng)',?'。']]
3.4 微調(diào)模型
用戶可以使用 finetune 函數(shù)在新的數(shù)據(jù)集上進(jìn)行微調(diào):
from?fastHan?import?FastHan
model?=?FastHan(model_type='base')
model.set_device(0)
#?traindata?file?path
cws_data?=?'train.dat'
model.finetune(data_path=cws_data,?task='CWS',?save=True,?save_url='finetuned_model')
微調(diào)時(shí)需要將用于訓(xùn)練的數(shù)據(jù)按格式放到一個(gè)文件里。對(duì)于中文分詞任務(wù),要求每行一條句子,每個(gè)詞用空格分隔開(kāi):
上海?浦東?開(kāi)發(fā)?與?法制?建設(shè)?同步
俄羅斯總統(tǒng)?普京?決定?在?頓巴斯地區(qū)?開(kāi)展?特別?軍事?行動(dòng)?。
對(duì)于命名實(shí)體識(shí)別任務(wù),要求使用 B-M-E-S-O 標(biāo)注的 NT/NS/NR 輸入格式:
札?B-NS
幌?E-NS
雪?O
國(guó)?O
廟?O
會(huì)?O
。O
主?O
道?O
上?O
的?O
雪?O
...
對(duì)于詞性標(biāo)注和依存句法解析任務(wù),要求按照 CTB9 的格式與標(biāo)簽集。
3.5 詞性標(biāo)注集
fastHan 使用 CTB 詞性標(biāo)注集,其各個(gè)詞性含義如下表。
| 標(biāo)簽 | 描述 | 含義 | 標(biāo)簽 | 描述 | 含義 |
|---|---|---|---|---|---|
| AD | adverbs | 副詞 | M | Measure word(including classifiers) | 量詞,例子:“個(gè)” |
| AS | Aspect marker | 體態(tài)詞,體標(biāo)記(例如:了,在,著,過(guò)) | MSP | Some particles | 例子:“所” |
| BA | 把 in ba-const | “把”、“將”的詞性標(biāo)記 | NN | Common nouns | 普通名詞 |
| CC | Coordinating conjunction | 并列連詞,“和” | NR | Proper nouns | 專(zhuān)有名詞 |
| CD | Cardinal numbers | 數(shù)字,“一百” | NT | Temporal nouns | 時(shí)序詞,表示時(shí)間的名詞 |
| CS | Subordinating conj | 從屬連詞(例子:若,如果,如…) | OD | Ordinal numbers | 序數(shù)詞,“第一” |
| DEC | 的 for relative-clause etc | “的”詞性標(biāo)記 | ON | Onomatopoeia | 擬聲詞,“哈哈” |
| DEG | Associative | 聯(lián)結(jié)詞“的” | P | Preposition (excluding 把 and 被) | 介詞 |
| DER | in V-de construction, and V-de-R | “得” | PN | pronouns | 代詞 |
| DEV | before VP | 地 | PU | Punctuations | 標(biāo)點(diǎn) |
| DT | Determiner | 限定詞,“這” | SB | in long bei-construction | 例子:“被,給” |
| ETC | Tag for words, in coordination phrase | 等,等等 | SP | Sentence-final particle | 句尾小品詞,“嗎” |
| FW | Foreign words | 例子:ISO | VA | Predicative adjective | 表語(yǔ)形容詞,“紅” |
| IJ | interjetion | 感嘆詞 | VC | Copula | 系動(dòng)詞,“是” |
| JJ | Noun-modifier other than nouns | VE | 有 as the main verb | “有” | |
| LB | in long bei-construction | 例子:被,給 | VV | Other verbs | 其他動(dòng)詞 |
| LC | Localizer | 定位詞,例子:“里” |
fastHan 中的 NER 模塊識(shí)別三種命名實(shí)體,分別如下:
| 標(biāo)記 | 含義 |
|---|---|
| NR | 人名 |
| NT | 機(jī)構(gòu)名 |
| NS | 地名 |
4. 速度對(duì)比實(shí)驗(yàn)
筆者在 GPU 上(torch1.7 + cuda10.2 + cudnn7.6.5)對(duì)比了 ltp 和 fastHan 的處理速度。從中文維基百科中抽取了 10098 條長(zhǎng)度為 128 左右的句子,分別使用 ltp-tiny、ltp-small、ltp-base 和 fastHan-base、fastHan-large 模型進(jìn)行處理,batch size 設(shè)置為 64,統(tǒng)計(jì)不同任務(wù)的處理速度如下表所示:
| model | cws_speed (句/s) | pos_speed (句/s) | ner_speed (句/s) |
|---|---|---|---|
| ltp-tiny | 613 | 614 | 596 |
| ltp-small | 451 | 450 | 413 |
| ltp-base | 189 | 186 | 178 |
| fastHan-base | 199 | 194 | 194 |
| fastHan-large | 144 | 143 | 145 |
可以看出,ltp-tiny 和 ltp-small 模型的處理速度顯著快于 fastHan,fashHan-base 的處理速度略快于 ltp-base,fastHan-large 的處理速度最慢。通常情況下,ltp-small 的性能已經(jīng)非常不錯(cuò),對(duì)處理速度要求高的場(chǎng)景建議使用 ltp 默認(rèn)的 small 模型。
往期精彩回顧
