一种新的中文分词词典结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种新的中文分词词典结构

[摘要] 汉语自动分词是汉语信息处理的前提,词典是汉语自动分词的基础,分词词典机制的优劣直接影响到中文分词的速度和效率。本文首先分析了已有的几种典型词典结构,并在此基础上提出了一种新的分词词典结构―全字哈希词典,提高了中文分词的速度和效率。

[关键词] 分词词典中文分词全哈希

一、引言

汉语自动分词是汉语信息处理的前提,广泛应用于中文全文检索、中文自动全文翻译、中文文语转换等领域。自动分词的基本算法主要分为两大类:基于词典的分词方法和基于频度统计的分词方法。具体应用时的不同算法则是二者不同程度的组合。

针对词典分词方式,前人做了大量工作,并形成了许多汉语词典的组织结构。这些组织结构大体上分成树形结构和表格形结构:文献[1] 介绍了树形结构的构造方法,文献[2]提出了三数组Trie索引树结构,文献[3]提出一种更加优化PATRICIA树;而典型的表格结构有整词二分的和逐字二分的两种,文献[4]详细阐述了这两种表格结构,并与Trie树词

表在分词效率和空间消费方面作了对比,文献[5]使用了分层存储词条的表格结构,使其对于优先切分专有名词效率更佳。文献[6]综合了树形和表格形结构的优点,提出了双字哈希机制的词典结构。对于切分二字词表现出色,采用的是传统Hash方法。总结下来树形结构和表格形结构各有优劣,表格结构词典构造相对简单,占用空间少,容易更新和维护,但是查找词条效率相对较慢;而树形结构构造复杂,占用空间大,难以更改,但是查找词条效率较高。无论哪种结构,基本的词条查找过程都使用了二分查找,某些词典甚至需要多次二分查找,这种方式受数据集范围的影响,当在一个大数据集上进行二分查找其效率难以令人满意,当需要多次二分查找时,其效率甚至难以预测。

本文提出一种全哈希机制的词典结构,既有较高的查找速度(总能以常数级的时间复杂度完成任务)又容易维护。而且与上述任何一种词典都不同的地方是它具有了同义词

的存储结构。

二、全哈希词典结构

该词典包含三级索引,每级索引都用哈希方法实现,其结构下图所示:

图1全哈希词典结构

本结构用三层哈希表嵌套,每层哈希表的键(Key)域

存储该层级索引值。一级索引I1是所有词条的首字哈希值,存储于外层哈希表的键域,每个单元对应一个首字的哈希值,外层哈希表的值(Value)域存放以字C0为首的所有词条。二级索引将以C0为首的所有词条按照词长分类,一种长度的词存储在中层哈希表的一个单元中,该单元键域存放词长,值域存放所有该长度的词条。每个词条经过特定的哈希函数计算,得到唯一的哈希值(一般是整数),这些哈希值构成了第三级索引,存储于内层哈希表的键域;而内层哈希表值域存放的是哈希值相同的词条列表。为了能够将每个词条的同义词合理的植入词典,本文定义了一种特殊结构用来承载每个词条(Wi),该结构包含了词条的文本值,该词条的同义词指针等内容,有关同义词部分将在下一章详细介绍。

查找速度快是哈希表固有的优势,根据哈希值直接匹配的时间复杂度几乎是O(1),这是其它任何算法不能比拟的。而查找词条的主要时间消耗是计算哈希值的过程,哈希算法的优劣是影响查找最重要的因素。

三、哈希算法设计

哈希算法设计应该兼顾以下几个原则:

(1)计算速度快,便于实现。查找词条的过程主要时间消耗在哈希值计算上,哈希算法应尽量减少这一过程的时间复杂度。

(2)散列均匀,尽可能少产生冲突。哈希算法一定为同一个对象产生唯一的哈希值,但不一定为不同的对象产生不同的哈希值,也就是一个哈希值有可能对应多个对象。哈希算法设计应该尽量使哈希值均匀分布在哈希表单元中,即使不能完全避免冲突,也应该使尽量少的对象对应同一个哈希值。

(3)提高桶利用率,节省哈希表占用空间。我们将哈希值相同的对象放在同一个桶中,每个桶对应一个哈希值,所谓桶利用率是指哈希表中已占用的桶数和已分配的桶数

之比。当这个比值超过装载因子时,应该为哈希表分配若干新的单元,哈希算法应该尽量使空桶数较小,提高存储空间利用率。

适用于本词典的分词算法是一种最大正向匹配法,该算法的匹配过程是从左至右读取句子S=C0C1C2C3……中的汉字,在词典中依次查找C0,C0C1,C0C1C2,……直到找到能够匹配的最长词条,每个汉字只需比较一次,先比较C0,接下来比较C1依此类推,而传统的做法是先比较[C0..Ci],若不成功再比较[C0..Ci-1]依此类推,这个词条中的前缀子串重复比较了多次,影响效率。为了避免重复比较,哈希函数设计还应考虑哈希值可累加,即子串S1=C0C1,hash(S1)=V1;子串S2=C0C1C2,hash(S2)=V2;字符C2的哈希值是

hash(C2)=V3;V2=V1 ”+”V3(不一定是算数累加)。每

次计算新串的哈希值,只需计算末尾字符的哈希值,将它累加到已有的前缀旧串哈希值中,不必重新计算整个新串的哈希值。

基于以上考虑,笔者研究了一些经典的字符串哈希算法,它们是RS算法、JS算法、ELF算法、BKDR算法、SDBM 算法、DJB算法、AP算法。根据人们多年的实践经验,ELF 用于计算英文字符串(ASCII码)的哈希值表现较好。本文用开放的中文语料库对以上算法做了对比测试,开放语料库是紫光大词库,该词库包含374993个词条,分别用上述算法计算每个词条的哈希值,将它们插入哈希表,比较哈希函数执行总时间,有冲突的桶数目(一个桶中有两个以上的词条,视为冲突),最大冲突词条数目(一个桶中最多有多少个词条),桶利用率和哈希表占用的存储空间。为了更精确说明桶的使用情况,桶利用率用实际占用的桶数来代替。将构造好的哈希表对象序列化到二进制文件,文件的大小可以反映出哈希表占用的存储空间,虽然序列化过程的附加信息也会保存到文件中,但是仍然可以用于对比每个哈希表的相对大小。本文使用两种方式来分配哈希表单元,一种是静态分配(固定长度),预先分配374993个单元,限制哈希值在此范围内分布;另一种动态分配(不限制长度),使用系统默认的装载因子,当哈希表单元占用率超过装载因子时,系统会分配若干新的单元。实验环境是2.1G双核CUP,2G内

相关文档
最新文档