NLP入門(六)pyltp的介紹與使用

pyltp的簡(jiǎn)介

??語(yǔ)言技術(shù)平臺(tái)(LTP)經(jīng)過(guò)哈工大社會(huì)計(jì)算與信息檢索研究中心 11 年的持續(xù)研發(fā)和推廣, 是國(guó)內(nèi)外最具影響力的中文處理基礎(chǔ)平臺(tái)晤郑。它提供的功能包括中文分詞敌呈、詞性標(biāo)注、命名實(shí)體識(shí)別造寝、依存句法分析珍逸、語(yǔ)義角色標(biāo)注等媳荒。

語(yǔ)言技術(shù)平臺(tái)架構(gòu)

??pyltp 是 LTP 的 Python 封裝,同時(shí)支持Python2和Python3版本。Python3的安裝方法為:

pip3 install pyltp

??在使用該模塊前仁烹,需要下載完整的模型文件缺脉,文件下載地址為:https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F 哨坪。pyltp 的所有輸入的分析文本和輸出的結(jié)果的編碼均為 UTF-8界拦。模型的數(shù)據(jù)文件如下:

模型數(shù)據(jù)

其中,cws.model用于分詞模型锦聊,lexicon.txt為分詞時(shí)添加的用戶字典歹嘹,ner.model為命名實(shí)體識(shí)別模型,parser.model為依存句法分析模型孔庭,pisrl.model為語(yǔ)義角色標(biāo)注模型尺上,pos為詞性標(biāo)注模型材蛛。

pyltp的使用

??pyltp的使用示例項(xiàng)目結(jié)構(gòu)如下:

示例項(xiàng)目
分句

??分句指的是將一段話或一片文章中的文字按句子分開,按句子形成獨(dú)立的單元怎抛。示例的Python代碼sentenct_split.py如下:

# -*- coding: utf-8 -*-

from pyltp import SentenceSplitter

# 分句
doc = '據(jù)韓聯(lián)社12月28日反映卑吭,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)马绝。' \
      '蓋茨原計(jì)劃從明年1月9日至14日陸續(xù)訪問(wèn)中國(guó)和日本豆赏,目前,他決定在行程中增加對(duì)韓國(guó)的訪問(wèn)迹淌。莫萊爾表示,' \
      '蓋茨在訪韓期間將會(huì)晤韓國(guó)國(guó)防部長(zhǎng)官金寬鎮(zhèn)己单,就朝鮮近日的行動(dòng)交換意見唉窃,同時(shí)商討加強(qiáng)韓美兩軍同盟關(guān)系等問(wèn)題,' \
      '擬定共同應(yīng)對(duì)朝鮮挑釁和核計(jì)劃的方案纹笼。'
sents = SentenceSplitter.split(doc)  # 分句


for sent in sents:
    print(sent)

輸出結(jié)果如下:

據(jù)韓聯(lián)社12月28日反映纹份,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)廷痘。
蓋茨原計(jì)劃從明年1月9日至14日陸續(xù)訪問(wèn)中國(guó)和日本蔓涧,目前,他決定在行程中增加對(duì)韓國(guó)的訪問(wèn)笋额。
莫萊爾表示元暴,蓋茨在訪韓期間將會(huì)晤韓國(guó)國(guó)防部長(zhǎng)官金寬鎮(zhèn),就朝鮮近日的行動(dòng)交換意見兄猩,同時(shí)商討加強(qiáng)韓美兩軍同盟關(guān)系等問(wèn)題茉盏,擬定共同應(yīng)對(duì)朝鮮挑釁和核計(jì)劃的方案。
分詞

??分詞指的是將一句話按詞語(yǔ)分開枢冤,按詞語(yǔ)形成獨(dú)立的單元鸠姨。示例的Python代碼words_split.py如下:

# -*- coding: utf-8 -*-


import os
from pyltp import Segmentor

cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model')  # 分詞模型路徑,模型名稱為`cws.model`
lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 參數(shù)lexicon是自定義詞典的文件路徑

segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)

sent = '據(jù)韓聯(lián)社12月28日反映淹真,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示讶迁,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)。'
words = segmentor.segment(sent)  # 分詞

print('/'.join(words))

segmentor.release()

輸出的結(jié)果如下:

據(jù)/韓聯(lián)社/12月/28日/反映/核蘸,/美/國(guó)防部/發(fā)言人/杰夫·莫萊爾/27日/表示/巍糯,/美/國(guó)防部長(zhǎng)/蓋茨/將/于/2011年/1月/14日/訪問(wèn)/韓國(guó)/。
詞性標(biāo)注

??詞性標(biāo)注指的是一句話分完詞后客扎,制定每個(gè)詞語(yǔ)的詞性鳞贷。示例的Python代碼postagger.py如下:

# -*- coding: utf-8 -*-

import os
from pyltp import Segmentor, Postagger

# 分詞
cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model')  # 分詞模型路徑,模型名稱為`cws.model`
lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 參數(shù)lexicon是自定義詞典的文件路徑

segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)

sent = '據(jù)韓聯(lián)社12月28日反映虐唠,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示搀愧,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)。'
words = segmentor.segment(sent)  # 分詞

# 詞性標(biāo)注
pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')  # 詞性標(biāo)注模型路徑,模型名稱為`pos.model`

postagger = Postagger()  # 初始化實(shí)例
postagger.load(pos_model_path)  # 加載模型
postags = postagger.postag(words)  # 詞性標(biāo)注

for word, postag in zip(words, postags):
    print(word, postag)

# 釋放模型
segmentor.release()
postagger.release()

'''
詞性標(biāo)注結(jié)果說(shuō)明
https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
'''

輸出結(jié)果如下:

據(jù) p
韓聯(lián)社 ni
12月 nt
28日 nt
反映 v
咱筛, wp
美 j
國(guó)防部 n
發(fā)言人 n
杰夫·莫萊爾 nh
27日 nt
表示 v
搓幌, wp
美 j
國(guó)防部長(zhǎng) n
蓋茨 nh
將 d
于 p
2011年 nt
1月 nt
14日 nt
訪問(wèn) v
韓國(guó) ns
。 wp

詞性標(biāo)注結(jié)果可參考網(wǎng)址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html 迅箩。

命名實(shí)體識(shí)別

??命名實(shí)體識(shí)別(NER)指的是識(shí)別出一句話或一段話或一片文章中的命名實(shí)體溉愁,比如人名,地名饲趋,組織機(jī)構(gòu)名拐揭。示例的Python代碼ner.py如下:

# -*- coding: utf-8 -*-

import os
from pyltp import Segmentor, Postagger

# 分詞
cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model')  # 分詞模型路徑,模型名稱為`cws.model`
lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 參數(shù)lexicon是自定義詞典的文件路徑

segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)

sent = '據(jù)韓聯(lián)社12月28日反映奕塑,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示堂污,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)。'
words = segmentor.segment(sent)  # 分詞

# 詞性標(biāo)注
pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')  # 詞性標(biāo)注模型路徑龄砰,模型名稱為`pos.model`

postagger = Postagger()  # 初始化實(shí)例
postagger.load(pos_model_path)  # 加載模型
postags = postagger.postag(words)  # 詞性標(biāo)注


ner_model_path = os.path.join(os.path.dirname(__file__), 'data/ner.model')   # 命名實(shí)體識(shí)別模型路徑盟猖,模型名稱為`pos.model`

from pyltp import NamedEntityRecognizer
recognizer = NamedEntityRecognizer() # 初始化實(shí)例
recognizer.load(ner_model_path)  # 加載模型
# netags = recognizer.recognize(words, postags)  # 命名實(shí)體識(shí)別


# 提取識(shí)別結(jié)果中的人名,地名换棚,組織機(jī)構(gòu)名

persons, places, orgs = set(), set(), set()


netags = list(recognizer.recognize(words, postags))  # 命名實(shí)體識(shí)別
print(netags)
# print(netags)
i = 0
for tag, word in zip(netags, words):
    j = i
    # 人名
    if 'Nh' in tag:
        if str(tag).startswith('S'):
            persons.add(word)
        elif str(tag).startswith('B'):
            union_person = word
            while netags[j] != 'E-Nh':
                j += 1
                if j < len(words):
                    union_person += words[j]
            persons.add(union_person)
    # 地名
    if 'Ns' in tag:
        if str(tag).startswith('S'):
            places.add(word)
        elif str(tag).startswith('B'):
            union_place = word
            while netags[j] != 'E-Ns':
                j += 1
                if j < len(words):
                    union_place += words[j]
            places.add(union_place)
    # 機(jī)構(gòu)名
    if 'Ni' in tag:
        if str(tag).startswith('S'):
            orgs.add(word)
        elif str(tag).startswith('B'):
            union_org = word
            while netags[j] != 'E-Ni':
                j += 1
                if j < len(words):
                    union_org += words[j]
            orgs.add(union_org)

    i += 1

print('人名:', '式镐,'.join(persons))
print('地名:', ','.join(places))
print('組織機(jī)構(gòu):', '固蚤,'.join(orgs))


# 釋放模型
segmentor.release()
postagger.release()
recognizer.release()

輸出的結(jié)果如下:

['O', 'S-Ni', 'O', 'O', 'O', 'O', 'B-Ni', 'E-Ni', 'O', 'S-Nh', 'O', 'O', 'O', 'S-Ns', 'O', 'S-Nh', 'O', 'O', 'O', 'O', 'O', 'O', 'S-Ns', 'O']
人名: 杰夫·莫萊爾娘汞,蓋茨
地名: 美,韓國(guó)
組織機(jī)構(gòu): 韓聯(lián)社夕玩,美國(guó)防部

命名實(shí)體識(shí)別結(jié)果可參考網(wǎng)址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html 价说。

依存句法分析

??依存語(yǔ)法 (Dependency Parsing, DP) 通過(guò)分析語(yǔ)言單位內(nèi)成分之間的依存關(guān)系揭示其句法結(jié)構(gòu)。 直觀來(lái)講风秤,依存句法分析識(shí)別句子中的“主謂賓”鳖目、“定狀補(bǔ)”這些語(yǔ)法成分,并分析各成分之間的關(guān)系缤弦。示例的Python代碼parser.py代碼如下:

# -*- coding: utf-8 -*-

import os
from pyltp import Segmentor, Postagger, Parser

# 分詞
cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model')  # 分詞模型路徑领迈,模型名稱為`cws.model`
lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 參數(shù)lexicon是自定義詞典的文件路徑

segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)

sent = '據(jù)韓聯(lián)社12月28日反映,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示碍沐,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)狸捅。'
words = segmentor.segment(sent)  # 分詞

# 詞性標(biāo)注
pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')  # 詞性標(biāo)注模型路徑,模型名稱為`pos.model`

postagger = Postagger()  # 初始化實(shí)例
postagger.load(pos_model_path)  # 加載模型
postags = postagger.postag(words)  # 詞性標(biāo)注


# 依存句法分析
par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model')  # 模型路徑累提,模型名稱為`parser.model`

parser = Parser() # 初始化實(shí)例
parser.load(par_model_path)  # 加載模型
arcs = parser.parse(words, postags)  # 句法分析

rely_id = [arc.head for arc in arcs]  # 提取依存父節(jié)點(diǎn)id
relation = [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] + ')')

# 釋放模型
segmentor.release()
postagger.release()
parser.release()

輸出結(jié)果如下:

ADV(據(jù), 表示)
SBV(韓聯(lián)社, 反映)
ATT(12月, 28日)
ADV(28日, 反映)
POB(反映, 據(jù))
WP(尘喝,, 據(jù))
ATT(美, 國(guó)防部)
ATT(國(guó)防部, 發(fā)言人)
ATT(發(fā)言人, 杰夫·莫萊爾)
SBV(杰夫·莫萊爾, 表示)
ADV(27日, 表示)
HED(表示, Root)
WP(,, 表示)
ATT(美, 國(guó)防部長(zhǎng))
ATT(國(guó)防部長(zhǎng), 蓋茨)
SBV(蓋茨, 訪問(wèn))
ADV(將, 訪問(wèn))
ADV(于, 訪問(wèn))
ATT(2011年, 14日)
ATT(1月, 14日)
POB(14日, 于)
VOB(訪問(wèn), 表示)
VOB(韓國(guó), 訪問(wèn))
WP(斋陪。, 表示)

依存句法分析結(jié)果可參考網(wǎng)址:https://ltp.readthedocs.io/zh_CN/latest/appendix.html 朽褪。

語(yǔ)義角色標(biāo)注

??語(yǔ)義角色標(biāo)注是實(shí)現(xiàn)淺層語(yǔ)義分析的一種方式置吓。在一個(gè)句子中,謂詞是對(duì)主語(yǔ)的陳述或說(shuō)明缔赠,指出“做什么”衍锚、“是什么”或“怎么樣,代表了一個(gè)事件的核心嗤堰,跟謂詞搭配的名詞稱為論元戴质。語(yǔ)義角色是指論元在動(dòng)詞所指事件中擔(dān)任的角色。主要有:施事者(Agent)踢匣、受事者(Patient)告匠、客體(Theme)、經(jīng)驗(yàn)者(Experiencer)离唬、受益者(Beneficiary)后专、工具(Instrument)、處所(Location)男娄、目標(biāo)(Goal)和來(lái)源(Source)等行贪。示例的Python代碼rolelabel.py如下:

# -*- coding: utf-8 -*-

import os
from pyltp import Segmentor, Postagger, Parser, SementicRoleLabeller

# 分詞
cws_model_path = os.path.join(os.path.dirname(__file__), 'data/cws.model')  # 分詞模型路徑漾稀,模型名稱為`cws.model`
lexicon_path = os.path.join(os.path.dirname(__file__), 'data/lexicon.txt')  # 參數(shù)lexicon是自定義詞典的文件路徑

segmentor = Segmentor()
segmentor.load_with_lexicon(cws_model_path, lexicon_path)

sent = '據(jù)韓聯(lián)社12月28日反映模闲,美國(guó)防部發(fā)言人杰夫·莫萊爾27日表示,美國(guó)防部長(zhǎng)蓋茨將于2011年1月14日訪問(wèn)韓國(guó)崭捍。'
words = segmentor.segment(sent)  # 分詞

# 詞性標(biāo)注
pos_model_path = os.path.join(os.path.dirname(__file__), 'data/pos.model')  # 詞性標(biāo)注模型路徑尸折,模型名稱為`pos.model`

postagger = Postagger()  # 初始化實(shí)例
postagger.load(pos_model_path)  # 加載模型
postags = postagger.postag(words)  # 詞性標(biāo)注

# 依存句法分析
par_model_path = os.path.join(os.path.dirname(__file__), 'data/parser.model')  # 模型路徑,模型名稱為`parser.model`

parser = Parser() # 初始化實(shí)例
parser.load(par_model_path)  # 加載模型
arcs = parser.parse(words, postags)  # 句法分析

# 語(yǔ)義角色標(biāo)注
srl_model_path = os.path.join(os.path.dirname(__file__), 'data/pisrl.model')  # 語(yǔ)義角色標(biāo)注模型目錄路徑
labeller = SementicRoleLabeller() # 初始化實(shí)例
labeller.load(srl_model_path)  # 加載模型
roles = labeller.label(words, postags, arcs)  # 語(yǔ)義角色標(biāo)注

# 打印結(jié)果
for role in roles:
    print(words[role.index], end=' ')
    print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))

# 釋放模型
segmentor.release()
postagger.release()
parser.release()
labeller.release()

輸出結(jié)果如下:

反映 4 A0:(1,1)A0:(2,3)
表示 11 MNR:(0,5)A0:(6,9)TMP:(10,10)A1:(13,22)
訪問(wèn) 21 A0:(13,15)ADV:(16,16)TMP:(17,20)A1:(22,22)

總結(jié)

??本文介紹了中文NLP的一個(gè)杰出工具pyltp殷蛇,并給出了該模塊的各個(gè)功能的一個(gè)示例实夹,希望能給讀者一些思考與啟示。本文到此結(jié)束粒梦,感謝大家閱讀~

注意:本人現(xiàn)已開通微信公眾號(hào): Python爬蟲與算法(微信號(hào)為:easy_web_scrape)亮航, 歡迎大家關(guān)注哦~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匀们,隨后出現(xiàn)的幾起案子缴淋,更是在濱河造成了極大的恐慌,老刑警劉巖泄朴,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件重抖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡祖灰,警方通過(guò)查閱死者的電腦和手機(jī)钟沛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)局扶,“玉大人恨统,你說(shuō)我怎么就攤上這事叁扫。” “怎么了延欠?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵陌兑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我由捎,道長(zhǎng)兔综,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任狞玛,我火速辦了婚禮软驰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘心肪。我一直安慰自己锭亏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布硬鞍。 她就那樣靜靜地躺著慧瘤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固该。 梳的紋絲不亂的頭發(fā)上锅减,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音伐坏,去河邊找鬼怔匣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桦沉,可吹牛的內(nèi)容都是我干的每瞒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼纯露,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剿骨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起埠褪,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浓利,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后组橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荞膘,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年玉工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羽资。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遵班,死狀恐怖屠升,靈堂內(nèi)的尸體忽然破棺而出潮改,到底是詐尸還是另有隱情,我是刑警寧澤腹暖,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布汇在,位于F島的核電站,受9級(jí)特大地震影響脏答,放射性物質(zhì)發(fā)生泄漏糕殉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一殖告、第九天 我趴在偏房一處隱蔽的房頂上張望阿蝶。 院中可真熱鬧,春花似錦黄绩、人聲如沸羡洁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筑煮。三九已至,卻和暖如春粤蝎,著一層夾襖步出監(jiān)牢的瞬間真仲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工诽里, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袒餐,地道東北人飞蛹。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓谤狡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卧檐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墓懂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容