本系列文章主要結(jié)合Python語(yǔ)言實(shí)現(xiàn)知識(shí)圖譜構(gòu)建相關(guān)工程,具有一定創(chuàng)新性和實(shí)用性,非常希望各位博友交流討論,相互促進(jìn)成長(zhǎng)。第一篇文章主要介紹哈工大pyltp工具,包括安裝過(guò)程、中文分詞等;第二篇文章主要講解詞性標(biāo)注、實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注。
知識(shí)圖譜系列文章:
[知識(shí)圖譜實(shí)戰(zhàn)篇] 一.數(shù)據(jù)抓取之Python3抓取JSON格式的電影實(shí)體
[知識(shí)圖譜實(shí)戰(zhàn)篇] 二.Json+Seaborn可視化展示電影實(shí)體
[知識(shí)圖譜實(shí)戰(zhàn)篇] 三.Python提取JSON數(shù)據(jù)、HTML+D3構(gòu)建基本可視化布局
[知識(shí)圖譜實(shí)戰(zhàn)篇] 四.HTML+D3+CSS繪制關(guān)系圖譜
[知識(shí)圖譜實(shí)戰(zhàn)篇] 五.HTML+D3添加鼠標(biāo)響應(yīng)事件顯示相關(guān)節(jié)點(diǎn)及邊
[知識(shí)圖譜實(shí)戰(zhàn)篇] 六.HTML+D3實(shí)現(xiàn)點(diǎn)擊節(jié)點(diǎn)顯示相關(guān)屬性及屬性值
[知識(shí)圖譜實(shí)戰(zhàn)篇] 七.HTML+D3實(shí)現(xiàn)關(guān)系圖譜搜索功能
[知識(shí)圖譜實(shí)戰(zhàn)篇] 八.HTML+D3繪制時(shí)間軸線及顯示實(shí)體
環(huán)境下載地址:https://download.csdn.net/download/eastmount/11226539
原文地址:
[Python知識(shí)圖譜] 一.哈工大pyltp安裝及中文分句、中文分詞、導(dǎo)入詞典基本用法
一.詞性標(biāo)注
詞性標(biāo)注(Part-Of-Speech tagging, POS tagging)也被稱為語(yǔ)法標(biāo)注(grammatical tagging)或詞類消疑(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
SentenceSplitter
from
pyltp
import
Segmentor
from
pyltp
import
Postagger
from
pyltp
import
NamedEntityRecognizer
ldir
=
'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)換list
print
(
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 Example
a 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ó)外詞 CPU
x non
-
lexeme:不構(gòu)成詞 萄
,
翱
z descriptive words 描寫(xiě),敘述的詞 瑟瑟,匆匆
二.命名實(shí)體識(shí)別
命名實(shí)體識(shí)別(Named Entity Recognition,簡(jiǎn)稱NER),又稱作“專名識(shí)別”,是指識(shí)別文本中具有特定意義的實(shí)體,主要包括人名、地名、機(jī)構(gòu)名、專有名詞等。命名實(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)注形式,其含義如下(參考):
![[Python知識(shí)圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注_第1張圖片](https://img.it610.com/image/info8/ea250330c54141b885f75f3e35c52e55.jpg)
LTP中的NE 模塊識(shí)別三種NE,分別為人名(Nh)、機(jī)構(gòu)名(Ni)、地名(Ns)。
完整代碼
# -*- coding: utf-8 -*-
from
pyltp
import
SentenceSplitter
from
pyltp
import
Segmentor
from
pyltp
import
Postagger
from
pyltp
import
NamedEntityRecognizer
ldir
=
'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)換list
print
(
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ù)研究中。
![[Python知識(shí)圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注_第2張圖片](https://img.it610.com/image/info8/3f99f48bdfeb45068532b8dbb1f88dad.jpg)
三.依存句法分析
依存句法是由法國(guó)語(yǔ)言學(xué)家L.Tesniere最先提出。它將句子分析成一棵依存句法樹(shù),描述出各個(gè)詞語(yǔ)之間的依存關(guān)系。也即指出了詞語(yǔ)之間在句法上的搭配關(guān)系,這種搭配關(guān)系是和語(yǔ)義相關(guān)聯(lián)的。如下圖所示:
![[Python知識(shí)圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注_第3張圖片](https://img.it610.com/image/info8/325eb0ee35474c929e4d84ee687960a8.jpg)
哈工大Pyltp的依存句法關(guān)系如下圖所示。
參考:https://ltp.readthedocs.io/zh_CN/latest/appendix.html
![[Python知識(shí)圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注_第4張圖片](https://img.it610.com/image/info8/7357d4cd679c47ca97b076d69278ca17.jpg)
完整代碼
# -*- coding: utf-8 -*-
from
pyltp
import
SentenceSplitter
from
pyltp
import
Segmentor
from
pyltp
import
Postagger
from
pyltp
import
Parser
from
pyltp
import
NamedEntityRecognizer
ldir
=
'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)換list
print
(
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
(
"\t"
.
join
(
"%d:%s"
%
(
arc
.
head
,
arc
.
relation
)
for
arc
in
arcs
)
)
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
]
+
')'
)
parser
.
release
(
)
#釋放模型
輸出結(jié)果如下所示,其中ATT表示定中關(guān)系,如“貴州-大學(xué)”、“財(cái)經(jīng)-大學(xué)”;SBV表示主謂關(guān)系,如“大學(xué)-舉辦”;ADV表示狀中結(jié)果“要-舉辦”;HED表示核心關(guān)系“舉辦-Root”,即“舉辦大數(shù)據(jù)”。
![[Python知識(shí)圖譜] 二.哈工大pyltp詞性標(biāo)注、命名實(shí)體識(shí)別、依存句法分析和語(yǔ)義角色標(biāo)注_第5張圖片](https://img.it610.com/image/info8/fa308dae9d1b4678848443029f811664.jpg)
補(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
SementicRoleLabeller
srlmodel
=
'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é)果如下:
3 A0:(1,1)ADV:(2,2)
上面的例子,由于結(jié)果輸出一行,所以“元芳你怎么看”有一組語(yǔ)義角色。 其謂詞索引為3,即“看”。這個(gè)謂詞有三個(gè)語(yǔ)義角色,范圍分別是(0,0)即“元芳”,(1,1)即“你”,(2,2)即“怎么”,類型分別是A0、A0、ADV。
希望這篇基礎(chǔ)性文章對(duì)你有所幫助,如果有錯(cuò)誤或不足之處,還請(qǐng)海涵。
你好!六月。
這些年通過(guò)CSDN認(rèn)識(shí)了很多志同道合的朋友,也有很多編程領(lǐng)域的大佬,每天都感覺(jué)自己差距還很大,優(yōu)秀的很多。很高興認(rèn)識(shí)這些素未謀面的新朋友。靡不有初,鮮克有終,一起加油。coding~
(By:Eastmount 2019-06-17 中午12點(diǎn)寫(xiě)于花溪 https://blog.csdn.net/Eastmount )
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
