基于百度開源項(xiàng)目LAC實(shí)現(xiàn)文本分詞、詞性標(biāo)注和命名實(shí)體識(shí)別

文本分詞、詞性標(biāo)注和命名實(shí)體識(shí)別都是自然語言處理領(lǐng)域里面很基礎(chǔ)的任務(wù),他們的精度決定了下游任務(wù)的精度,今天在查資料的時(shí)候無意間發(fā)現(xiàn)了一個(gè)很好玩的開源項(xiàng)目,具體查了一下才知道這是百度開源的一個(gè)主要用于詞性標(biāo)注和命名實(shí)體識(shí)別的項(xiàng)目,決定拿來嘗試一下。
首先是項(xiàng)目環(huán)境的配置安裝,當(dāng)前已經(jīng)支持一鍵式安裝了,具體命令如下所示:
python?-m?pip?install?LAC
簡(jiǎn)單進(jìn)行一下安裝驗(yàn)證,成功截圖如下所示:

接下來就可以進(jìn)行使用了,官方GitHub地址在這里https://github.com/baidu/lac。官方給出來的一些講解如下所示:
工具介紹
LAC全稱Lexical Analysis of Chinese,是百度自然語言處理部研發(fā)的一款聯(lián)合的詞法分析工具,實(shí)現(xiàn)中文分詞、詞性標(biāo)注、專名識(shí)別等功能。該工具具有以下特點(diǎn)與優(yōu)勢(shì):
效果好:通過深度學(xué)習(xí)模型聯(lián)合學(xué)習(xí)分詞、詞性標(biāo)注、專名識(shí)別任務(wù),整體效果F1值超過0.91,詞性標(biāo)注F1值超過0.94,專名識(shí)別F1值超過0.85,效果業(yè)內(nèi)領(lǐng)先。
效率高:精簡(jiǎn)模型參數(shù),結(jié)合Paddle預(yù)測(cè)庫(kù)的性能優(yōu)化,CPU單線程性能達(dá)800QPS,效率業(yè)內(nèi)領(lǐng)先。
可定制:實(shí)現(xiàn)簡(jiǎn)單可控的干預(yù)機(jī)制,精準(zhǔn)匹配用戶詞典對(duì)模型進(jìn)行干預(yù)。詞典支持長(zhǎng)片段形式,使得干預(yù)更為精準(zhǔn)。
調(diào)用便捷:支持一鍵安裝,同時(shí)提供了Python、Java和C++調(diào)用接口與調(diào)用示例,實(shí)現(xiàn)快速調(diào)用和集成。
支持移動(dòng)端: 定制超輕量級(jí)模型,體積僅為2M,主流千元手機(jī)單線程性能達(dá)200QPS,滿足大多數(shù)移動(dòng)端應(yīng)用的需求,同等體積量級(jí)效果業(yè)內(nèi)領(lǐng)先。
安裝與使用
在此我們主要介紹Python安裝與使用,其他語言使用:
C++
JAVA
Android
安裝說明
代碼兼容Python2/3
全自動(dòng)安裝: pip install lac
半自動(dòng)下載:先下載http://pypi.python.org/pypi/lac/,解壓后運(yùn)行python setup.py install
安裝完成后可在命令行輸入lac或lac --segonly啟動(dòng)服務(wù),進(jìn)行快速體驗(yàn)
國(guó)內(nèi)網(wǎng)絡(luò)可使用百度源安裝,安裝速率更快:pip install lac -i https://mirror.baidu.com/pypi/simple
功能與使用
分詞
代碼示例:
from?LAC?import?LAC
?
#?裝載分詞模型
lac?=?LAC(mode='seg')
?
#?單個(gè)樣本輸入,輸入為Unicode編碼的字符串
text?=?u"LAC是個(gè)優(yōu)秀的分詞工具"
seg_result?=?lac.run(text)
?
#?批量樣本輸入,?輸入為多個(gè)句子組成的list,平均速率會(huì)更快
texts?=?[u"LAC是個(gè)優(yōu)秀的分詞工具",?u"百度是一家高科技公司"]
seg_result?=?lac.run(texts)
輸出:
【單樣本】:seg_result = [LAC, 是, 個(gè), 優(yōu)秀, 的, 分詞, 工具]
【批量樣本】:seg_result = [[LAC, 是, 個(gè), 優(yōu)秀, 的, 分詞, 工具], [百度, 是, 一家, 高科技, 公司]]
詞性標(biāo)注與實(shí)體識(shí)別
代碼示例:
from?LAC?import?LAC
?
#?裝載LAC模型
lac?=?LAC(mode='lac')
?
#?單個(gè)樣本輸入,輸入為Unicode編碼的字符串
text?=?u"LAC是個(gè)優(yōu)秀的分詞工具"
lac_result?=?lac.run(text)
?
#?批量樣本輸入,?輸入為多個(gè)句子組成的list,平均速率更快
texts?=?[u"LAC是個(gè)優(yōu)秀的分詞工具",?u"百度是一家高科技公司"]
lac_result?=?lac.run(texts)
輸出:
每個(gè)句子的輸出其切詞結(jié)果word_list以及對(duì)每個(gè)單詞的標(biāo)注tags_list,其格式為(word_list, tags_list)
【單樣本】:lac_result =?([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n])
【批量樣本】:lac_result =?[
????????????????????([百度,?是,?一家,?高科技,?公司],?[ORG,?v,?m,?n,?n]),
????????????????????([LAC,?是,?個(gè),?優(yōu)秀,?的,?分詞,?工具],?[nz,?v,?q,?a,?u,?n,?n])
????????????????]
詞性和專名類別標(biāo)簽集合如下表,其中我們將最常用的4個(gè)專名類別標(biāo)記為大寫的形式:
標(biāo)簽?含義?標(biāo)簽?含義?標(biāo)簽?含義?標(biāo)簽?含義
n?普通名詞?f?方位名詞?s?處所名詞?nw?作品名
nz?其他專名?v?普通動(dòng)詞?vd?動(dòng)副詞?vn?名動(dòng)詞
a?形容詞?ad?副形詞?an?名形詞?d?副詞
m?數(shù)量詞?q?量詞?r?代詞?p?介詞
c?連詞?u?助詞?xc?其他虛詞?w?標(biāo)點(diǎn)符號(hào)
PER?人名?LOC?地名?ORG?機(jī)構(gòu)名?TIME?時(shí)間
定制化功能
在模型輸出的基礎(chǔ)上,LAC還支持用戶配置定制化的切分結(jié)果和專名類型輸出。當(dāng)模型預(yù)測(cè)匹配到詞典的中的item時(shí),會(huì)用定制化的結(jié)果替代原有結(jié)果。為了實(shí)現(xiàn)更加精確的匹配,我們支持以由多個(gè)單詞組成的長(zhǎng)片段作為一個(gè)item。
我們通過裝載詞典文件的形式實(shí)現(xiàn)該功能,詞典文件每行表示一個(gè)定制化的item,由一個(gè)單詞或多個(gè)連續(xù)的單詞組成,每個(gè)單詞后使用'/'表示標(biāo)簽,如果沒有'/'標(biāo)簽則會(huì)使用模型默認(rèn)的標(biāo)簽。每個(gè)item單詞數(shù)越多,干預(yù)效果會(huì)越精準(zhǔn)。
詞典文件示例
這里僅作為示例,展現(xiàn)各種需求情況下的結(jié)果。后續(xù)還將開放以通配符配置詞典的模式,敬請(qǐng)期待。
春天/SEASON
花/n?開/v
秋天的風(fēng)
落?陽
代碼示例
from?LAC?import?LAC
lac?=?LAC()
?
#?裝載干預(yù)詞典
lac.load_customization('custom.txt')
?
#?干預(yù)后結(jié)果
custom_result?=?lac.run(u"春天的花開秋天的風(fēng)以及冬天的落陽")
以輸入“春天的花開秋天的風(fēng)以及冬天的落陽”為例,原本輸出結(jié)果為:
春天/TIME?的/u?花開/v?秋天/TIME?的/u?風(fēng)/n?以及/c?冬天/TIME?的/u?落陽/n
添加示例中的詞典文件后的結(jié)果為:
春天/SEASON?的/u?花/n?開/v?秋天的風(fēng)/n?以及/c?冬天/TIME?的/u?落/n?陽/n
增量訓(xùn)練
我們也提供了增量訓(xùn)練的接口,用戶可以使用自己的數(shù)據(jù),進(jìn)行增量訓(xùn)練,首先需要將數(shù)據(jù)轉(zhuǎn)換為模型輸入的格式,并且所有數(shù)據(jù)文件均為"UTF-8"編碼:
分詞訓(xùn)練
數(shù)據(jù)樣例
與大多數(shù)開源分詞數(shù)據(jù)集格式一致,使用空格作為單詞切分標(biāo)記,如下所示:
LAC 是?個(gè)?優(yōu)秀?的?分詞?工具?。
百度?是?一家?高科技?公司?。
春天?的?花開?秋天?的?風(fēng)?以及?冬天?的?落陽?。
代碼示例
from?LAC?import?LAC
?
#?選擇使用分詞模型
lac?=?LAC(mode?=?'seg')
?
#?訓(xùn)練和測(cè)試數(shù)據(jù)集,格式一致
train_file?=?"./data/seg_train.tsv"
test_file?=?"./data/seg_test.tsv"
lac.train(model_save_dir='./my_seg_model/',train_data=train_file,?test_data=test_file)
?
#?使用自己訓(xùn)練好的模型
my_lac?=?LAC(model_path='my_seg_model')
詞法分析訓(xùn)練
樣例數(shù)據(jù)
在分詞數(shù)據(jù)的基礎(chǔ)上,每個(gè)單詞以“/type”的形式標(biāo)記其詞性或?qū)嶓w類別。值得注意的是,詞法分析的訓(xùn)練目前僅支持標(biāo)簽體系與我們一致的數(shù)據(jù)。后續(xù)也會(huì)開放支持新的標(biāo)簽體系,敬請(qǐng)期待。
LAC/nz 是/v 個(gè)/q 優(yōu)秀/a 的/u 分詞/n 工具/n 。/w
百度/ORG 是/v 一家/m 高科技/n 公司/n 。/w
春天/TIME 的/u 花開/v 秋天/TIME 的/u 風(fēng)/n 以及/c 冬天/TIME 的/u 落陽/n 。/w
代碼示例
from?LAC?import?LAC
?
#?選擇使用默認(rèn)的詞法分析模型
lac?=?LAC()
?
#?訓(xùn)練和測(cè)試數(shù)據(jù)集,格式一致
train_file?=?"./data/lac_train.tsv"
test_file?=?"./data/lac_test.tsv"
lac.train(model_save_dir='./my_lac_model/',train_data=train_file,?test_data=test_file)
?
#?使用自己訓(xùn)練好的模型
my_lac?=?LAC(model_path='my_lac_model')
接下來,我們基于自己的數(shù)據(jù)集來編寫一些有意思的功能,其實(shí)在做命名實(shí)體識(shí)別的時(shí)候我突然想到,這個(gè)模塊可以代替人工自動(dòng)生成有標(biāo)注的數(shù)據(jù)集用于NER模型的訓(xùn)練,當(dāng)然了這里自動(dòng)生成的數(shù)據(jù)集可能是不準(zhǔn)確的,大致是準(zhǔn)確的,主要是想節(jié)省人工標(biāo)注的成本。
首先是加載本地?cái)?shù)據(jù)集,代碼實(shí)現(xiàn)如下所示:
def?loadData(data='toutiao_news_dataset.txt'):
????'''
????加載本地?cái)?shù)據(jù)集
????'''
????with?open(data,encoding='utf-8')?as?f:
????????data_list=[one.strip().split('#')?for?one?in?f.readlines()?if?one.strip()]
????print('data_list_length:?',len(data_list))
????for?i?in?range(10):
????????print('index:?'+str(i)+',?content:?'+data_list[i][-1])
????return?data_list
數(shù)據(jù)集樣例數(shù)據(jù)如下所示:
房產(chǎn)#。。。。。。。。。。。。。。。。。。。。。
房產(chǎn)#。。。。。。。。。。。。。。。。。。。。。
房產(chǎn)#。。。。。。。。。。。。。。。。。。。。。
汽車#。。。。。。。。。。。。。。。。。。。。。
汽車#。。。。。。。。。。。。。。。。。。。。。
汽車#。。。。。。。。。。。。。。。。。。。。。
由于官方審核限制,這里的數(shù)據(jù)集內(nèi)容替換成了省略號(hào)。
接下來我們隨機(jī)挑選數(shù)據(jù)集進(jìn)行命名實(shí)體識(shí)別,代碼實(shí)現(xiàn)如下所示:
def?NERModel(data_list):
????'''
????詞性標(biāo)注與命名實(shí)體識(shí)別
????結(jié)果實(shí)例:
?????????????[['京城',?'最',?'值得',?'你',?'來',?'場(chǎng)',?'文化',?'之',?'旅',?'的',?'博物館'],?['nz',?'d',?'v',?'r',?'v',?'q',?'n',?'u',?'n',?'u',?'n']]
????'''
????lac?=?LAC(mode='lac')
????texts?=?[one[-1]?for?one?in?data_list]
????lac_result?=?lac.run(texts)
????for?i?in?range(10):
????????print('index:?',str(i),',?lac_result:?',lac_result[i])
????????words,?tags?=?lac_result[i]
????????print(u"?".join(u"%s/%s"?%?(word,?tag)?for?word,?tag?in?zip(words,?tags)))
????????print('====================================================================')
結(jié)果如下所示:
data_list_length:??382688
index:?0,?content:?京城最值得你來場(chǎng)文化之旅的博物館
index: 1, content:?發(fā)酵床的墊料種類有哪些?哪種更好?
index: 2, content:?上聯(lián):黃山黃河黃皮膚黃土高原。怎么對(duì)下聯(lián)?
index: 3, content:?林徽因什么理由拒絕了徐志摩而選擇梁思成為終身伴侶?
index: 4, content:?黃楊木是什么樹?
index: 5, content:?上聯(lián):草根登上星光道,怎么對(duì)下聯(lián)?
index: 6, content:?什么是超寫實(shí)繪畫?
index: 7, content:?松濤聽雨鶯婉轉(zhuǎn),下聯(lián)?
index: 8, content:?上聯(lián):老子騎牛讀書,下聯(lián)怎么對(duì)?
index: 9, content:?上聯(lián):山水醉人何須酒。如何對(duì)下聯(lián)?
index:??0?,?lac_result:??[['京城',?'最',?'值得',?'你',?'來',?'場(chǎng)',?'文化',?'之',
?'旅',?'的',?'博物館'],?['nz',?'d',?'v',?'r',?'v',?'q',?'n',?'u',?'n',?'u',?'n']
]
京城/nz?最/d?值得/v?你/r?來/v?場(chǎng)/q?文化/n?之/u?旅/n?的/u?博物館/n
====================================================================
index:??1?,?lac_result:??[['發(fā)酵床',?'的',?'墊料',?'種類',?'有',?'哪些',?'?',?'
哪',?'種',?'更好',?'?'],?['nz',?'u',?'n',?'n',?'v',?'r',?'w',?'r',?'q',?'a',?'w
']]
發(fā)酵床/nz 的/u 墊料/n 種類/n 有/v 哪些/r ?/w 哪/r 種/q 更好/a ?/w
====================================================================
index:??2?,?lac_result:??[['上聯(lián)',?':',?'黃山',?'黃河',?'黃',?'皮膚',?'黃土高原
',?'。',?'怎么',?'對(duì)',?'下聯(lián)',?'?'],?['n',?'w',?'LOC',?'LOC',?'a',?'n',?'LOC',
'w',?'r',?'p',?'n',?'w']]
上聯(lián)/n :/w 黃山/LOC 黃河/LOC 黃/a 皮膚/n 黃土高原/LOC 。/w 怎么/r 對(duì)/p 下聯(lián)/n
?/w
====================================================================
index:??3?,?lac_result:??[['林徽因',?'什么',?'理由',?'拒絕',?'了',?'徐志摩',?'而
',?'選擇',?'梁思',?'成為',?'終身伴侶',?'?'],?['PER',?'r',?'n',?'v',?'u',?'PER',
?'c',?'v',?'PER',?'v',?'n',?'w']]
林徽因/PER?什么/r?理由/n?拒絕/v?了/u?徐志摩/PER?而/c?選擇/v?梁思/PER?成為/v?終身
伴侶/n ?/w
====================================================================
index:??4?,?lac_result:??[['黃楊木',?'是',?'什么',?'樹',?'?'],?['n',?'v',?'r',
'n',?'w']]
黃楊木/n 是/v 什么/r 樹/n ?/w
====================================================================
index:??5?,?lac_result:??[['上聯(lián)',?':',?'草根',?'登上',?'星光',?'道',?',',?'怎
么',?'對(duì)',?'下聯(lián)',?'?'],?['n',?'w',?'n',?'v',?'n',?'v',?'w',?'r',?'p',?'n',?'w'
]]
上聯(lián)/n :/w 草根/n 登上/v 星光/n 道/v ,/w 怎么/r 對(duì)/p 下聯(lián)/n ?/w
====================================================================
index:??6?,?lac_result:??[['什么',?'是',?'超',?'寫實(shí)',?'繪畫',?'?'],?['r',?'v',
?'vd',?'v',?'n',?'w']]
什么/r 是/v 超/vd 寫實(shí)/v 繪畫/n ?/w
====================================================================
index:??7?,?lac_result:??[['松濤聽雨鶯',?'婉轉(zhuǎn)',?',',?'下聯(lián)',?'?'],?['nz',?'a'
,?'w',?'n',?'w']]
松濤聽雨鶯/nz 婉轉(zhuǎn)/a ,/w 下聯(lián)/n ?/w
====================================================================
index:??8?,?lac_result:??[['上聯(lián)',?':',?'老子',?'騎',?'牛',?'讀書',?',',?'下聯(lián)
',?'怎么',?'對(duì)',?'?'],?['n',?'w',?'n',?'v',?'n',?'v',?'w',?'n',?'r',?'p',?'w']]
?
上聯(lián)/n :/w 老子/n 騎/v 牛/n 讀書/v ,/w 下聯(lián)/n 怎么/r 對(duì)/p ?/w
====================================================================
index:??9?,?lac_result:??[['上聯(lián)',?':',?'山水醉人',?'何須',?'酒',?'。',?'如何',
?'對(duì)',?'下聯(lián)',?'?'],?['n',?'w',?'n',?'v',?'n',?'w',?'r',?'p',?'n',?'w']]
上聯(lián)/n :/w 山水醉人/n 何須/v 酒/n 。/w 如何/r 對(duì)/p 下聯(lián)/n ?/w
====================================================================
這里我們發(fā)現(xiàn)了一處很明顯的錯(cuò)誤:

梁思成,我們都知道是一個(gè)人名,這里被拆分開了,也就是識(shí)別錯(cuò)誤了,我們可以自定義實(shí)體字典來解決這二個(gè)問題,代碼實(shí)現(xiàn)如下所示:
def?NERModel(data_list):
????'''
????詞性標(biāo)注與命名實(shí)體識(shí)別
????結(jié)果實(shí)例:
?????????????[['京城',?'最',?'值得',?'你',?'來',?'場(chǎng)',?'文化',?'之',?'旅',?'的',?'博物館'],?['nz',?'d',?'v',?'r',?'v',?'q',?'n',?'u',?'n',?'u',?'n']]
????'''
????lac?=?LAC(mode='lac')
????lac.load_customization('mydict.txt')
????texts?=?[one[-1]?for?one?in?data_list]
????lac_result?=?lac.run(texts)
????for?i?in?range(10):
????????print('index:?',str(i),',?lac_result:?',lac_result[i])
????????words,?tags?=?lac_result[i]
????????print(u"?".join(u"%s/%s"?%?(word,?tag)?for?word,?tag?in?zip(words,?tags)))
????????print('====================================================================')
這里mydict.txt內(nèi)容如下所示:

接下來我們?cè)賮砜聪聢?zhí)行結(jié)果:

可以看到:梁思成這個(gè)名字已經(jīng)正確識(shí)別出來了。
接下來我們實(shí)踐一下分詞功能,代碼實(shí)現(xiàn)如下所示:
def?cutModel(data_list):
????'''
????分詞
????結(jié)果實(shí)例:
????????????['京城',?'最',?'值得',?'你',?'來',?'場(chǎng)',?'文化',?'之','旅',?'的',?'博物館']
????'''
????lac?=?LAC(mode?=?'seg')
????texts?=?[one[-1]?for?one?in?data_list]
????lac_result?=?lac.run(texts)
????for?i?in?range(10):
????????print('index:?',str(i),',?lac_result:?',lac_result[i])
測(cè)試結(jié)果輸出如下所示:

整體來說,安裝配置和使用實(shí)踐都很簡(jiǎn)單,后面會(huì)結(jié)合命名實(shí)體識(shí)別任務(wù)來構(gòu)建自動(dòng)數(shù)據(jù)集。
作者:沂水寒城,CSDN博客專家,個(gè)人研究方向:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、NLP、CV
Blog:?http://yishuihancheng.blog.csdn.net
贊 賞 作 者

Python中文社區(qū)作為一個(gè)去中心化的全球技術(shù)社區(qū),以成為全球20萬Python中文開發(fā)者的精神部落為愿景,目前覆蓋各大主流媒體和協(xié)作平臺(tái),與阿里、騰訊、百度、微軟、亞馬遜、開源中國(guó)、CSDN等業(yè)界知名公司和技術(shù)社區(qū)建立了廣泛的聯(lián)系,擁有來自十多個(gè)國(guó)家和地區(qū)數(shù)萬名登記會(huì)員,會(huì)員來自以工信部、清華大學(xué)、北京大學(xué)、北京郵電大學(xué)、中國(guó)人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機(jī)關(guān)、科研單位、金融機(jī)構(gòu)以及海內(nèi)外知名公司,全平臺(tái)近20萬開發(fā)者關(guān)注。
▼點(diǎn)擊成為社區(qū)會(huì)員? ?喜歡就點(diǎn)個(gè)在看吧

