第三章 词汇与分词技术
文章目录
本章讲解汉语自然语言处理的第一项核心技术:中文(或汉语)词汇自动切分,也称为中文分词技术。从1979年,中国就开始进行及其可读语料库的建设,专业的高校和研究机构纷纷建立大规模中文语料库。这个阶段历经十多年之久,由于语料库建设之初,许多工作都要从零开始,分词任务都由专业人员手工完成。这是一项繁重而枯燥的工作。即便如此,受到人为主观因素的影响,人工分词的标准并不统一,语料精度也不高。虽然是国家级的项目,所谓的“大规模”语料库的规模不过也就是百万级。因此,迫切需要统一的分词规范及适合大规模语料的高精度中文分词算法。
中文分词的研究经历了二十来年,现在看来基本上分为如下三个流派。
- 机械式分词法(基于字典)。机械分词的原理式将文档中的字符串与词典中的词条进行逐一匹配,如果字典中找到某个字符串,则匹配成功,可以切分,否则不予切分。基于词典的机械分词法,实现简单、实用性强,但机械分词法的最大缺点就是词典的完备性不能得到保证。据统计哟个一个憨厚70000个词的词典去切分含有15000个词的语料库,仍然有30%以上的词条没有被切分出来,也就是说有4500个词没有在词典中登录。
- 基于语法和规则的分词法。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来进行词性标注,以解决分词歧义现象。因为现有的语法知识,句法规则十分笼统、复杂,基于语法和规则的分词法所能达到的精确度还远远不能令人满意。
- 基于统计的分词法。其基本原理是根据字符串在语料库中出现的统计频率来决定其是否构成词。词是字的组合,相邻的字同时出现的次数越多,就越有可能构成一个词。因此,字与字相邻共现的频率或概率能够较好地反映它们成为词地可信度。
针对这些问题,经多年的不懈努力,最终较成功地实现了中文词汇的自动切分技术。本章简要介绍了 ICTCLAS 中文分词算法的来源和现状,以及实现了 NShort 最短路径算法的一些著名的开源框架。为了读者理解方便,我们选择HaNLP系统提供的开源框架,结合实例,详细分析和讲解著名的 NShort 最短路径分词方法。内容包括:一元词网与原子切分、生成二元词图、NShort 最短路径、命名实体识别、细分阶段等内容。
1. 中文分词
1.1 什么是词与分词规范
什么是词,我们如何界定汉语词呢?古往今来,汉字虽然有5万多个,但常用的汉字大约仅有6000个。即便如此,其中很多汉字在日常生活中较少用到。然而,这些有限的汉字足以维持词汇的长期更新,因为扩大中文词汇的方法是通过构造汉字的符合新词,而不是创造新的字符来完成的。这就造成了汉语中所谓的词与短语之间没有明确的界限。这可能也就是中国的一些语法学家认为,中文没有词语而只有汉字的原因,并创造了一个术语——“字短语”来代替传统的词汇。东振东就认为:“‘词或字符’的争论源于它们都急于给中国语言一个硬规范的共同基础。遗憾的是,中文不是那么明确或硬的,它是软的。我们必须认识到其‘柔软度’”。
除钩子法的原因之外,人们还因为自身的方言、受教育程度、亚文化等差异因素,对词汇的认识也不同。
随着NLP的大规模应用,计算语言学界逐渐统一了汉语词汇的标准。从最初的“结合紧密,使用稳定”到信息处理领域的《信息处理用现代汉语分词规范》的制定,都是去顶汉语分词标准的一种尝试,该文关于汉语词的定义给出了如下说明。
从计算语言学的角度来看,如果把一个句子理解为一个特殊的可计算的逻辑表达式,那么句子中的一个词就是表达式中的一个可计算符号,有的表示为连接的符号,如连词“然后”、“而且”这样的虚词;有的表示为动作、状态(函数的签名),如“出现”、“思考”当这样的动词;有的表示为事物的概念,如“中国”、“泰山”等这样的名词。
本书设计的分词规范有如下两大类:第一类包括《北大(中科院)词性标注》、《现代汉语语料库加工规范——词语切分与词性标注》、《北京大学现代汉语语料库基本加工规范》三篇文章,读者可从http://www.threedweb.cn/thread-1584–1-1.html、http://www.threedweb.cn/thread-437-1-2.html下载;第二类为《宾州树库中文分词规范》,读者可从http://www.threedweb.cn/thread-1478-1-1.html下载。
本文主要介绍中文分词中最常用的《北大(中科院)词性标注》(以下简称《北大规范》)的基本规则。
《信息处理用现代汉语分词规范》和传统的语法教育中将汉语的此类主要分为 13 种:名词、动词、代词、形容词、数词、量词、副词、介词、连词、助词、语气词、叹词和象声词。
这与朱德熙先生提出的19种分类法有所不同。朱先生的分类法还包括:时间词、处所词、方位词、区别词、状态词等。
除此之外,《北大规范》还加入了4个兼类谓词:副动词、名动词、副形词、名形词;最后还增加了前缀、后缀、成语、简称、习用语 5 中国辅助词类。这样《北大规范》就形成了40种词类。
修改后的现代汉语词语分类体系对照表。
如表格所示,从分词的角度来看,这两种切分标准之间的差距在于被大标准除考虑到词汇的语法特征之外,还兼顾了词的语义特征。但从语义研究的角度来看,这些语义特征并不完备,不过一些更细节的词性可划归到其父类之中。
除此之外,表中还有一个问题需要澄清,即“附加类别”种的各个子类。下面由简而繁逐个说明。
- 成语和习用语。这是中文的特有词汇类别,但该种方式与句子解析和词汇切分无关,本书中基本遵循这样的原则:成语基本都作为一个完整的词进行切分;习用语有的仅包含一个词,就作为词来切分,有的是一个句子,就逐词进行切分。
- 语素和前后缀。
- 语素。语素是构成词的最小单位,其粒度小于词汇。是否需要进行切分可根据用户需求,从语言处理的角度来看,语素级别的切分使用范围并不大。例如,“毛泽东”在《北大标准》中常切分为:“毛/泽东”。本书建议作为一个完整的词来对待。
- 前后缀。比较典型的前/后缀包括:初(初一)、阿(阿姨、阿爸)、老(老先生)、第(第一、第二)、儿(花儿)、们(男人们、同志们)。这要根据实际情况来做处理。其切分标准按照前/后缀的【能产型】和【语义完整性】两个标准来切分。例如,“初一”的“初”作为前缀,能产性较弱,不予切分;“们”的能产性比较强,硬座切分,但也不绝对。“人们”的语义完整性更强,可不做切分。
有关更多的切分细节可参照前文给出的相应文档,并结合自身的需求,指定切分规则。
1.2 两种分词标准
由于语素对词汇的构成也产生影响,实际应用中,汉语分词也分为两个粒度。粗粒度分词:将词作为语言处理最小的基本单位进行切分。细粒度分词:不仅对词汇进行切分,也要对词汇内部的语素进行切分。
例如,原始串:浙江大学坐落在西湖旁边。
- 粗粒度:浙江大学/坐落/在/西湖/旁边。
- 细粒度:浙江/大学/坐落/在/西湖/旁边。
粗粒度将“浙江大学”看作一个完整的概念,对应一个完整的词汇,进行切分。而细粒度则不同,除将“浙江大学”完整切分出来之外,还要将构成“浙江大学”的各个语素切分出来:浙江/大学。
常见的例子还有很多,如“中华人民共和国”,粗粒度的分词就是“中华人民共和国”,细粒度的分词可能是“中华/人民/共和国”。一般细粒度切分的对象都为专有名词。因为专有名词常表现为几个一般名词的合成。
在实践中,粗粒度切分和细粒度切分都有其使用的范围。粗粒度切分主要用于自然语言处理的各种应用;而细粒度分词最常用的领域是搜索引擎。一种常用的方案是,在索引的时候使用细粒度的分词以保证召回,在查询的时候使用粗粒度的分词以保证精度。在本书中,如果未加特别的说明,则都为粗粒度分词。
1.3 歧义、机械分词、语言模型
现代汉语的复音词结构,使少量的字符(4000多个)通过排列组合来表示大量的词汇(100万个以上),而中间有没有标点的分隔,最容易出现的问题是歧义问题。歧义问题在汉语中普遍存在,长久以来歧义切分问题一直是中文分词的核心问题之一。对此,梁南元等已经做过广泛和深入的研究。下面给出几种重要的歧义切分的研究成果。
定义 7-1(交集型切分歧义)汉字串AJB称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串),则此时汉字串J称作交集串。(梁南元 1987)
例如,交集型切分歧义:“结合成”。
其中,A = “结”,J = “合”,B = “成”。
一种切分为:(a)结合|成;另一种切分为:(b)结|合成
这种情况在汉语文本中非常普遍,如“大学生”、“研究生物”、“从小学起”、“为人民工作”、“中国产品质量”、“部分居民生活水平”等。为了刻画交集型歧义字段的复杂结构,梁南元还定义了链长的概念。
定义 7-3(组合型切分歧义)汉字串AB称作多义组合型切分歧义,如果满足A、B、AB同时为词。
例如,多义组合型切分歧义:“起身”。在如下两个例子中,“起身”有两种不同的切分:(a)他站|起|身|来。(b)他明天|起身|去北京。类似的,“将来”、“现在”、“才能”、“学生会”等,都是组合型切分歧义字段。
梁南元(1987a)曾经对一个含有48092字的自然科学、社会科学样本进行统计,结果交集型切分歧义有518个,多义组合型切分歧义有42个。据此推断,中文文本中切分歧义的出现频度约为1.2次/100字,交集型切分歧义与多义组合型切分歧义的出现比例约为12:1。
有意思的是,据文献【刘挺等,1998a】的调查却显示了与梁南元截然相反的结果:汉语文本中交集型切分歧义与多义组合型七分歧义的出现比例约为1:22.孙茂松认为,造成这种情形的原因在于,定义7-3有疏漏。因此孙茂松等(2001)曾猜测,加上一条上下文语境限制才真正反映额连梁南元的本意。
定义7-3‘(多义组合型切分歧义)汉字串AB称作多义组合型切分歧义,如果满足(1)A、B、AB同时为词;(2)文本中至少存在一个上下文语境 c,在 c 的约束下,A、B在语法和语义上都成立。
上文均来自《统计自然语言处理》——宗成庆著
针对上述问题,人们设计了早期的【机械分词】系统。机械分词系统都是基于最大匹配方法作为最基本的分词算法。该方法有苏联汉俄翻译学者提出,也称为MM(The Maximum Matching Method)方法。
其基本思想如下。
- 假设自动分词词典中最长词条所含汉字个数为1,则取被处理材料当前字符序数中的1个字作为匹配字段,查找分词词典。
- 若词典中有这样的一个 I 字词,则匹配成功,匹配字段作为一个完整的词被切分出来。
- 如果词典中找不到这样的一个 I 字词,则匹配失败。
- 匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,回到上述步骤,重新匹配。
- 如此进行下去,直至切分到成功为止,即完成一轮匹配,并切分出一个词。
- 之后再按上述步骤进行下去,直到切分出所有词为止。
例如,现有短语”计算机科学和工程“,假设词典中最长词为7字词,于是先取”计算机科学和工“为匹配字段,来匹配词典,由于词典中没有该词,古匹配失败;去掉最后一个汉字成为”计算及科学和“作为新的匹配字段,重新匹配词典,同样匹配失败;
取”计算机科学“作为先的字段拉匹配字典,由于词典中有“计算机科学”一词,从而匹配成功,切分出的第一个词为“计算机科学”。以此类推,直至切分出第二、三……个词。
使用MM方法切分的精度并不高,很难达到实际应用的要求,随着语料的增大,误差也逐渐变大。之后人们又基于此方法提出了双向匹配法。该方法是从最大匹配方法发展而来的,分为正向最佳匹配法和逆向最佳匹配法。
它们的基本原理都是相似的。
- 将待分析的汉字串与机器词典中的词条进行最大匹配,若再词典中找到某个字符串,则匹配成功(识别出一个词)。
- 所不同的是,两个算法的搜多方向相反。
- 待处理的字符串中存在着交叉歧义,因此两种方法所得的结果必然不同。
- 当然,基于最大匹配的搜索方法还存在着局限性,比如正向最大匹配,因为只能正向地找出最长地词,而不能找出所有地候选词条。
- 因此,后来发展出了双向扫描法来更快速地检测出歧义产生的位置。
这类早期的分词器因为没有考虑到词汇上下文的相关性,分词的精确度都不高。基于正向最大匹配算法的分词器的准确度为78%;召回率为75%;F1值约为76%。后来改进的双向匹配算法的最高精度也在80%左右徘徊。显然这不能满足高精度文本处理的需求。
基于机械方法的分词器虽然没有得到广泛的应用,但是却揭示了一个重要的语言规律:一个词汇的出现与其上下文环境中出现的词汇序列存在着紧密的关系,如果过算法不能反映和处理这种上下文依赖关系,则不能最终达到满意的分词结果。
2. 系统总体流程与词典结构
2.1 概述
2.2 中文分词流程
HanLP词典下载地址:https://github.com/hankcs/HanLP/releases。
HanLP详细介绍网址:https://github.com/hankcs/HanLP
HanLP源码网址:https://github.com/hankcs/HanLP
本算法的所需的词典位于data/dictionary/目录下。
(1)在第一个环节,系统读取待分词的字符串。
(2)根据输入的配置信息,导入相应的词典。
(3) 进入粗分阶段。
- 首先对句子进行字符级切分,即将输入额句子切分为单个UTF-8编码的字符数组(函数 toCharArray()),包括单个中文字符、单个英文字符、其他单个字符等。
- 一元切分
- 二元切分
- Nshort算法计算
- 对粗分结果执行后处理应用规则,识别事件类专有名词。
(4)进入未登录词识别阶段,使用隐马尔科夫链语言模型。
- 根据人名识别词典,将粗分的结果与之匹配,Viterbi算法识别外国的人名。
- 根据地名识别词典,将粗分的结果与之匹配,Viterbi算法识别地名。
- 根据组织机构名词典,将粗分的结果与之匹配,Dijkstra算法识别组织机构名。
(5)将命名实体识别后的分词结果加入词图中,对词图再次进行分词(Dijkstrra 最短路径法)。该阶段为细分阶段。
(6)使用词性标注模型,Viterbi算法,对分词结果进行词性标注:
- List item
该部分将在第四章介绍。
(7)转换路径为分词结果,并输出分词的结果。
2.3 分词词典结构
系统公有7个不同的词典(包括语言模型)放置于Data目录下。HanLP词典结构如下。
词典文件 | 说明 |
---|---|
CoreNatureDictionary | 一元语言模型词典 |
CoreNatureDictionary.ngram | 二元语言模型词典 |
person/nr.txt.trie.dat | 人名识别词典——中国人名 |
person/nr.txt.value.dat | 人名识别词典——中国人名 |
person/nrf.txt.trie.dat | 人名识别词典——译名 |
person/nrf.txt.value.dat | 人名识别词典——译名 |
person/nrj.txt.trie.dat | 人名识别词典——日本人名 |
person/nrj.txt.value.dat | 人名识别词典——日本人名 |
place/ns.txt.trie.dat | 地点识别词典 |
place/ns.txt.value.dat | 地点识别词典 |
organization/nt.txt.trie.dat | 组织机构名词典 |
organization/nt.txt.value.dat | 组织机构名词典 |
(1)一元语言模型词典也被称为核心词典,文件名为CoreNatureDictionary,系统提供了一个文本版本和一个二进制版本的文件。打开文本版本的文件,截取词典的片段内容如下。
一下 m 2 d 1
一下子 m 2 d 1
一不做 nz 6
一元语言模型词典的第一列是词,第二列是该词的第一词性,第三列是对应该词性的词频,;如果存在第四列,则是对应该词的第二次性,第五列是对用第二词性的词频;之后以此类推。
CoreNatureDictionary是算法的核心词典,其他各个词典都从此词典衍生而来。而且,一元语言模型词典的大小代表了系统的规模,即这个词典越大,所包含的词汇就越多,能够正确分词的语料范围就越大。一般可用的、最小的中文分词器,其核心词典的规模不能够少于30万词。
(2)二元语言模型词典的文件名为CoreNatureDictionary.ngram,系统提供了一个文本版本和一个二进制版本的文件。打开文本版本的文件,截取词典的片段内容。
一@一对一 5
一@一道 5
一@丁 6
一@七旬 8
一@万 157
一@万亿 4
二元语言模型词典的结构第一列表示两个相邻词,用@进行分隔。例如,“一@万”表示前一个词是“一”,后一个词是“万”,它们用“@”连接起来。第二列是该相邻词(共现词)在语料库中出现的概率,如上例为157次。
二元语言模型词典本质上构建出一个二维的矩阵,而且是一个方阵。矩阵的行和列就是一元词表的长度。第一列的前一个词相当于矩阵的行索引,后一个词相当于矩阵的列索引,取值为矩阵词频(“Frequency”)。因此,这个矩阵非零元素的数量充分展示了词汇的搭配信息。因为这个矩阵比较大,所以以一维列表的方式显示出来。
如果把一元语言模型词典和二元语言模型词典合在一起看,它们也可看作一个图(Graph)。其中图的顶点为一元语言模型词典中的词;二元语言模型词典的每个相邻词为连接两个顶点的一条边,词频为边的权值。它们共同沟中了Graph这个完整的数据结构。整个Nshort算法就是对这个图计算最大概率额过程
2.4 命名实体的词典结构
人名、译名、地名、机构名的识别词典均由两个文件构成,后缀名分别为 trie.dat 和 value.dat 。下面仅以人名识别词典为例,简单讲解命名实体识别一元词典和二元词典的数据结构。后缀名为trie.data的词典是一元辞典,人名词典的截图如下。
郎 B 228 D 22 E 12 K 4 C 1 L 1
郏 B 4
郑 B 3505 C 21 E 20 D 5
词典的数据结构与CoreNatureDictionary词典相同,第一列为词汇,第二列为第一个原模式标签,第三列为第一个原模式标签的词频;第四列为第二个原模式标签,第五列为第二个元模式标签的词频;之后依此类推。元模式位于 package com.hanks.hanlp.corpus.tag包的枚举列表NR
中。
元模式标签