词性标注
简介
简单的说明一下什么是词性标注,词性(词类)是词汇中剧本的语法属性,而词性标注是在给定句子中判定每个词的语法范畴,确定它的词性并加以标注的过程。
比如给定句子“她很漂亮”,对应的词性标注结果就是“她/名词 很/副词 漂亮/形容词”,这就是一个简单的词性标注的例子。
但是在中文中有一些词语通常有多种词性,这就会对词性标注带来一些困难,解决该问题最简单的方法就是使用当前词语的高频词性来作为它的词性,虽然这样做的准确率是很高的但是它的提升空间依然很大,更好的解决办法就是像分词一样把该问题当做是一个序列问题来解决。
词性标注规范
这里列出北大的词性标注规范
词性编码 |
词性名称 |
注 解 |
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 |
未知词 |
不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义) |
jieba词性标注实战
jieba是NLP中常用的中文分词库,这里讲解了它的原理以及使用方法——jieba分词
流程如下:
1、首先通过正则表达式来进行汉字的判断,表达式如下:
re_han_internal=re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)")
2、符合该表达式则判定为汉字,然后基于前缀词典来建立有向无环图,再基于有向无环图来计算最大概率路径,同时在前缀词典中找出它所分出的词性,若在词典中没有找到,则赋予词性为"un"(未知词性)。
在此过程中若使用HMM方式进行词性标注,且待标注词为未登录词(未登录词即没有被收录在分词词表中但必须切分出来的词,包括各类专有名词(人名、地名、企业名等)、缩写词、新增词汇等等),则会通过HMM的方式进行标注。
3、若不符合上面的正则表达式,那么将会继续通过正则表达式来判断,分别赋予:"un"(未知词性),"m"(数词),"eng"(英文)。
下面用jieba来实现一个词性标注的例子:
importjieba.possegaspsgsent="还有什么是比jieba更好的中文分词工具呢?"seg_list=psg.cut(sent) result=" ".join(["{0}/{1}".format(w, t) forw, tinseg_list]) print(result)
分词结果如下: