基于既定词表的自适应汉语分词技术研究
基于既定词表的自适应汉语分词技术研究
黄水清 程冲
[摘要] 本文提出了一种汉语分词算法。在给定的分词词表的基础上进行汉语分词时,不但能成功切分出分词词表中已有的词,而且能同时自动识别出分词词表中没有的词,即未登录词。与逆向最长匹配法以及其他未登录词识别算法进行的测试比较表明,该分词算法可以有效地解决大多数未登录词的识别问题,并且能减少分词错误,同时对分词算法的效率基本没有影响。
[关键词] 自动分词 新词识别 未登录词
[分类号] TP391
Study of self-adaptive matching method in Chinese segmentation based on decided vocabulary
Huang Shuiqing, Cheng Chong
[Abstract] This paper proposes an algorithm of self-adaptive matching method in Chinese segmentation. This algorithm not only identifies Chinese words successfully which are in vocabulary but also automatically identifies unlisted words which are not in vocabulary on basis of decided vocabulary. The test which compares this algorithm with Reverse Maximum Matching Method and some methods which identify unlisted words proves that it can resolve unknown words segmentation effectively, decreases mistakes of Chinese segmentation and hasn’t effect on efficiency of Chinese segmentation largely.
[Keywords] automatic segmentation; new word identification; unlisted words
<!--[if !supportEmptyParas]--> <!--[endif]-->
1 导言
汉语自动分词的方法大致分为两类:一类是基于词表、词库的匹配和词频的统计的方法,另一类是基于句法、语法分析,并结合语义进行分词的方法。词表分词法的最大缺陷是未登录词的识别与分词歧义问题无法解决。而在真实文本中(即便是大众通用领域)未登录词对分词精度的影响超过了歧义切分,未登录词的处理在实用型分词系统中至关重要 [1]。
未登录词大致包含两大类:1)新词,即涌现的通用词或专业术语等;2)专有名词,如中国人名、外国译名、地名、机构名等[2]。针对专有名词,可建立专名资料库,根据这些已有的资源统计出各姓氏、人名、地名用字的概率,在未登录词出现的句子中再以动态规划的方法求出可能最佳的专名[3]。但其不足之处是所依据的大规模语料库建设不易[3]。无须大规模语料库支持的未登录词识别解决方案主要有:利用上下文的限制成分识别专名[4];两趟分词,在“分词碎片”中计算单字成词概率和未登录词概率[5];有穷多层列举法,通过建立单字词和多字词表(不包括双字词),结合特殊的切分方法实现[6];通过特征词不断细分字串,随后逐步压缩含有未登录词的子串直至不能从中切分出已登录词[7]。此外还有标记规则[8]、决策树[9]、分解与动态规划[10]等方法。
实际使用的分词系统都是把使用词表的机械分词作为一种初分手段,再利用其它的词类信息来进一步提高切分的准确率,包括未登录词的识别[11]。
本文提出了一种在机械分词过程中能同时识别未登录词的算法,在不需要大规模语料库和专名资料库支持也无须借助其它词类信息的情况下自动判断并适应新出现的未登录词,故称之为“自适应汉语分词算法”。对中国期刊网收录文献的检索未发现思想相同的算法。文献调研还表明,已知的算法一般都是在机械分词之后再单独处理未登录词,把分词的“残片”作为未登录词的侯选对象,根据残片字串的互信息量或是词性标注或是上下文统计量等来辅助识别,确定是否是未登录词。自适应汉语分词算法不做初分,而是边进行机械分词边识别未登录词。笔者在计算机上实现了该算法,并以100篇计算机类的文章为测试集,对比分析了该算法与普通逆向最长匹配法以及其他几种识别未登录词的算法的分词结果。测试表明,该算法确实能有效地识别出许多的未登录词,且可以大大减少分词错误。
2 术语
依据自适应汉语分词算法的算法思想,结合汉语字、词、句的特性及分词规范[12] [13] [14],我们对本文要用到的所有与汉语分词有关的概念分别定义如下。
2.1 字符串
汉字字符、英文字母与阿拉伯数字的任意混合序列。设有字符串S=C1C2 C3 …… Cn,则S所包含的字符总个数n,称为字符串S的长度,记为:LENs=n。如字符串“3个QQ用户”的长度即为6。
2.2 词
汉语文献中能独立、完整地表达语义,且语义上不可再作分割的字符串。所谓“语义上不可再作分割”,是指词在字面上也许还可以再进行分割,但在语义上则坚决不允许再分割。如近日媒体中出现频率很高的词“苏丹红”,字面上可以再分割成“苏丹”与“红”两个词,但若作这样的分割则语义完全改变,完全不能表达原词的语义。故,“苏丹红”符合词的定义。
在汉语分词过程中,绝大多数词已收入分词词典。只有少部分词未收入分词词典,即所谓的未登录词。换而言之,绝大多数词已经是分词词典集合中的元素,少部分词(即未登录词)目前还不是分词词典集合中的元素。考虑到分词词典需要不断地维护,不断地补充新发现的未登录词。因此,我们也可以说,词就是分词词典集合中的元素,或者目前已经是,或者将来是。
2.3 词组
词与词的复合体,由两个或两个以上的词组成的字符串。假设分词词表中已有“社会主义”与“政治经济学”两个词,则字符串“社会主义政治经济学”便是词组。
2.4 子句
从汉语文献的句子中抽取出来的、由标点符号分隔的字符串。子句是汉语文献分词的初始对象。
2.5 短语
子句经分词算法的若干次处理后,已切分出若干个词之后的剩余部分。某些时候也可称作“残片”。如子句“在王小波辞世八年之后”,当“在”被切分出来后,剩下的“王小波辞世八年之后”便可称为短语;当“王小波”再被切分出来后,剩下的“辞世八年之后”便可称为短语。
3 自适应汉语分词算法的原理
根据语言学常识可知,无论是复合句还是简单句,都是由词构成的,而且,子句其实也是词组,不过是所包含的词的个数比一般的词组更多的大词组罢了。同样,短语也是词组,是所包含的词的个数比子句少一些的词组。
设有子句或短语字符串S,按照上述定义与分析,S应该是由若干个词组成的词组,记为S=W1W2W3……Wi……Wn。其中W1、W2、W3、……、Wi、……、Wn 均为由形式、个数不等的字符组成的词。
设Wi是分词词表中没有收录的未登录词。则,根据上述定义与分析,Wi的左方和右方必然各存在一个词,可分别记为Wi-1和Wi+1(Wi-1与Wi+1的其中之一也可以为空,即Wi可以是S的边界词)。因此,只要能从S中成功切分出Wi-1和Wi+1,就能据此判断介于Wi-1与Wi+1之间的字符串就是一个未登录词。这就是自适应汉语分词算法的基本原理。人在阅读中遇见生词时,其实就是按这种方法判断词与词的分界的。
以逆向匹配法为例,从句尾开始切分,通过若干次切分,可以从S中依次切分出Wn、Wn-1、Wn-2、……、Wi+1。记从短语字符串S中切分出Wn、Wn-1、Wn-2、……、Wi+1剩下的短语字符串为Si,此时要做的就是判断Si最右侧的字符中的哪些字符可以组成一个新词。
首先,跳过Si最右侧的两个字符,对剩下的短语字符串试着用逆向匹配法看看能否再切分出词表中的一个词。若能,Si最右侧的两个字符可能是一个未登录词。
然后,跳过Si最右侧的三个字符,对剩下的短语字符串试着用逆向匹配法看看能否再切分出词表中的一个词。若能,Si最右侧的三个字符可能是一个未登录词。
依此再跳过Si最右侧的四、五、……个字符,直至达到词表中的词的最大词长。这样,可能得到若干个候选未登录词。
之所以一开始就跳过两个字符,而不是从一个字符开始处理,是因为一般情况下未登录词不会由单个字符组成。
如何判断这些候选未登录词中的哪个可以确定为未登录词?首先计算所有候选未登录词在该文献中出现的频次及所有候选未登录词的词长LEN,然后按以下未登录词选取规则执行:
①若所有候选未登录词的频次不等,取频次最大者作为未登录词;若有多个候选未登录词的频次相同且均为最大,从中取LEN最大者为未登录词。
②若所有候选未登录词的频次完全相同,则:当频次大于1时取LEN最大的词为未登录词,否则(即频次等于1)取LEN最小的词为未登录词。
4 自适应汉语分词算法的流程
自适应汉语分词算法与一般的汉语词表分词法一样,既可以按正向分词的方法从子句句首开始至句尾结束,也可以按逆向分词的方法从子句句尾开始至句首结束。下面列出的流程是逆向最长自适应汉语分词算法流程,正向自适应分词算法流程与此类似。
①从汉语文献中获得一个子句或短语S(以下统称短语),作为算法的待处理对象。
②循环执行以下切分过程,对短语尾部作词切分
a. 应用逆向最长匹配法,从短语尾部切分出一个词,得到新的短语S。
b. 若短语长度LENS无任何变化(即没有切分出任何词),或者短语长度LENS小于等于零(即短语已全部切词结束),则结束循环,执行③,否则继续执行循环。
③若经过上述处理后的最新短语S的长度LENS小于等于零,则全部词已切分完成,算法结束。
④若LENS小于等于某个给定的阈值,则可以认定S为一个新词,同样全部词已切分完成,算法结束。
⑤对整数n赋值2。
⑥循环执行下述步骤,直至n大于预先设定的词表中的词长度的最大值。
a. 从S尾部去除n个字符,剩余的字符串记为S-n。
b. 对字符串S-n用逆向最长匹配法,试图找出一个词。
c. 若成功,则先把S尾部的n个字符列入候选新词列表WordList,记此候选未登录词为Wordn,并统计其在原文中的词频freqwordn 和词长度LENwordn。
d. n赋值n+1。
⑦按上文的未登录词选取算法规则从WordList中选取并确定未登录词。
⑧从S-n中去除未登录词和第⑥步中的第b段逆向最长匹配法找到的词后得到新的字符串。
⑨转②。
5 自适应汉语分词的算法实现
5.1 自适应汉语分词主算法
private void AdpativeMatchingMethod(string sentenceStr)
{ //如果字符片断长度小于等于MINLEN,就把它当作词,ARMMWords为切出的词的总集合
if(Len(sentenceStr))<=MINLEN) ARMMWords.Add(sentenceStr);
while(sentenceStr!=""||Len(sentenceStr)>MINLEN)
{ //利用逆向最长匹配切词函数RMMCutWord()切词,其实现方法略
//sentenceStr是需要处理的子句
//cuttedStr为切出的词集合
//RestStr为剩下尚未处理的子串
RestStr=RMMCutWord(sentenceStr,out cuttedStr);
//如果剩下的字符片断长度小于MINLEN,则就认为它是一个候选词
if(Len(RestStr)<=MINLEN)
{ //如果逆向最长匹配切词完全可以进行,则往切出的词集合里添加
for(int icount=0;icount<cuttedStr.Count; icount++)
ARMMWords.Add(cuttedStr[icount].ToString());
ARMMWords.Add(RestStr);
}
else //自适应分词法找词,一边是词,另一边可能是词
{ for(int icount=0;icount<cuttedStr.Count; icount++)
ARMMWords.Add(cuttedStr[icount].ToString());
//逆向切词无法结束整个过程,则选择自适应分词法切词
RestStr=ARMM(RestStr);
} //if
} //while
} //Private
5.2判断是否未登录词
private string ARMM(string WordStr)
{ //跳过MINLEN个字符后逆向取词
waitToProStr=WordStr.Substring(0,WordStrLen-countNum);
while(countNum<WordStrLen)
{ // RMM(),利用逆向最长匹配方法试图匹配一个词(此方法为常用的方法,略)
if((tempStr=RMM(waitToProStr,out tempint ,out cuttedStr))==waitToProStr)
{ //如果匹配不成功,则多跳过一个字符
countNum++;
waitToProStr=WordStr.Substring(0,WordStrLen-countNum);
}
else
{ //跳过的那countNum个字符可能是词
beAbleWord=WordStr.Substring(WordStrLen-countNum,countNum);
//往集合中添加候选未登录词
words.Add(beAbleWord);
//此时还没完,再继续向左方判断是否还有其它候选未登录词
countNum++;
waitToProStr=WordStr.Substring(0,WordStrLen-countNum);
} //if
} //while
// ChooseUnlists(利用统计规则对候选未登录词进行筛选,方法略)
ChooseUnlists(words);
Return tempStr;
} //Private
6 试验与评价
笔者已将上述逆向自适应分词算法用.NET平台下的C#语言实现。笔者使用了三部词表:专业词表为计算机专业词表,共有16052词;通用词表为商务印书馆2002年版的《现代汉语词典》,共有44049词;停用词表则有7666词。程序运行环境为Windows 2000 Server操作系统和SQL Server 2000数据库管理系统平台,实验数据为来自于http://www.csdn.net、http://www.ccw.com.cn、http://www.pcworld.com.cn等的时文100篇,共4312个语句。分别按照逆向最长匹配法和自适应汉语分词法对这些语句进行分词测试。表1是两种方法切词后得到的切词数量以及切词速率对比。
表1 逆向最长匹配法与自适应汉语分词法切词数量以及切词速率对比
<!--[if !supportEmptyParas]--> <!--[endif]--> |
切分出的总词数 |
切错词的数量 |
发现的未登录词数 |
切词速率(Kb/s) |
|
逆向最长匹配法 |
39561 |
647 |
0 |
46.21 |
|
逆向最长自适应分词法 |
35424 |
323 |
409 |
43.42 |
|
未登录词识别算法普遍采用召回率(recall)和准确率(accuracy)两个评价指标:
召回率=(正确识别的新词总数/文本中的新词总数)×100%[15]
准确率=(正确识别的新词总数/识别的新词总数)×100%[15]
本次测试新发现的409个未登录词中,识别正确的有366个,识别错误的有43个。另外,测试集中还有23个未登录词未被识别出来。如此可计算出:
召回率=(366/(366+23))*100%≈94.09%
准确率=(366/409)*100%≈89.49%
表2用召回率和准确率这两个评价指标来对比部分未登录词识别算法和逆向自适应分词算法的性能。表中列举的算法采用的测试集都是时文。
表2 各种未登录词识别算法的召回率和准确率
算法名称 |
测试集 |
召回率 |
准确率 |
逆向最长自适应分词法 |
4312句(8万多字) |
94.09% |
89.49% |
基于标记的规则统计模型与未登录词识别算法[8] |
1000句(40483字) |
98.32% |
98.88% |
基于决策树的汉语未登录词识别[9] |
92万字 |
69.42% |
40.41% |
2483字 |
70.97% |
57.63% |
|
基于分解与动态规划策略的汉语未登录词识别[10] |
1500句 |
88.1% |
92.1% |
由于上述数据是对不同的测试集得到的结果,因此并不能用以上的召回率与准确率简单地判断算法的优劣。但,至少可以说明,自适应汉语分词算法在对未登录词的识别方面并不比其它专门识别未登录词的算法逊色。
中国科学院计算技术研究所开发的汉语词法分析系统ICTCLAS,是目前赞誉较多的系统,该系统可实现中文分词、词性标注、未登录词识别。据973专家组测评,该系统分词正确率高达97.58%,未登录词识别召回率高于90%,其中中国人名的识别召回率接近98%[16]。ICTCLAS提供开放使用的动态连接库ICTCLAS.dll,笔者调用这个动态链接库对本文所采用的100篇计算机时文构成的测试集进行了分词。表3列举了两种分词方法对测试集中的若干典型句子的分词结果及逆向自适应分词法发现的未登录词。由于ICTCLAS.dll只给出最后的分词结果(含未登录词),并不单独统计未登录词,所以无法对该次分词计算召回率和准确率。
表3 典型子句ICTCLAS与逆向最长自适应分词法的分词结果比较
子 句 |
ICTCLAS分词结果 |
逆向最长自适应分词法 |
|
分词结果 |
发现的未登录词 |
||
原IBM个人电脑事业部显然根红苗正 |
原/IBM/个人/电脑/事业/部/显然/根/红/苗/正 |
原/IBM/个人电脑事业部/显然/根红苗正 |
个人电脑事业部 根红苗正 |
新联想以技术创新作为立身之本 |
新联/想/以/技术/创新/作为立身/之/本 |
新/联想/以/技术/创新/作为/立身之本 |
立身之本 |
客户还是喜欢个性化的东西 |
客户/还/是/喜欢/个性化/的/东西 |
客户/还是/喜欢/个性化/的/东西 |
个性化 |
当大的产业规律由技术驱动为主变成应用驱为主 |
当/大/的/产业/规律/由/技术/驱动/为主/变成/应用/驱/为主 |
当/大/的/产业/规律/由/技术/驱动/ 为主/变成/应用驱/为主 |
应用驱 |
即便是现在我有了与贺志强面对面聊天的机会 |
即便/是/现在/我/有/了/与/贺/志/强/面对面/聊天/的/机会 |
即/便是/现在/我/有/了/与/贺志强/ 面对面/聊天/的/机会 |
贺志强 |
密罐是没有运行XP sp2或任何反病毒软件的Windows主机 |
密/罐/是/没有/运行/XP/sp2/或/任何/反/病毒/软件/的/Windows/主机 |
密罐/是/没有/运行/XP/sp2/或/任何/反/病毒/软件/的/Windows/主机 |
密罐 |
虽然Palm中文译名为奔迈,但是近两年来却毫不“奔迈” |
虽然/Palm/中文/译名/为/奔/迈/但是/近/两/年/来/却/毫不/奔/迈 |
虽然/Palm/中文/译名/为/奔迈/但是/近/两/年/来/却/毫不/奔迈 |
奔迈 |
从表3可以看出,有好几个ICTCLAS识别错误或没有识别出来的词,自适应分词算法都成功识别出来了。特别是识别出了人名“贺志强”及原始文献中的错词“应用驱”。
由此可见,自适应汉语分词算法确实能识别出许多有效的未登录词,识别出的未登录词既包括新词,也含有专有名词。当然,自适应汉语分词算法切出的词(包括未登录词)也存在若干错误,但是,与逆向最长匹配法相比较,自适应汉语分词算法能大大减少切分错误发生的概率。由表1可以看出,在切词速度上自适应汉语分词算法并不比逆向最长匹配法慢。而且,该算法是在切词的过程中直接识别未登录词,所以在切词的总体效率上要高于对切词剩下的残片进行再识别的其他算法。
7 结语
本文研究的自适应汉语分词算法采用的是这样一种思路:任何汉语语句都是由词构成,在汉语自动分词中碰到一个词表里没有的字符串时,根据此字符串左右两边是否有词来判断该字符串是否就是未登录词。本算法在分词的同时,能结合上下文的信息以及局部统计量自动识别未登录词。实验证明它可以有效的用于汉语文献的词切分,并且可以很大程度上切分出词表里没有的词。它可以发现两类未登录词——新词和专有名词,同时能减少切分错误发生的概率。与此前的算法不同,本算法的侯选未登录词不是分词“残片”,而考虑了它作为词存在应具备的基本特性。本算法思路简明,易于实现,且无需借助其他辅助资源,而且切词的效率与逆向最长匹配法接近。
本算法的最大缺点是基于正向或逆向匹配算法,不能完全避免词表切分时的歧义切分错误。另外,当多个候选未登录词同时出现时,完全以频次与词长作为判断依据,而与语义无关,可能造成未登录词的确定出现偏差。
<!--[if !supportEmptyParas]--> <!--[endif]-->
参考文献:
1 孙茂松,邹嘉彦.汉语自动分词研究中的若干理论问题.语言文字应用.1995(4):40-46
2 孙茂松,邹嘉彦.汉语自动分词研究评述.当代语言学.2001(1):22-32
3 何燕.任意类型的未登录词的识别研究.[学位论文].北京:北京语言文化大学文化学院,2000.
4 宋柔,朱宏,潘维桂等.基于语料库和规则库的人名识别法.见:陈力为.计算语言学研究与应用.北京:北京语言学院出版社,1993:150-154
5 陈小荷.自动分词中未登录词问题的一揽子解决方案.语言文字应用.1999(3):103-109
6 张普,张尧汉.现代汉语“有穷多层列举”自动分词方法的讨论.语言与计算机.1986(3):61-64
7 马光志,李专.基于特征词的自动分词研究.华中科技大学学报(自然科学版),2003(3):60-628
8 苏菲,王丹力,戴国忠.基于标记的规则统计模型与未登录词识别算法.计算机工程与应用,2004(15):43-45,91
9 秦文,苑春法.基于决策树的汉语未登录词识别.中文信息学报,2004,18(1):14-19
10 吕雅娟等.基于分解与动态规划策略的汉语未登录词识别.中文信息学报,2001,15(1):28-33
11 岳涛.汉语自动分词技术的最新发展及其在信息检索中的应用.情报杂志,2005(4):55-57,60
12 朱德熙.语法讲义.北京:商务印书馆,1982
13 刘源,谭强,沈旭昆.信息处理用现代汉语分词规范及自动分词方法.北京:清华大学出版社,1994
14 张春霞,郝天永.汉语分词的研究现状与因难.系统仿真学报,2005,17(1):138-143,147
15 秦浩伟,步丰林.一个中文新词识别特征的研究.计算机工程,2004,30(增刊):369-370,414
16 中国科学院计算技术研究所.中文自然语言处理开放平台.http://www.nlp.org.cn/project/project.php?proj_id=6(访问日期:2005-2-2).
<!--[endif]-->