1.词性规范
现代汉语中的词性可分为实词和虚词,共有12种词性。实词有名词、动词、形容词等;虚词有副词、介词、连词等。中文词性通常会通过一些简单字母编码对词性进行标注,如动词、名词、形容词分别用“v”、“n”、“adj”表示。
词性标注是指为分词结果中的每个词标注一个词性的过程,也就是确定每个词是名词、动词、形容词或其他词性的过程。 中文词性标注相比与英文词性标注有一定的难度,这是因为中文不像英文可以通过词的形态变化判断词的词性。一个中文词可能有多种词性,在不同的句子中表现的意思也大不相同。例如,“学习能使我进步”这句话,“学习”是名词,而“我要好好学习”这句话,“学习”是动词。 基于规则的词性标注。 基于规则的标注方法是较早的一种词性标注方法,这种方法需要获取能表达一定的上下文关系及其相 关语境的规则库。一个好的规则库的获取是比较困难的,主要的获取方式是通过人工编制繁杂的语法或语义信息的词典 和规则系统,比较费时费力,并且难以保证规则的准确性。
基于统计的词性标注。 上世纪七十年代末到八十年代初,开始得到应用。具有代表性的是基于统计模型(n元语法模型和马尔 可夫转移矩阵)的词性标注系统,通过概率统计的方法进行自动词性标注。 基于统计的方法主要有基于最大熵的词性标注、基于统计最大概率输出的词性标注和基于隐马尔科夫 模型(HMM)的词性标注。 基于统计的标注方法会抑制小概率事件的发生,受到长距离搭配上下文的限制,但有时通过规则的方 法会更为容易实现。 基于规则的标注和基于统计的标注方法在使用的过程中,各有所长,但都存在一些缺陷。因此,就有了将基于规则与统计相结合的词性标注方法,此方法具有效率更高,处理能力强等特点。
事实上,中文的词性标注至今还没有统一的标注标准,使用较为广泛有宾州树库和北大词性标注规范。本文采用北大词性标注规范,部分词性编码如下表所示。
上面展示了部分词性标注的编码及其注解,通过这个标准可以对一些句子段落进行词性标注。 句子“在1998年来临之际,我十分高兴地通过中央人民广播电台、中国国际广播电台和中央电视台,向全国各族人民,向香港特别行政区同胞、澳门和台湾同胞、海外侨胞,向世界各国的朋友们,致以诚挚的问候和良好的祝愿!”的标注结果如下图所示。
2.jieba词性标注
jieba词性标注是基于规则与统计相结合的词性标注方法。jieba词性标注与其分词的过程类似,利用词典匹配与HMM共同合作完成词性标注。其词性标注流程可概括为以下两个步骤。
如果是汉字,那么将基于前缀词典构建有向无环图,对有向无环图计算最大概率路径,同时在前缀字典中 查找所分词的词性。 如果没有找到,那么将其标注为“x”(表示词性未知)。 如果在标注过程中标志为未知,并且该词为未登陆词,那么通过HMM进行词性标注。
如果不是汉字,那么使用正则表达式判断词的类型,并赋予对应的词性,其中“x”表示未知词性“m”表示 数词,“eng”表示英文词。
jieba词性标注的流程如下图所示。
以“去森林公园爬山”为例,jieba词性标注的流程如下:
1. 加载离线统计词典。离线统计词典放在chapte\data文件夹下。词典的每一行有3列,第一列是词,第二列是词频,第三列是词性。离线统计词典部分内容如下表所示。
词 | 词频 | 词性 |
1号店 | 3 | n |
1號店 | 3 | n |
4S店 | 3 | n |
A型 | 3 | n |
…… | …… | …… |
BB机 | 3 | n |
…… | …… | …… |
2. 构建前缀词典。 通过离线统计词典构建前缀词典。
如统计词典中的 词“森林公园”的前缀分别是“森”、“森林”、 “森林公”“公园”的前缀是“公”;“爬山”的 前缀是“爬”。 统计词典中所有的词形成的前缀词典如下表所示。
前缀 | 词频 | 词性 |
去 | 123402 | v |
森 | 742 | n |
林 | 8581 | ng |
公 | 5628 | n |
园 | 1914 | zg |
爬 | 4046 | v |
山 | 23539 | n |
森林 | 5024 | n |
森林公园 | 3 | n |
爬山 | 117 | n |
3. 构建有向无环图。
首先,基于前缀词典对输入文本“去森林公园爬山”进行切分。对于“去”,没有前缀,没有其他匹 配词,划分为单个词;对于“森”,则有“森”“森林”和“森林公园”3种方式;对于“林”也只有 一种划分方式;对于“公”,则有“公”“公园”两种划分方式,依次类推,可以得到每个字开始的 前缀词的切分式。
然后,构建字的映射列表。在jieba分词中,每个字都是通过在文本中的位置标记,因此可以构建一个 以每个字开始位置与相应切分的末尾位置构成的映射列表。构成的映射列表如下图所示。
位置 | 字 | 映射 | 注解 |
0 | 去 | 0: [0] | 表示0→0映射,即开始位置为0,末尾位置为0对应的词,就是“去” |
1 | 森 | 1: [1,2,4] | 表示1→1,1→2,1→4的映射,即开始位置为1,末尾位置为分别为1、2、4的词,则有“森”“森林”和“森林公园”这3个词 |
2 | 林 | 2: [2] | 2→2 |
3 | 公 | 3: [3,4] | 3→3,3→4,“公”“公园” |
4 | 园 | 4: [4] | 4→4,“园” |
5 | 爬 | 5: [5,6] | 5→5,5→6,“爬”,“爬山” |
6 | 山 | 6: [6] | 6→6,“山” |
最后,根据映射列表构建有向无环图。对于每一种切分,将相应的首尾位置相连。最终构成一个有向 无环图,如下图所示。
4. 计算最大概率路径。
得到有向无环图后,每条有向边的权重(用概率值表示)可以通过前缀词典的词频获得。在有向无环图中,从起点到终点存在多条路径,每一条路径代表一种分词结果。 在所有的路径中,需要计算一条概率最大的路径,也就是在所有切分结果中选取概率最大的一种切分。 jieba利用动态规划法计算概率最大路径,通过从句子的最后一个字开始倒序遍历句子的每个字的方式,计算不同分词结果的概率对数得分。 得到概率最大路径后,就可获得分词的结果,同时在前缀字典中查找所分词的词性,得到分词后的词性标注。
5.jieba词性标注在实际应用中使用psg.cut函数命令实现,不需要另外编写命令。对“去森林公园爬山”进行词性标注代码如下图所示。
import jieba.posseg as psg
sent='去森林公园爬山。'
for w,t in psg.cut(sent):
print(w,'/',t)
得到如下结果
D:\ana\envs\nlp\python.exe D:\pythoncode\nlp\jiw.py
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\86130\AppData\Local\Temp\jieba.cache
Loading model cost 0.550 seconds.
Prefix dict has been built successfully.
去 / v
森林公园 / n
爬山 / n
。 / x
进程已结束,退出代码为 0
词性标注结果中“。”被标注为x。因为句号是标点符号的一种,所以被标注为未知词性。
在实际应用,一些字典中不存在的词被标注为未知词性“x”,这对词性统计等处理结果会有一定的影响,因此在使用jieba自定义字典时,要尽可能完善词典信息。