【導(dǎo)語(yǔ)】此文是作者基于 Python 構(gòu)建知識(shí)圖譜的系列實(shí)踐教程,具有一定創(chuàng)新性和實(shí)用性。文章前半部分內(nèi)容先介紹哈工大 pytltp 工具,包括安裝過(guò)程、中文分詞、詞性標(biāo)注和實(shí)體識(shí)別的一些基本用法;后半部分內(nèi)容講解詞性標(biāo)注、實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注及代碼實(shí)現(xiàn)。
【上篇】
一、哈工大LTP
LTP(Language Technology Platform)中文為語(yǔ)言技術(shù)平臺(tái),是哈工大社會(huì)計(jì)算與信息檢索研究中心開(kāi)發(fā)的一整套中文語(yǔ)言處理系統(tǒng)。LTP制定了基于XML的語(yǔ)言處理結(jié)果表示,并在此基礎(chǔ)上提供了一整套自底向上的豐富而且高效的中文語(yǔ)言處理模塊(包括詞法、句法、語(yǔ)義等6項(xiàng)中文處理核心技術(shù)),以及基于動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library,DLL)的應(yīng)用程序接口,可視化工具,并且能夠以網(wǎng)絡(luò)服務(wù)的形式進(jìn)行使用。
LTP開(kāi)發(fā)文檔:
https://ltp.readthedocs.io/zh_CN/latest/index.html
語(yǔ)言云LTP-Cloud:
http://www.ltp-cloud.com/
模型下載地址:
http://ltp.ai/download.html
在線演示案例如下圖所示:
相信從事NLP、數(shù)據(jù)挖掘、知識(shí)圖譜等領(lǐng)域的博友都知道哈工大LTP、同義詞詞林這些工具,該系列文章也會(huì)介紹相關(guān)的知識(shí),希望對(duì)您有所幫助。
此外,再補(bǔ)充另一個(gè)在線NLP分析系統(tǒng),感興趣的朋友們也可以試一下~
http://ictclas.nlpir.org/nlpir/
二.pyltp 終極安裝
下面介紹 Windows10 Python 環(huán)境下 LTP 的擴(kuò)展包 pyltp 安裝過(guò)程。
1.常見(jiàn)錯(cuò)誤
大家通常會(huì)調(diào)用 “pip install pyltp” 安裝該擴(kuò)展包,但會(huì)遇到各種錯(cuò)誤,下面介紹一種可行的方法。
2.安裝pyltp包
首先,安裝Python3.6環(huán)境,如下圖所示“python-3.6.7-amd64.exe”。
接著,下載pyltp擴(kuò)展包的whl文件至本地,調(diào)用CMD環(huán)境進(jìn)行安裝,注意需要將所在文件的路徑寫(xiě)清楚。
pyltp-0.2.1-cp35-cp35m-win_amd64.whl (對(duì)應(yīng)Python3.5版本)pyltp-0.2.1-cp36-cp36m-win_amd64.whl (對(duì)應(yīng)Python3.6版本)pip install C:Python36Scriptspyltp-0.2.1-cp36-cp36m-win_amd64.whl
whl下載地址:
https://download.csdn.net/download/qq_22521211/10460778
安裝過(guò)程下圖所示,此時(shí)表示pyltp安裝成功。
注意,如果報(bào)錯(cuò)“error:Microsoft Visual C++ 9.0 is required”,則安裝下面exe文件。
3.下載模型文件
最后需要下載模型文件,其下載地址為:
百度云
https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F
七牛云
http://ltp.ai/download.html
本文下載3.4版本的模型,下載解壓如下圖所示:
模型對(duì)應(yīng)的說(shuō)明如下圖所示:
在編寫(xiě)代碼時(shí),需要導(dǎo)入指定文件夾中的模型,再進(jìn)行中文分詞、詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析、語(yǔ)義角色標(biāo)注等分析。例如:
#詞性標(biāo)注pdir='AgriKG\ltp\pos.model'pos = Postagger()pos.load(pdir)postags = pos.postag(word) #基于分詞得到的list將下詞性標(biāo)注postags = list(postags)print(u"詞性:", postags)
分詞、詞性標(biāo)注、句法分析一系列任務(wù)之間存在依賴(lài)關(guān)系。舉例來(lái)講,對(duì)于詞性標(biāo)注,必須在分詞結(jié)果之上進(jìn)行才有意義。LTP中提供的5種分析之間的依賴(lài)關(guān)系如下所示:
講到這里,哈工大pyltp基本安裝成功,接下來(lái)將介紹它的基本用法。
基礎(chǔ)性文章,希望對(duì)入門(mén)者有所幫助。
三.中文分句和分詞
官方文檔:
https://pyltp.readthedocs.io/zh_CN/latest/api.html#id13
實(shí)現(xiàn)原理:
https://ltp.readthedocs.io/zh_CN/latest/theory.html#customized-cws-reference-label
1.中文分句
#-*-coding:utf-8-*-frompyltpimportSentenceSplitterfrompyltpimportSegmentorfrompyltpimportPostaggerfrom pyltp import NamedEntityRecognizer#分句text="貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?那讓歐幾里得去問(wèn)問(wèn)看吧!其實(shí)是在貴陽(yáng)花溪區(qū)吧。"sents=SentenceSplitter.split(text)print(' '.join(sents))
中文分句的輸出結(jié)果如下所示:
貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?那讓歐幾里得去問(wèn)問(wèn)看吧!其實(shí)是在貴陽(yáng)花溪區(qū)吧。
2.中文分詞
# -*- coding: utf-8 -*-from pyltp import SentenceSplitterfrom pyltp import Segmentorfrom pyltp import Postaggerfrom pyltp import NamedEntityRecognizertext = "貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?那讓歐幾里得去問(wèn)問(wèn)看吧!其實(shí)是在貴陽(yáng)花溪區(qū)吧。"#中文分詞segmentor = Segmentor() #初始化實(shí)例segmentor.load("AgriKG\ltp\cws.model") #加載模型words = segmentor.segment(text) #分詞print(type(words))print(' '.join(words))segmentor.release()#釋放模型
輸出結(jié)果如下所示(人工換行):
此時(shí)的分詞效果并不理想,如 “大數(shù)據(jù)” 分為了“大”、“數(shù)據(jù)”,“歐幾里得”分為了“歐”、“幾”、“里”、“得”,“貴陽(yáng)花溪區(qū)”分為了“貴陽(yáng)”、“花溪區(qū)”等,故需要引入詞典進(jìn)行更為準(zhǔn)確的分詞。同時(shí),返回值類(lèi)型是native的VectorOfString類(lèi)型,可以使用list轉(zhuǎn)換成Python的列表類(lèi)型。
3.導(dǎo)入詞典中文分詞
pyltp 分詞支持用戶(hù)使用自定義詞典。分詞外部詞典本身是一個(gè)文本文件(plain text),每行指定一個(gè)詞,編碼同樣須為 UTF-8,比如“word”文件,如下圖所示:
完整代碼如下所示:
# -*- coding: utf-8 -*-from pyltp import SentenceSplitterfrom pyltp import Segmentorfrom pyltp import Postaggerfrom pyltp import NamedEntityRecognizerldir='AgriKG\ltp\cws.model' #分詞模型dicdir='word' #外部字典text = "貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?那讓歐幾里得去問(wèn)問(wèn)看吧!其實(shí)是在貴陽(yáng)花溪區(qū)吧。"#中文分詞segmentor = Segmentor() #初始化實(shí)例segmentor.load_with_lexicon(ldir, 'word') #加載模型words = segmentor.segment(text) #分詞print(' '.join(words)) #分詞拼接words = list(words) #轉(zhuǎn)換listprint(u"分詞:", words)segmentor.release()#釋放模型
輸出結(jié)果如下所示,它將“大數(shù)據(jù)”、“歐幾里得”、“貴陽(yáng)花溪區(qū)”進(jìn)行了詞典匹配,再進(jìn)行相關(guān)分詞,但是“貴州財(cái)經(jīng)大學(xué)”仍然劃分為“貴州”、“財(cái)經(jīng)”、“大學(xué)”。Why?
貴州 財(cái)經(jīng) 大學(xué) 要 舉辦 大數(shù)據(jù) 比賽 嗎 ? 那 讓 歐幾里得 去 問(wèn)問(wèn) 看 吧 ! 其實(shí) 是 在 貴陽(yáng)花溪區(qū) 吧 。分詞: ['貴州', '財(cái)經(jīng)', '大學(xué)', '要', '舉辦', '大數(shù)據(jù)', '比賽', '嗎', '?', '那', '讓', '歐幾里得', '去', '問(wèn)問(wèn)', '看', '吧', '!', '其實(shí)','是','在','貴陽(yáng)花溪區(qū)','吧','。']
4.個(gè)性化分詞
個(gè)性化分詞是 LTP 的特色功能。個(gè)性化分詞為了解決測(cè)試數(shù)據(jù)切換到如小說(shuō)、財(cái)經(jīng)等不同于新聞?lì)I(lǐng)域的領(lǐng)域。在切換到新領(lǐng)域時(shí),用戶(hù)只需要標(biāo)注少量數(shù)據(jù)。個(gè)性化分詞會(huì)在原有新聞數(shù)據(jù)基礎(chǔ)之上進(jìn)行增量訓(xùn)練。從而達(dá)到即利用新聞?lì)I(lǐng)域的豐富數(shù)據(jù),又兼顧目標(biāo)領(lǐng)域特殊性的目的。
pyltp 支持使用用戶(hù)訓(xùn)練好的個(gè)性化模型。關(guān)于個(gè)性化模型的訓(xùn)練需使用 LTP,詳細(xì)介紹和訓(xùn)練方法請(qǐng)參考 個(gè)性化分詞 。在 pyltp 中使用個(gè)性化分詞模型的示例如下:
# -*- coding: utf-8 -*-from pyltp import CustomizedSegmentorcustomized_segmentor = CustomizedSegmentor() #初始化實(shí)例customized_segmentor.load('基本模型', '個(gè)性模型') #加載模型words = customized_segmentor.segment('亞硝酸鹽是一種化學(xué)物質(zhì)')print ' '.join(words)customized_segmentor.release()
【下篇】
詞性標(biāo)注、實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注及代碼實(shí)現(xiàn)
一.詞性標(biāo)注
詞性標(biāo)注(Part-Of-Speech tagging, POS tagging)也被稱(chēng)為語(yǔ)法標(biāo)注(grammatical tagging)或詞類(lèi)消疑(word-category disambiguation),是語(yǔ)料庫(kù)語(yǔ)言學(xué)(corpus linguistics)中將語(yǔ)料庫(kù)內(nèi)單詞的詞性按其含義和上下文內(nèi)容進(jìn)行標(biāo)記的文本數(shù)據(jù)處理技術(shù)。
pyltp詞性標(biāo)注與分詞模塊相同,將詞性標(biāo)注任務(wù)建模為基于詞的序列標(biāo)注問(wèn)題。對(duì)于輸入句子的詞序列,模型給句子中的每個(gè)詞標(biāo)注一個(gè)標(biāo)識(shí)詞邊界的標(biāo)記。在LTP中,采用的北大標(biāo)注集。
完整代碼:
# -*- coding: utf-8 -*-from pyltp import SentenceSplitterfrom pyltp import Segmentorfrom pyltp import Postaggerfrom pyltp import NamedEntityRecognizerldir='AgriKG\ltp\cws.model' #分詞模型dicdir='word' #外部字典text = "貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?"#中文分詞segmentor = Segmentor() #初始化實(shí)例segmentor.load_with_lexicon(ldir, 'word') #加載模型words = segmentor.segment(text) #分詞print(text)print(' '.join(words)) #分詞拼接words = list(words) #轉(zhuǎn)換listprint(u"分詞:", words)segmentor.release() #釋放模型#詞性標(biāo)注pdir='AgriKG\ltp\pos.model'pos = Postagger() #初始化實(shí)例pos.load(pdir) #加載模型postags = pos.postag(words) #詞性標(biāo)注postags = list(postags)print(u"詞性:", postags)pos.release() #釋放模型data = {"words": words, "tags": postags}print(data)
輸出結(jié)果如下圖所示,“貴州”詞性為“ns”(地理名詞 ),“財(cái)經(jīng)”詞性為“n”(一般名詞),“舉辦”詞性為“v”(動(dòng)詞),“嗎”詞性為“u”(助詞),“?”詞性為“wp”(標(biāo)點(diǎn))。
貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?貴州 財(cái)經(jīng) 大學(xué) 要 舉辦 大數(shù)據(jù) 比賽 嗎 ?分詞: ['貴州', '財(cái)經(jīng)', '大學(xué)', '要', '舉辦', '大數(shù)據(jù)', '比賽', '嗎', '?']詞性: ['ns', 'n', 'n', 'v', 'v', 'n', 'v', 'u', 'wp']{'words': ['貴州', '財(cái)經(jīng)', '大學(xué)', '要', '舉辦', '大數(shù)據(jù)', '比賽', '嗎', '?'], 'tags':['ns','n','n','v','v','n','v','u','wp']}
具體詞性為:
Tag Description Examplea adjective:形容詞 美麗 b other noun-modifier:其他的修飾名詞 大型, 西式 c conjunction:連詞 和, 雖然 d adverb:副詞 很 e exclamation:感嘆詞 哎 g morpheme 茨, 甥 h prefix:前綴 阿, 偽 i idiom:成語(yǔ) 百花齊放 j abbreviation:縮寫(xiě) 公檢法 k suffix:后綴 界, 率 m number:數(shù)字 一, 第一 n general noun:一般名詞 蘋(píng)果 nd direction noun:方向名詞 右側(cè) nh person name:人名 杜甫, 湯姆 ni organization name:公司名 保險(xiǎn)公司,中國(guó)銀行nl location noun:地點(diǎn)名詞 城郊ns geographical name:地理名詞 北京nt temporal noun:時(shí)間名詞 近日, 明代nz other proper noun:其他名詞 諾貝爾獎(jiǎng)o onomatopoeia:擬聲詞 嘩啦p preposition:介詞 在, 把,與q quantity:量詞 個(gè)r pronoun:代詞 我們u auxiliary:助詞 的, 地v verb:動(dòng)詞 跑, 學(xué)習(xí)wp punctuation:標(biāo)點(diǎn) ,。!ws foreign words:國(guó)外詞 CPUx non-lexeme:不構(gòu)成詞 萄, 翱zdescriptivewords描寫(xiě),敘述的詞瑟瑟,匆匆
二.命名實(shí)體識(shí)別
命名實(shí)體識(shí)別(Named Entity Recognition,簡(jiǎn)稱(chēng)NER),又稱(chēng)作“專(zhuān)名識(shí)別”,是指識(shí)別文本中具有特定意義的實(shí)體,主要包括人名、地名、機(jī)構(gòu)名、專(zhuān)有名詞等。命名實(shí)體識(shí)別是信息提取、問(wèn)答系統(tǒng)、句法分析、機(jī)器翻譯、面向Semantic Web的元數(shù)據(jù)標(biāo)注等應(yīng)用領(lǐng)域的重要基礎(chǔ)工具,在自然語(yǔ)言處理技術(shù)走向?qū)嵱没倪^(guò)程中占有重要地位。
在哈工大Pyltp中,NE識(shí)別模塊的標(biāo)注結(jié)果采用O-S-B-I-E標(biāo)注形式,其含義如下(參考):
LTP中的NE 模塊識(shí)別三種NE,分別為人名(Nh)、機(jī)構(gòu)名(Ni)、地名(Ns)。
完整代碼:
# -*- coding: utf-8 -*-from pyltp import SentenceSplitterfrom pyltp import Segmentorfrom pyltp import Postaggerfrom pyltp import NamedEntityRecognizerldir='AgriKG\ltp\cws.model' #分詞模型dicdir='word' #外部字典text = "貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?"#中文分詞segmentor = Segmentor() #初始化實(shí)例segmentor.load_with_lexicon(ldir, 'word') #加載模型words = segmentor.segment(text) #分詞print(text)print(' '.join(words)) #分詞拼接words = list(words) #轉(zhuǎn)換listprint(u"分詞:", words)segmentor.release() #釋放模型#詞性標(biāo)注pdir='AgriKG\ltp\pos.model'pos = Postagger() #初始化實(shí)例pos.load(pdir) #加載模型postags = pos.postag(words) #詞性標(biāo)注postags = list(postags)print(u"詞性:", postags)pos.release() #釋放模型data = {"words": words, "tags": postags}print(data)print(" ")#命名實(shí)體識(shí)別nermodel='AgriKG\ltp\ner.model'reg = NamedEntityRecognizer() #初始化命名實(shí)體實(shí)例reg.load(nermodel) #加載模型netags = reg.recognize(words, postags) #對(duì)分詞、詞性標(biāo)注得到的數(shù)據(jù)進(jìn)行實(shí)體標(biāo)識(shí)netags = list(netags)print(u"命名實(shí)體識(shí)別:", netags)#實(shí)體識(shí)別結(jié)果data={"reg": netags,"words":words,"tags":postags}print(data)reg.release()
輸出結(jié)果如下圖所示,識(shí)別出的三個(gè)命名實(shí)體分別是:“貴州”(B-Ni)表示一個(gè)NE開(kāi)始-機(jī)構(gòu)名,“財(cái)經(jīng)”(I-Ni)表示一個(gè)NE中間-機(jī)構(gòu)名,“大學(xué)”(E-Ni)表示一個(gè)NE結(jié)束-機(jī)構(gòu)名。
PS:雖然導(dǎo)入指定詞典,但“貴州財(cái)經(jīng)大學(xué)”分詞仍然被分割,后續(xù)研究中。
三.依存句法分析
依存句法是由法國(guó)語(yǔ)言學(xué)家L.Tesniere最先提出。它將句子分析成一棵依存句法樹(shù),描述出各個(gè)詞語(yǔ)之間的依存關(guān)系。也即指出了詞語(yǔ)之間在句法上的搭配關(guān)系,這種搭配關(guān)系是和語(yǔ)義相關(guān)聯(lián)的。如下圖所示:
哈工大Pyltp的依存句法關(guān)系如下圖所示。
參考:
https://ltp.readthedocs.io/zh_CN/latest/appendix.html
完整代碼:
# -*- coding: utf-8 -*-from pyltp import SentenceSplitterfrom pyltp import Segmentorfrom pyltp import Postaggerfrom pyltp import Parserfrom pyltp import NamedEntityRecognizerldir = 'AgriKG\ltp\cws.model' #分詞模型dicdir = 'word' #外部字典text = "貴州財(cái)經(jīng)大學(xué)要舉辦大數(shù)據(jù)比賽嗎?"#中文分詞segmentor = Segmentor() #初始化實(shí)例segmentor.load_with_lexicon(ldir, 'word') #加載模型words = segmentor.segment(text) #分詞print(text)print(' '.join(words)) #分詞拼接words = list(words) #轉(zhuǎn)換listprint(u"分詞:", words)segmentor.release() #釋放模型#詞性標(biāo)注pdir = 'AgriKG\ltp\pos.model'pos = Postagger() #初始化實(shí)例pos.load(pdir) #加載模型postags = pos.postag(words) #詞性標(biāo)注postags = list(postags)print(u"詞性:", postags)pos.release() #釋放模型data = {"words": words, "tags": postags}print(data)print(" ")#命名實(shí)體識(shí)別nermodel = 'AgriKG\ltp\ner.model'reg = NamedEntityRecognizer() #初始化命名實(shí)體實(shí)例reg.load(nermodel) #加載模型netags = reg.recognize(words, postags) #對(duì)分詞、詞性標(biāo)注得到的數(shù)據(jù)進(jìn)行實(shí)體標(biāo)識(shí)netags = list(netags)print(u"命名實(shí)體識(shí)別:", netags)#實(shí)體識(shí)別結(jié)果data={"reg": netags,"words":words,"tags":postags}print(data)reg.release() #釋放模型print(" ")#依存句法分析parmodel = 'AgriKG\ltp\parser.model'parser = Parser() #初始化命名實(shí)體實(shí)例parser.load(parmodel) #加載模型arcs = parser.parse(words, postags) #句法分析#輸出結(jié)果print(words)print(" ".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))rely_id = [arc.head for arc in arcs] # 提取依存父節(jié)點(diǎn)idrelation = [arc.relation for arc in arcs] # 提取依存關(guān)系heads = ['Root' if id == 0 else words[id-1] for id in rely_id] # 匹配依存父節(jié)點(diǎn)詞語(yǔ)for i in range(len(words)): print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')')parser.release()
輸出結(jié)果如下所示,其中ATT表示定中關(guān)系,如“貴州-大學(xué)”、“財(cái)經(jīng)-大學(xué)”;SBV表示主謂關(guān)系,如“大學(xué)-舉辦”;ADV表示狀中結(jié)果“要-舉辦”;HED表示核心關(guān)系“舉辦-Root”,即“舉辦大數(shù)據(jù)”。
補(bǔ)充:arc.head表示依存弧的父節(jié)點(diǎn)詞的索引,arc.relation表示依存弧的關(guān)系。arc.head中的ROOT節(jié)點(diǎn)的索引是0,第一個(gè)詞開(kāi)始的索引依次為1、2、3。
四.語(yǔ)義角色標(biāo)注
該部分代碼僅供博友們參考,作者還在深入研究中。
#語(yǔ)義角色標(biāo)注from pyltp import SementicRoleLabellersrlmodel = 'AgriKG\ltp\pisrl.model'labeller = SementicRoleLabeller() #初始化實(shí)例labeller.load(srlmodel) #加載模型words = ['元芳', '你', '怎么', '看']postags = ['nh', 'r', 'r', 'v']arcs = parser.parse(words, postags) #依存句法分析#arcs使用依存句法分析的結(jié)果roles = labeller.label(words, postags, arcs) #語(yǔ)義角色標(biāo)注# 打印結(jié)果for role in roles: print(role.index, "".join( ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))labeller.release()#釋放模型
輸出結(jié)果如下:
3A0:(1,1)ADV:(2,2)
上面的例子,由于結(jié)果輸出一行,所以“元芳你怎么看”有一組語(yǔ)義角色。其謂詞索引為3,即“看”。這個(gè)謂詞有三個(gè)語(yǔ)義角色,范圍分別是(0,0)即“元芳”,(1,1)即“你”,(2,2)即“怎么”,類(lèi)型分別是A0、A0、ADV。
希望這篇基礎(chǔ)性文章對(duì)你有所幫助,如果有錯(cuò)誤或不足之處,還請(qǐng)海涵。
-
數(shù)據(jù)挖掘
+關(guān)注
關(guān)注
1文章
406瀏覽量
24241 -
nlp
+關(guān)注
關(guān)注
1文章
488瀏覽量
22037 -
知識(shí)圖譜
+關(guān)注
關(guān)注
2文章
132瀏覽量
7709
原文標(biāo)題:從0到1 | 手把手教你如何使用哈工大NLP工具——PyLTP!
文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論