一种基于词典的中文分词法的设计与实现摘要:中文分词就是把没有明显分隔标志的中文字串切分为词串,它是其他中文信息处理的基础,广泛应用于搜索引擎、自动翻译、语音合成、自动分类、自动摘要、自动校对等领域。
就中文分词的基本方法作了简单阐述,并介绍了一种基于词典采用最大匹配法实现中文分词的方法。
关键词:中文分词;词库索引;正向最大匹配法1 中文分词中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
1.1中文分词方法的种类中文自动分词方法有多种,一般来说大致可归结为以下三大类:基于词典的分词方法、基于统计的分词方法、基于规则和基于统计相结合的分词方法[2]。
1.1.1基于词典的分词方法。
基于词典的分词方法,又叫做基于字符串匹配的分词方法。
其基本思想是:事先建立词库,其中包含所有可能出现的词。
对于给定的待分词的汉子串Str,按照某种确定的原则切取Str 的子串,若该子串与词库中的某词条相匹配,则该子串是就是词,继续分割其余的部分,直到剩余部分为空;否则,该子串不是词,转到上面重新切取Str的子串进行匹配。
1.1.2基于统计的分词方法。
基于词典分词方法要借助词典来进行,而中文的构词非常灵活,词的数目几乎是无限的,因此要构造完备的词典几乎是不可能的。
鉴于上述分词方法存在的这些缺点,一种基于统计的分词方法应运而生。
这种方法撇开词典,根据字串出现的频率来判断这个字串是否是词。
该方法对于大的语料,分全率还可以,但是对于小的语料分全率就比较低。
该方法的另一个缺点就是不够准确,有些经常一起出现的单字构成的字串其实不是词。
但是由于出现的频率很高,就被分出来当作词处理了,而且这样的“词”还非常多, 例如“这一”、“之一”、“有的”、“我的”、“许多的”等。
实际应用的统计分词系统都要使用一部基本的分词词典进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
1.1.3基于规则和基于统计相结合的分词方法。
该方法首先运用最大匹配作初步切分,然后对切分的边界处进行歧义探测,发现歧义,最后运用统计和规则相结合的方法来判断正确的切分[4]。
运用不同的规则解决人名、地名、机构名识别,运用词法结构规则来生成复合词和衍生词。
日前这种方法可以解决汉语中最常见的歧义类型:单字交集型歧义。
并对人名、地名、机构名、后缀、动词/形容词重叠、衍生词等词法结构进行识别处理,基本解决了分词所面临的最关键的问题。
若词典结构和算法设计优秀,分词速度将非常快。
1.2分词中的难题有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。
中文是一种十分复杂的语言,让计算机理解中文语言更是困难。
在中文分词过程中,有两大难题一直没有完全突破。
1.2.1歧义识别。
歧义是指同样的一句话,可能有两种或者更多的切分方法。
例如:“表面的”,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面的”和“表面的”,这种称为交叉歧义,像这种交叉歧义十分常见。
“化妆和服装”可以分成“化妆和服装”或者“化妆和服装”。
由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必需根据整个句子来判断了。
例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。
这些词计算机又如何去识别?如果交叉歧义和组合歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。
真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。
例如:“羽毛球拍卖完了”,可以切分成“羽毛球拍卖完了”、也可切分成“羽毛球拍卖完了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。
1.2.2新词识别。
新词,专业术语称为未登录词。
也就是那些在字典中都没有收录过,但又确实能称为词的那些词。
最典型的是人名,人可以很容易理解句子“刘雷虎去广州了”中,“刘雷虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。
如果把“刘雷虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。
即使这项工作可以完成,还是会存在问题,例如:在句子“刘雷虎头虎脑的”中,“刘雷虎”还能不能算词?新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,特别是对搜索引擎来说,分词系统中的新词识别十分重要。
目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
2 基于词典的正向最大匹配中文分词法设计与实现2.1算法设计最大正向匹配法(Maximum Mathching Method)通常简称为MM法。
其基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。
若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。
如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理…… 如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。
这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。
其算法描述如下:2.1.1初始化当前位置计数器,置为0;2.1.2从当前计数器开始,取前2i个字符(一个汉字两个字符)作为匹配字段,直到文档结束;2.1.3如果匹配字段长度为0,则当匹配字段的最后一个字符为汉字字符时,当前位置计数器的值加2,否则当前位置计数器的值加1,跳转到步骤2.1.2;如果匹配字段长度不为0,则查找词典中与之等长的作匹配处理。
如果匹配成功,则:a.把这个匹配字段作为一个词切分出来,放入分词统计表中;b.把当前位置计数器的值加上匹配字段的长度;c.跳转到步骤2.1.2。
否则:a.如果匹配字段的最后一个字符为汉字字符,则把匹配字段的最后一个字去掉,匹配字段长度减2,跳转至步骤2.1.3;b.如果匹配字段的最后一个字符为西文字符,则把匹配字段的最后一个字节去掉,匹配字段长度减1,跳转至步骤2.1.3。
2.2词库组织由于采用的是基于词典匹配的分词方法,因而词库是分词系统的基础。
整个分词过程实际上就是在词典上的查找匹配的过程,因而词库的组织相当重要。
假设词典存放在一个文本文件里,每一个词条由两项组成,一个是词的wordID、另一个是词本身。
那么可以在词典上加上静态索引,进行分组管理并在上面添加三级索引[1]。
首先对词条按字数分组,字数相同的词条放在同一组里,并对词典按首汉字的内码从小到大排序。
一级索引是加在各个分组上,一级索引记录了各分组的开始位置,再根据下一分组的起始位置可以确定当前分组的终止位置。
二级索引是加在一级索引内部的,在同一组内部由于有很多的词条,二级索引是按词的首汉字内码建立的,它加在以不同汉字开头的词条组中,这样通过二级索引可以进一步缩小查找范围。
另外在汉字中以有些字开头的词条过多,这样进行匹配的次数过多,不利于提高匹配速度。
因而在二级索引的基础之上添加一个三级索引,它是按照一定的密度间隔添加,我设定了一个默认的合理的值就是每隔50个词条添加一个三级索引,同样三级索引也是根据汉字内码添加的(三级索引和二级索引的定义相同)。
词条及索引的定义如下://根据汉字内码建立的索引结点(二级和三级索引)typedef struct CodeIndexNode{char KeyValue[17];int nIndex;}CodeIndex;//根据词语字数建立的一级索引结点typedef struct WordsIndexNode{int nKeyCount;int nKeyBeginIndex;int nKeyEndIndex;int CodeIndexCount;}WordsIndex;//关键字结点typedef struct KeyWordNode{CString strKeyWord; //关键字int nID; //关键字ID};2.3 切分方法由于采用的是基于词库匹配的正向最大匹配算法(通常简称为MM法),设D为词典,MAX 表示D中的最大词长,str为待切分的字串。
MM法是每次从str中取长度为MAX的子串与D中的词进行匹配。
若成功,则该子串为词,指针后移MAX个汉字后继续匹配,否则子串逐次减一进行匹配。
2.3.1读取词库,并读取相应的静态索引,建立词库上的索引;2.3.2读取待切分的字串str;2.3.3从待切分字串str中取出一个长度为MAX的子串substr,到词典中去匹配,若匹配成功则取下一个长度为MAX的子串进行匹配,否则将子串sstr从后面截去一个字后继续匹配,直到匹配成功或者子串substr中只有一个字为止。
若匹配成功则从匹配成功的词的位置开始再截取下一长度为MAX的子串substr进行匹配,依次循环直到将str串匹配完为止。
2.3.4匹配过程:首先根据子串substr的长度(这里指的是字数)确定一级索引也就是确定分组,这个过程可以二分查找法,也可以采用Hash函数直接定位,但是由于分组数很少(不会超过20)因而两种方法没有多大的区别。
在确定了分组后再根据首汉字的内码确定二级索引,因为二级索引是按内码从小到大的顺序因而可采用拆半查找方法,找到以后再确定三级索引,这样将进行匹配的过程缩小到一个很小的范围,在这个范围内匹配不成功则进行下一个串的匹配。
通过确定三级索引确定了进行匹配的最小词条集。
2.4 切分结果的保存由于数据量很大,切分结果不能全存放在内存中,所以每处理完一文档就将其切分结果存放到外部文件中,这里可以借助其它关系型数据库来完成,在数据库中存放的字段主要有:文档ID、词ID、词权值等。
2.5存在的问题及改进。
2.5.1在词库组织方面采用静态的索引不利于词库的变化,若有一新词出现,则需要重建整个词库的索引,因为下标都发生了变化,这不利于词库的扩充。
因而词库的索引可采用动态生成,在读取词库的同时构建索引,但是这种方法对于查询器会产生一个不利影响,因为查询器也需要读取词库而构建索引的过程比较费时间,这样用户查询时会有一定的延时,所以应根据需要采用一种折衷的办法。
2.5.2词的ID分配机制也有些不足,这里的ID都是跟词的内码相关,也就是跟词在词库中的排序顺序有关,这样若有新词添加进来后,就会改变其后面所有词的ID。