【NLP】基于预训练的中文NLP工具介绍:ltp 和 fastHan
1. 簡介
2. ltp
2.1 工作流程
2.2 demo
2.3 詞典分詞
2.4 詞性標注集
2.5 模型算法
3. fastHan
3.1 模型結(jié)構(gòu)
3.2 demo
3.3 詞典分詞
3.4 微調(diào)模型
3.5 詞性標注集
4. 速度對比實驗
1. 簡介
今天給大家介紹兩個中文自然語言處理工具:ltp 和 fastHan,兩者都支持基本的中文自然語言處理任務,包括中文分詞、詞性標注、命名實體識別和依存句法分析等。ltp 是由哈工大社會計算與信息檢索研究中心(HIT-SCIR)開源,基于 pytorch 與 transformers 實現(xiàn)的語言技術(shù)平臺,其內(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/ltpfastHan 是由復旦大學自然語言處理實驗室邱錫鵬組研發(fā),基于 fastNLP 與 pytorch 實現(xiàn)的中文自然語言處理工具,其內(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/fastHan2. ltp
2.1 工作流程
如上為 N-LTP 的工作流程,輸入為中文語料庫,輸出為相對豐富和快速的分析結(jié)果,包括詞法分析(中文分詞、詞性標注和命名實體識別),依存句法分析和語義分析(語義依存分析和語義角色標注)等。
上圖展示了 N-LTP 的基本模型結(jié)構(gòu),主要由一個共享編碼器和幾個處理不同任務的解碼器組成。整個框架共享一個編碼器,用于利用在所有任務中共享的知識。每個任務分別使用各自的任務解碼器。所有任務通過一個聯(lián)合學習機制同時進行優(yōu)化。此外,還引入了知識蒸餾技術(shù),以鼓勵多任務模型性能超越其單任務教師模型。
2.2 demo
使用 pip 安裝 ltp:
pip?install?ltp快速使用:
from?ltp?import?LTP model?=?LTP() #?默認加載?small?模型 #?model?=?LTP(path="small") #?path?可以為下載下來的包含ltp.model和vocab.txt的模型文件夾 #?也可以接受一些已注冊可自動下載的模型名: #?base/base1/base2/small/tiny/GSD/GSD+CRF/GSDSimp/GSDSimp+CRF sent_list?=?['俄羅斯總統(tǒng)普京決定在頓巴斯地區(qū)開展特別軍事行動。']#?中文分詞 seg,?hidden?=?model.seg(sent_list) #?詞性標注 pos?=?model.pos(hidden) #?命名實體識別 ner?=?model.ner(hidden) #?語義角色標注 srl?=?model.srl(hidden) #?依存句法分析 dep?=?model.dep(hidden) #?語義依存分析 sdp?=?model.sdp(hidden)部分分析結(jié)果:
seg: [['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開展',?'特別',?'軍事',?'行動',?'。']]pos: [['ns',?'n',?'nh',?'v',?'p',?'ns',?'n',?'v',?'a',?'n',?'v',?'wp']]ner: [[('Ns',?0,?0),?('Nh',?2,?2),?('Ns',?5,?6)]]詞性標注結(jié)果中的每個元素表示分詞結(jié)果中相應的單詞詞性,命名實體識別結(jié)果中的每個元素為一個三元組,分別表示實體類型、單詞開始編號和單詞結(jié)束編號。
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ū)',?'開展',?'特別',?'軍事',?'行動',?'。']]2.4 詞性標注集
LTP 使用的是 863 詞性標注集,其各個詞性含義如下表。
| a | adjective | 美麗 | ni | organization name | 保險公司 |
| b | other noun-modifier | 大型, 西式 | nl | location noun | 城郊 |
| c | conjunction | 和, 雖然 | ns | geographical name | 北京 |
| d | adverb | 很 | nt | temporal noun | 近日, 明代 |
| e | exclamation | 哎 | nz | other proper noun | 諾貝爾獎 |
| g | morpheme | 茨, 甥 | o | onomatopoeia | 嘩啦 |
| h | prefix | 阿, 偽 | p | preposition | 在, 把 |
| i | idiom | 百花齊放 | q | quantity | 個 |
| j | abbreviation | 公檢法 | r | pronoun | 我們 |
| k | suffix | 界, 率 | u | auxiliary | 的, 地 |
| m | number | 一, 第一 | v | verb | 跑, 學習 |
| n | general noun | 蘋果 | wp | punctuation | ,。! |
| nd | direction noun | 右側(cè) | ws | foreign words | CPU |
| nh | person name | 杜甫, 湯姆 | x | non-lexeme | 萄, 翱 |
| z | descriptive words | 瑟瑟,匆匆 |
LTP 中的 NER 模塊識別三種命名實體,分別如下:
| Nh | 人名 |
| Ni | 機構(gòu)名 |
| Ns | 地名 |
2.5 模型算法
默認加載的 small 模型各個模塊使用的算法如下,詳細介紹可參考原論文。
分詞:Electra Small + Linear
詞性:Electra Small + Linear
命名實體:Electra Small + Adapted Transformer + Linear
依存句法:Electra Small + BiAffine + Eisner
語義依存:Electra Small + BiAffine
語義角色:Electra Small + BiAffine + CRF
3. fastHan
3.1 模型結(jié)構(gòu)
如上展示了 fastHan 的基本模型結(jié)構(gòu),其采用基于 BERT 的聯(lián)合模型在 13 個語料庫上進行多任務學習,可以處理中文分詞、詞性標注、命名實體識別和依存句法分析四項基本任務。
fastHan 有 base 和 large 兩個版本,large 模型使用 BERT 的前 8 層,base 模型使用 Theseus 策略將 large 模型的 8 層壓縮至 4 層。base 版本在總參數(shù)量 150MB 的情況下在各項任務上均有不錯表現(xiàn),large 版本則接近甚至超越 SOTA 模型。
3.2 demo
使用 pip 安裝 fastHan:
pip?install?fastHan快速使用:
from?fastHan?import?FastHan model?=?FastHan() #?默認加載base模型 #?使用large模型如下 #?model?=?FastHan(model_type="large") model.set_device(0) sent_list?=?['俄羅斯總統(tǒng)普京決定在頓巴斯地區(qū)開展特別軍事行動。']#?中文分詞 seg?=?model(sent_list) #?詞性標注 pos?=?model(sent_list,?target="POS") #?命名實體識別 ner?=?model(sent_list,?target="NER",?return_loc=True) #?依存句法分析 dep?=?model(sent_list,?target="Parsing")分析結(jié)果:
seg: [['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開展',?'特別',?'軍事',?'行動',?'。']]pos: [[['俄羅斯',?'NR'],?['總統(tǒng)',?'NN'],?['普京',?'NR'],?['決定',?'VV'],?['在',?'P'],?['頓巴斯',?'NR'],?['地區(qū)',?'NN'],?['開展',?'VV'],?['特別',?'JJ'],?['軍事',?'NN'],?['行動',?'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'],?['開展',?4,?'ccomp',?'VV'],?['特別',?11,?'amod',?'JJ'],?['軍事',?11,?'nn',?'NN'],?['行動',?8,?'dobj',?'NN'],?['。',?4,?'punct',?'PU']]]當設置 return_loc=True 時,結(jié)果會返回單詞的第一個字符在原始輸入句子中的位置。
3.3 詞典分詞
fastHan 允許用戶使用 add_user_dict 函數(shù)添加自定義詞典,該詞典會影響模型在分詞任務中的權(quán)重分配。進行分詞任務時,首先利用詞典和正向、反向最大匹配法進行分詞,并將詞典方法的分詞結(jié)果乘上權(quán)重系數(shù)融入到深度學習模型的結(jié)果中。add_user_dict 函數(shù)的參數(shù)可以是由單詞組成的列表,也可以是文件路徑(文件中的內(nèi)容是由 '\n' 分隔開的詞)。
用戶可使用 set_user_dict_weight 函數(shù)設置自定義詞典中的單詞權(quán)重系數(shù)(若不設置,默認為 0.05)。
model.add_user_dict(["俄羅斯總統(tǒng)",?"頓巴斯地區(qū)"]) #?自定義詞典中的單詞權(quán)重系數(shù)默認為0.05 model.set_user_dict_weight() seg1?=?model(sent_list,?use_dict=True) #?自定義詞典中的單詞權(quán)重系數(shù)設置為1.0 model.set_user_dict_weight(1.0) seg2?=?model(sent_list,?use_dict=True)seg1: [['俄羅斯',?'總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯',?'地區(qū)',?'開展',?'特別',?'軍事',?'行動',?'。']]seg2: [['俄羅斯總統(tǒng)',?'普京',?'決定',?'在',?'頓巴斯地區(qū)',?'開展',?'特別',?'軍事',?'行動',?'。']]3.4 微調(diào)模型
用戶可以使用 finetune 函數(shù)在新的數(shù)據(jù)集上進行微調(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ù)據(jù)按格式放到一個文件里。對于中文分詞任務,要求每行一條句子,每個詞用空格分隔開:
上海?浦東?開發(fā)?與?法制?建設?同步 俄羅斯總統(tǒng)?普京?決定?在?頓巴斯地區(qū)?開展?特別?軍事?行動?。對于命名實體識別任務,要求使用 B-M-E-S-O 標注的 NT/NS/NR 輸入格式:
札?B-NS 幌?E-NS 雪?O 國?O 廟?O 會?O 。O主?O 道?O 上?O 的?O 雪?O...對于詞性標注和依存句法解析任務,要求按照 CTB9 的格式與標簽集。
3.5 詞性標注集
fastHan 使用 CTB 詞性標注集,其各個詞性含義如下表。
| AD | adverbs | 副詞 | M | Measure word(including classifiers) | 量詞,例子:“個” |
| AS | Aspect marker | 體態(tài)詞,體標記(例如:了,在,著,過) | MSP | Some particles | 例子:“所” |
| BA | 把 in ba-const | “把”、“將”的詞性標記 | NN | Common nouns | 普通名詞 |
| CC | Coordinating conjunction | 并列連詞,“和” | NR | Proper nouns | 專有名詞 |
| CD | Cardinal numbers | 數(shù)字,“一百” | NT | Temporal nouns | 時序詞,表示時間的名詞 |
| CS | Subordinating conj | 從屬連詞(例子:若,如果,如…) | OD | Ordinal numbers | 序數(shù)詞,“第一” |
| DEC | 的 for relative-clause etc | “的”詞性標記 | 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 | 標點 |
| 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 | 表語形容詞,“紅” |
| IJ | interjetion | 感嘆詞 | VC | Copula | 系動詞,“是” |
| JJ | Noun-modifier other than nouns | VE | 有 as the main verb | “有” | |
| LB | in long bei-construction | 例子:被,給 | VV | Other verbs | 其他動詞 |
| LC | Localizer | 定位詞,例子:“里” |
fastHan 中的 NER 模塊識別三種命名實體,分別如下:
| NR | 人名 |
| NT | 機構(gòu)名 |
| NS | 地名 |
4. 速度對比實驗
筆者在 GPU 上(torch1.7 + cuda10.2 + cudnn7.6.5)對比了 ltp 和 fastHan 的處理速度。從中文維基百科中抽取了 10098 條長度為 128 左右的句子,分別使用 ltp-tiny、ltp-small、ltp-base 和 fastHan-base、fastHan-large 模型進行處理,batch size 設置為 64,統(tǒng)計不同任務的處理速度如下表所示:
| 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)非常不錯,對處理速度要求高的場景建議使用 ltp 默認的 small 模型。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【NLP】基于预训练的中文NLP工具介绍:ltp 和 fastHan的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库更改文档_更改MySQL
- 下一篇: 如何看待今年考研分数线大涨