POS tagging 词性标注 之 武林外传版

词类,POS(Part Of Speech),就是所谓的名词、动词、形容词、代词、介词等词性分类。词性标注(POS tagging)就是标记/判断一个词属于什么词性。词类有以下特征:

  • 分布特征(Distributional)
    单词能够出现在相似的环境中
    单词有相似的功能
  • 形态特征(Morphological)
    单词有相同的前缀后缀(词缀具有相似的功能)
    在句法结构中有相似的上下文环境
  • 无关于含义(meaning),也无关于语法(可以是主语/宾语,等等)

词的属性可以提供很多信息: 形容词 后面跟的往往是一个名词;一句话里 名词 通常是比较重要的信息,而 介词 可能比较不重要。比如 “同福客栈的掌柜是谁?” 这句话里,重要的词有

  • 名词:“客栈”、“掌柜”
  • 疑问词:“谁”

词类标注是歧义消解(disambiguation) 的一个重要方面。很多次不仅仅有一个词性,当不同词性时代表的意思不同。比如“排山倒海”,原先是一个形容词,用来形容声势浩大。但是如果是出现在郭芙蓉的嘴里,那基本表示一个招式名称,是一个名词。

中文 POS tagging 体验链接:百度腾讯

Python Package

jieba 🔗

jieba是优秀的中文分词工具,同样也有词性标注的功能。首先请确保”pip install jieba”,来个单条query:

1
2
3
4
import jieba.posseg as pseg
words = pseg.cut("佟掌柜喜欢的人是谁?")
for word, flag in words:
print(word, flag)

output:

1
2
3
4
5
6
7
8
佟 nr
掌柜 n
喜欢 v
的 uj
人 n
是 v
谁 r
? w

可以根据下面的jieba的词性对照表(会有变动)对上面的output进行解读:

jieba词性对照表
编码 名称 注解
ag 形语素 形容词性语素。形容词代码为 a,语素代码g前面置以A。
a 形容词 取英语形容词 adjective的第1个字母。
ad 副形词 直接作状语的形容词。形容词代码 a和副词代码d并在一起。
an 名形词 具有名词功能的形容词。形容词代码 a和名词代码n并在一起。
b 区别词 取汉字“别”的声母。
c 连词 取英语连词 conjunction的第1个字母。
dg 副语素 副词性语素。副词代码为 d,语素代码g前面置以D。
d 副词 取 adverb的第2个字母,因其第1个字母已用于形容词。
e 叹词 取英语叹词 exclamation的第1个字母。
f 方位词 取汉字“方”
g 语素 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
h 前接成分 取英语 head的第1个字母。
i 成语 取英语成语 idiom的第1个字母。
j 简称略语 取汉字“简”的声母。
k 后接成分
l 习用语 习用语尚未成为成语,有点“临时性”,取“临”的声母。
m 数词 取英语 numeral的第3个字母,n,u已有他用。
ng 名语素 名词性语素。名词代码为 n,语素代码g前面置以N。
n 名词 取英语名词 noun的第1个字母。
nr 人名 名词代码 n和“人(ren)”的声母并在一起。
ns 地名 名词代码 n和处所词代码s并在一起。
nt 机构团体 “团”的声母为 t,名词代码n和t并在一起。
nz 其他专名 “专”的声母的第 1个字母为z,名词代码n和z并在一起。
o 拟声词 取英语拟声词 onomatopoeia的第1个字母。
p 介词 取英语介词 prepositional的第1个字母。
q 量词 取英语 quantity的第1个字母。
r 代词 取英语代词 pronoun的第2个字母,因p已用于介词。
s 处所词 取英语 space的第1个字母。
tg 时语素 时间词性语素。时间词代码为 t,在语素的代码g前面置以T。
t 时间词 取英语 time的第1个字母。
u 助词 取英语助词 auxiliary
vg 动语素 动词性语素。动词代码为 v。在语素的代码g前面置以V。
v 动词 取英语动词 verb的第一个字母。
vd 副动词 直接作状语的动词。动词和副词的代码并在一起。
vn 名动词 指具有名词功能的动词。动词和名词的代码并在一起。
w 标点符号
x 非语素字 非语素字只是一个符号,字母 x通常用于代表未知数、符号。
y 语气词 取汉字“语”的声母。
z 状态词 取汉字“状”的声母的前一个字母。
un 未知词 不可识别词及用户自定义词组。取英文Unknown首两个字母。(非北大标准,CSW分词中定义)

再来个多条query的例子:

1
2
3
4
5
6
7
8
query = ['秀才最喜欢说的话是什么','老白的外号是什么','郭芙蓉的情敌是谁']

for q in query:
d = {}
words = pseg.cut(q)
for word, flag in words:
d[word] = flag
print(d)

output:

1
2
3
{'喜欢': 'v', '说': 'v', '是': 'v', '的话': 'u', '最': 'd', '秀才': 'n', '什么': 'r'}
{'的': 'uj', '是': 'v', '老白': 'nr', '什么': 'r', '外号': 'n'}
{'是': 'v', '郭': 'nr', '芙蓉': 'n', '的': 'uj', '情敌': 'n', '谁': 'r'}

基本上还是挺准的。

HanLP 🔗

HanLP实际上是Java写的,pyhanlp才是python接口,因此下载是”pip install pyhanlp”

1
2
3
4
5
from pyhanlp import *

print(HanLP.segment('老白的真实身份是什么'))
for term in HanLP.segment('老白的真实身份是什么'):
print('{}\t{}'.format(term.word, term.nature)) # 获取单词与词性

output:

1
2
3
4
5
6
7
[老白/nz, 的/ude1, 真实/a, 身份/n, 是/vshi, 什么/ry]
老白 nz
的 ude1
真实 a
身份 n
是 vshi
什么 ry
HanLP的词性对照表
编码 名称 编码 名称 编码 名称
P 1 =========== === ========================== ===== ==============
a 形容词 gc 化学相关词汇 nf 食品,比如“薯片”
ad 副形词 gg 地理地质相关词汇 ng 名词性语素
ag 形容词性语素 gi 计算机相关词汇 nh 医药疾病等健康相关名词
al 形容词性惯用语 gm 数学相关词汇 nhd 疾病
an 名形词 gp 物理相关词汇 nhm 药品
b 区别词 h 前缀 ni 机构相关(不是独立机构名)
bg 区别语素 i 成语 nic 下属机构
bl 区别词性惯用语 j 简称略语 nis 机构后缀
c 连词 k 后缀 nit 教育相关机构
cc 并列连词 l 习用语 nl 名词性惯用语
d 副词 m 数词 nm 物品名
dg 辄,俱,复之类的副词 mg 数语素 nmc 化学品名
dl 连语 Mg 甲乙丙丁之类的数词 nn 工作相关名词
e 叹词 mq 数量词 nnd 职业
end 仅用于终##终 n 名词 nnt 职务职称
f 方位词 nb 生物名 nr 人名
g 学术词汇 nba 动物名 nr1 复姓
gb 生物相关词汇 nbc 动物纲目 nr2 蒙古姓名
gbc 生物类别 nbp 植物名 nrf 音译人名
P 2 =========== === ========================== ===== ==============
nrj 日语人名 qg 量词语素 ud 助词
ns 地名 qt 时量词 ude1 的 底
nsf 音译地名 qv 动量词 ude2
nt 机构团体名 r 代词 ude3
ntc 公司名 rg 代词性语素 udeng 等 等等 云云
ntcb 银行 Rg 古汉语代词性语素 udh 的话
ntcf 工厂 rr 人称代词 ug
ntch 酒店宾馆 ry 疑问代词 uguo
nth 医院 rys 处所疑问代词 uj 助词
nto 政府机构 ryt 时间疑问代词 ul 连词
nts 中小学 ryv 谓词性疑问代词 ule 了 喽
ntu 大学 rz 指示代词 ulian 连 (“连小学生都会”)
nx 字母专名 rzs 处所指示代词 uls 来讲 来说 而言 说来
nz 其他专名 rzt 时间指示代词 usuo
o 拟声词 rzv 谓词性指示代词 uv 连词
p 介词 s 处所词 uyy 一样 一般 似的 般
pba 介词“把” t 时间词 uz
pbei 介词“被” tg 时间词性语素 uzhe
q 量词 u 助词 uzhi
P 3 =========== === ========================== ===== ==============
v 动词 wb 百分号千分号,全角:% ‰ 半角:% wt 叹号,全角:!
vd 副动词 wd 逗号,全角:, 半角:, ww 问号,全角:?
vf 趋向动词 wf 分号,全角:; 半角: ; wyy 右引号,全角:” ’ 』
vg 动词性语素 wh 单位符号,全角:¥ $ £ ° ℃ 半角:$ wyz 左引号,全角:“ ‘ 『
vi 不及物动词(内动词) wj 句号,全角:。 x 字符串
vl 动词性惯用语 wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { > xu 网址URL
vn 名动词 wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { < xx 非语素字
vshi 动词“是” wm 冒号,全角:: 半角: : y 语气词(delete yg)
vx 形式动词 wn 顿号,全角:、 yg 语气语素
vyou 动词“有” wp 破折号,全角:—— -- ——- 半角:— —- z 状态词
w 标点符号 ws 省略号,全角:…… … zg 状态词

再来个多query例子:

1
2
3
4
5
testCases = ['老白的真实身份是什么','盗圣是谁']
for sentence in testCases: print(HanLP.segment(sentence))

# [老白/nz, 的/ude1, 真实/a, 身份/n, 是/vshi, 什么/ry]
# [盗/vg, 圣/ag, 是/vshi, 谁/ry]

这里的“盗圣”被分开了,分成“盗”和“圣”,一个动词一个形容词,没有被识别成专有名词,是因为训练的时候没有这个样本,的确盗圣这个也很少在其他场景/小说/电视剧等地方出现。

顺便再来看看HanLP的其他功能:

  • 关键词提取

    1
    2
    3
    4
    5
    6
    document = '老白的真实身份是什么'
    print(HanLP.extractKeyword(document, 2))
    # output:[老白, 真实]

    print(HanLP.extractKeyword(document, 3))
    # output:[老白, 身份, 真实]
  • 自动摘要

    这里的自动摘要也是比较重要的功能,因为比写论文更头疼的是还要写摘要,如果自动摘要技术成熟后,论文的摘要就可以自动生成了。包括读长文章就可以先看摘要再决定要不要深入看下去。

    1
    2
    3
    4
    print(HanLP.extractSummary('一个月黑风高的杀人夜,传说中的雌雄双煞从天而降,打乱了同福客栈的安稳日子。家世显赫、从小娇生惯养的郭芙蓉,父亲是一代大侠,始终把她笼罩在阴影之下。从小争胜好胜的她,毅然选择了一条离家出走独闯江湖的路,却在第一站,被扣在了同福客栈,从此开始了艰苦卓绝的杂役生涯……', 1))

    # output
    # [被扣在了同福客栈]
  • 依存句法分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    HanLP.parseDependency("老白的真实身份是什么")

    # output
    # 1 老白 老白 nh nr _ 4 定中关系 _ _
    # 2 的 的 u u _ 1 右附加关系 _ _
    # 3 真实 真实 a a _ 4 定中关系 _ _
    # 4 身份 身份 n n _ 5 主谓关系 _ _
    # 5 是 是 v v _ 0 核心关系 _ _
    # 6 什么 什么 r r _ 5 动宾关系 _ _

词性标注的一个应用方向是在知识图谱里,当你确定词性时,更加能方便把可能的答案揪出来。

would you buy me a coffee☕~
0%