一种构造用于处理大规模词典的完美哈希函数的方法

文档序号:6564743阅读:115来源:国知局
专利名称:一种构造用于处理大规模词典的完美哈希函数的方法
技术领域
本发明涉及信息检索和自然语言处理技术领域,尤其涉及一种构造用于处理大规模词典的完美哈希函数的方法。
背景技术
在信息检索和自然语言处理等领域的很多应用中都涉及到词典查找,词典查找的速度很大程度上决定了系统的整体性能。例如,集成开发环境(IDE)的保留词识别、编辑器的拼写检查、光学字符识别(OCR)的结果校验、文本处理的中文分词、倒排索引的Post list定位等速度要求都非常高,都需要快速词典查找。完美哈希函数能够将词典的单词快速映射到唯一的整数,不存在冲突,因此是一种理想的词典查找方法。
已经有不少人提出了完美哈希函数的构造策略,但是都不能很好地处理大规模的词典,而且已有的大部分哈希函数都不能处理像汉语这样的大字符集的词典。
如Cichille提出了给单词首尾两字符关联整数,取单词首尾两字符所关联整数和单词长度之和作为单词的哈希值。Cichelli的方法只能处理不超过45个单词的词典。
Cercone提出了词典划分的方法,将词典按照单词长度划分为不同子词典,对单词所有字符均关联整数,再将各子哈希函数合并得到整个词典的完美哈希函数。Cercone的方法可以对1000个以内单词的词典成功构造完美哈希函数。
Gperf是Linux系统下著名的哈希函数构造方法,但是其官方网站提供的最新版本Gperf也不能处理超过15000个单词的词典,尤其是对类似中文的大字符集词典时效果更差。另外,Gperf不能保证每次运行都能找到词典的完美哈希函数,哈希函数的填充因子非常小,导致哈希函数表占用内存非常多。
已有实验表明,对含有15000个词语的中文词典,使用Gperf构造哈希函数构造过程需要大概8个小时,填充因子不到4%。
Sager提出minicycle算法来构造完美哈希函数,他通过对单词所有字符关联整数,从而为每个单词对应一个三元组(h0,h1,h2),并试图找到映射g(0…r)→(0…|K|-1),使得h(key)=h0+g(h1)+g(h2)是一个完美哈希函数。Sager提出的minicycle算法最多也只能处理包含512个单词的词典。
在Sager的工作基础上,Fox改善了单词三元组的生成方式,并提出使用相关图来加速映射过程。Fox对每个字符在每个位置出现关联三个随机数s0、s1和s2,单词对应的三元组的h0、h1和h2分别由单词各字母在相应位置对应的s0、s1和s2之和。得到每个单词的h0、h1和h2之后,Fox以所有单词的h1和h2为顶点,将每个单词对应的h1和h2顶点之间连一条边,构成词典的相关图,在相关图的基础上Fox对每个顶点hi关联一个整数g(hi),使得h(key)=h0+g(h1)+g(h2)是一个完美哈希函数。
Fox的方法最大的缺点在于需要大量的空间保存随机数集合,同时该方法的相关图顶点数为词典单词数量的0.6倍,这些都导致了Fox方法的工作空间(保存哈希函数需要的内存)较大。另外随机数策略不能保证对任何词典均能构造其完美哈希函数。

发明内容
(一)要解决的技术问题有鉴于此,本发明的主要目的在于提供一种构造用于处理大规模词典的完美哈希函数的方法,以成功对包含上百万单词的词典构造完美哈希函数,处理中文等大字符集词典,并提高填充因子,缩短构造时间,减少哈希函数的工作空间。
(二)技术方案为达到上述目的,本发明的技术方案是这样实现的一种构造用于处理大规模词典的完美哈希函数的方法,该方法包括A、将待构造哈希函数的词典中的单词平滑;B、将平滑后词典按照单词长度分为n个子词典,对每个子词典构造相关图,n为自然数;C、对构造的每个子词典的相关图中的顶点进行排序,对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数。
所述步骤A包括采用两个不同的平滑函数,分别将每个单词除首字符外的每个字符平滑为两个字符。
对于单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2为两个平滑函数,f1(ci)和f2(ci)表示由字符ci及其附近字符计算得到的平滑值。
所述平滑函数为自定义的函数,或为根据词典大小和期望填充因子调整相关参数得到的函数。
对于英文词典,所述平滑函数为f(ci)=a(ci-1)2+bci;对于中文词典,所述平滑函数为f(ci)=aci-1+bci;其中a、b为参数。
步骤B中所述每个子词典内所有单词长度相同;步骤B中所述对每个子词典构造相关图包括对单词长度大于1的子词典,以其所有单词最后两个字符为顶点,两个字符出现在同一个单词的最后两个位置,则在这两个字符对应的顶点间连一条边,形成该子词典的相关图。
所述形成该子词典的相关图后进一步包括将各子词典相关图的集合在一起,形成原词典的多级相关图。
步骤B中所述多级相关图,其顶点集合为相应子词典平滑后单词最后两个字符的集合,其边集为相应子词典所有单词的集合。
步骤C中所述对构造的每个子词典的相关图中的顶点进行排序按照类似Prim算法的方式进行,具体包括对各级相关图顶点按照类似Prim算法排序,将度最高的顶点v1排第一,与v1相邻的度最高的顶点v2排第二,与v1或v2相邻的度最高的顶点v3排第三,……,直到该级相关图所有顶点都已经排序。
步骤C中所述对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数包括对各级相关图的每个顶点依次关联一个合适的整数,将与当前顶点相邻的所有单词映射到哈希表空闲地址,即对于单词k=c1c2…cn,平滑后单词形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),对k`各字符关联整数,使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))为完美哈希函数,其中g(f1(ci))和g(f2(ci))分别表示对顶点f1(ci)和f2(ci)关联的整数。
(三)有益效果从上述技术方案可以看出,本发明具有以下有益效果1、利用本发明,通过将待构造哈希函数的词典中的单词平滑,将平滑后词典按照单词长度分为n个子词典(n为自然数),对每个子词典构造相关图,然后对构造的每个子词典的相关图中的顶点进行排序,对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,进而能够对包含上百万单词的词典成功构造完美哈希函数,并且能够处理中文等大字符集词典,填充因子接近1,提高了填充因子,缩短了构造时间,减少了哈希函数的工作空间。
2、本发明提供的这种构造用于处理大规模词典的完美哈希函数的方法,可以对任意大小的词典成功构造完美哈希函数,尤其是对如汉语这样的大字符集上的词典,效果更好。
3、本发明提供的这种构造用于处理大规模词典的完美哈希函数的方法,可以通过调整工作空间大小来调节填充因子,当需要更高的填充因子时只需要更改平滑函数,增加相关图顶点数量即可。
4、本发明提供的这种构造用于处理大规模词典的完美哈希函数的方法,将原始词典划分为若干个子词典,对每个子词典独立构造相关图,因此本发明提供的哈希函数构造方法比Fox等已有方法速度更快。对从北大人民日报语料库上抽取的12万中文词语构成的词典,用本发明提供的完美哈希函数构造方法构造过程仅需4.14秒,工作空间仅为60867个整数,将12万词语映射到13万1千个哈希地址空间。


图1为本发明提供的构造用于处理大规模词典的完美哈希函数的方法流程图;图2为依照本发明实施例对子词典构造的相关图;其中,图2(a)是对子词典K1构造的相关图;图2(b)是对子词典K2构造的相关图;图3为依照本发明实施例各级相关图的顶点排序与关联整数过程示意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
本发明的实现原理如下本发明提供的构造用于处理大规模词典的完美哈希函数的方法,将哈希函数的构造过程分为字符平滑阶段、多级相关图构造阶段、顶点赋值阶段。
在字符平滑阶段,将单词除首字符外的其它每个字符都用两个不同的平滑函数将其平滑为两个字符,对于单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2为两个平滑函数。
在多级相关图构造阶段,对平滑后的词典,按照单词长度分为若干子词典,各子词典内所有单词长度相同。对每个子词典,以其所有单词最后两个字符为顶点,两个字符出现在同一个单词的最后两个位置,则在这两个字符对应的顶点间连一条边,形成该子词典的相关图。各子词典相关图的集合形成原词典的多级相关图。
在顶点赋值阶段,对各级相关图的每个顶点依次关联一个合适的整数,将与当前顶点相邻的所有单词映射到哈希表空闲地址,即对于单词k=c1c2…cn,平滑后单词形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),对k`各字符关联的整数使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn)),其中g(f1(ci))和g(f2(ci))分别表示对顶点f1(ci)和f2(ci)关联的整数。
如图1所示,图1为本发明提供的构造用于处理大规模词典的完美哈希函数的方法流程图,该方法包括以下步骤步骤101将待构造哈希函数的词典中的单词平滑;步骤102将平滑后词典按照单词长度分为n个子词典,对每个子词典构造相关图,n为自然数;步骤103对构造的每个子词典的相关图中的顶点进行排序,对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数。
上述步骤101包括采用两个不同的平滑函数,分别将每个单词除首字符外的每个字符平滑为两个字符。
对于单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2为两个平滑函数,f1(ci)和f2(ci)表示由字符ci及其附近字符计算得到的平滑值。
上述平滑函数为自定义的函数,或为根据词典大小和期望填充因子调整相关参数得到的函数。
对于英文词典,所述平滑函数为f(ci)=a(ci-1)2+bci;对于中文词典,所述平滑函数为f(ci)=aci-1+bci;其中a、b为参数。
上述步骤102中所述每个子词典内所有单词长度相同。上述步骤102中所述对每个子词典构造相关图包括对单词长度大于1的子词典,以其所有单词最后两个字符为顶点,两个字符出现在同一个单词的最后两个位置,则在这两个字符对应的顶点间连一条边,形成该子词典的相关图。
所述形成该子词典的相关图后进一步包括将各子词典相关图的集合在一起,形成原词典的多级相关图。
上述步骤102中所述多级相关图,其每级相关图顶点集合为相应子词典平滑后单词最后两个字符的集合,其边集为相应子词典所有单词的集合。
上述步骤103中所述对构造的每个子词典的相关图中的顶点进行排序按照类似Prim算法的方式进行,具体包括对各级相关图顶点按照类似Prim算法排序,将度最高的顶点v1排第一,与v1相邻的度最高的顶点v2排第二,与v1或v2相邻的度最高的顶点v3排第三,……,直到该级相关图所有顶点都已经排序。
上述步骤103中所述对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数包括对各级相关图的每个顶点依次关联一个合适的整数,将与当前顶点相邻的所有单词映射到哈希表空闲地址,即对于单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),对k′各字符对应顶点关联的整数使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))为完美哈希函数,其中g(f1(ci))和g(f2(ci))分别表示对顶点f1(ci)和f2(ci)关联的整数。
基于图1所述的构造用于处理大规模词典的完美哈希函数的方法流程图,以下结合具体的实施例对本发明构造用于处理大规模词典的完美哈希函数的方法进一步详细说明。
实施例在本实施例中,构造用于处理大规模词典的完美哈希函数的方法也分为三个阶段字符平滑阶段、多级相关图构造阶段和顶点赋值阶段,下面分别详细介绍如下1.字符平滑阶段在相关图中,顶点的度越高,为该顶点关联一个整数越困难,哈希函数的填充因子可能越小。因此,本发明在构造多级相关图之前先对词典所有单词做平滑处理,使得构造的每一级相关图顶点度都较小,并且分布均匀。本发明将单词除首字符外的所有字符都用两个不同的平滑函数将其平滑为两个字符,例如对单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2为平滑函数。f1(ci)和f2(ci)表示由字符ci及其附近字符计算得到的平滑值。平滑函数是用户自定义的函数,对于英文词典,f(ci)=a(ci-1)2+bci是常用的平滑函数;对于中文词典,f(ci)=aci-1+bci是常用的平滑函数,其中a、b是参数。表1显示了词典K={aa,ac,ba,bb,bc,aca,baa,cab,cbc,cca}的平滑结果,令a、b、c的整数id分别为1、2、3,平滑函数分别为f1(ci)=2c1+ci,f2(ci)=ci-1+ci(i≥2)。例如对单词“cab”,f1(‘a’)=2‘c’+‘a’=2×3+1=7;f2(‘a’)=‘c’+‘a’=3+1=4;f1(‘b’)=2‘c’+‘b’=2×3+2=8;f2(‘b’)=‘a’+‘b’=1+2=3;因此,“cab”平滑后为(3,7,4,8,3)。

表12.多级相关图构造阶段对平滑后的词典,本发明将构造多级相关图。多级相关图的构造首先需要将平滑后词典按照单词长度分为若干子词典,每个子词典内所有单词长度相同,对每个子词典构造一级相关图,形成原始词典的多级相关图。对于表1所示的词典,将划分为两个子词典K1={aa,ac,ba,bb,bc}和K2={aca,baa,cab,cbc,cca},每个子词典分别构造一级相关图,每个子词典对应的相关图顶点为平滑后单词最后两个字符的集合,边为子词典所有单词的集合。图2(a)和图2(b)分别是对子词典K1和K2的相关图,其中图中各顶点表示平滑后各字符,下标表示字符在单词中的位置。
3.顶点赋值阶段本发明在顶点赋值阶段首先将所有哈希表地址全部置为“空闲”,然后按照单词长度依次对各子词典处理。对所有字符在第一个位置出现关联随机整数,如表1所示的词典,第一个位置a、b、c字符分别关联1、3和8。对于每一个子词典所构造相关图的顶点进行排序,对排序后的顶点vi依次关联整数g(vi),使得与vi相邻的所有单词映射到哈希表空闲地址,标志这些地址为占用,直到各相关图所有顶点均已经关联合适整数。
对每一级相关图,本发明按照类似于Prim算法的排序方式对相关图顶点排序,度最高的顶点v1排第一,与v1相邻的度最高的顶点v2排第二,与v1或v2相邻的度最高的顶点v3排第三......。图3是图2(a)所示相关图的排序示意图,本发明将按照52、43、33、62、32、23、72、53的顺序对这些顶点关联整数,使得K1={aa,ac,ba,bb,bc}各单词映射到哈希表的不同地址。首先对52顶点关联整数0,43顶点关联整数必须保证将与之相邻的单词“ac”映射到第一个空闲地址(地址1),因此43顶点所关联整数g(43)=1可满足hash(″ac″)=g(11)+g(52)+g(43)=1+0+1=1,标志哈希表地址1为“占用”。同理33顶点应该关联整数g(33)=1才能使单词“ba”映射到第一个空闲地址2......。表2显示了单词平滑后各字符在各位置关联的整数。

表2以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种构造用于处理大规模词典的完美哈希函数的方法,其特征在于,该方法包括A、将待构造哈希函数的词典中的单词平滑;B、将平滑后词典按照单词长度分为n个子词典,对每个子词典构造相关图,n为自然数;C、对构造的每个子词典的相关图中的顶点进行排序,对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数。
2.根据权利要求1所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,所述步骤A包括采用两个不同的平滑函数,分别将每个单词除首字符外的每个字符平滑为两个字符。
3.根据权利要求2所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,对于单词k=c1c2…cn,平滑后形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),f1和f2为两个平滑函数,f1(ci)和f2(ci)表示由字符ci及其附近字符计算得到的平滑值。
4.根据权利要求1所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,所述平滑函数为自定义的函数,或为根据词典大小和期望填充因子调整相关参数得到的函数。
5.根据权利要求2、3或4所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,对于英文词典,所述平滑函数为f(ci)=a(ci-1)2+bci;对于中文词典,所述平滑函数为f(ci)=aci-1+bci;其中a、b为参数。
6.根据权利要求1所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,步骤B中所述每个子词典内所有单词长度相同;步骤B中所述对每个子词典构造相关图包括对单词长度大于1的子词典,以其所有单词最后两个字符为顶点,两个字符出现在同一个单词的最后两个位置,则在这两个字符对应的顶点间连一条边,形成该子词典的相关图。
7.根据权利要求6所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,所述形成该子词典的相关图后进一步包括将各子词典相关图的集合在一起,形成原词典的多级相关图。
8.根据权利要求6所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,步骤B中所述多级相关图,其顶点集合为相应子词典平滑后单词最后两个字符的集合,其边集为相应子词典所有单词的集合。
9.根据权利要求1所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,步骤C中所述对构造的每个子词典的相关图中的顶点进行排序按照类似Prim算法的方式进行,具体包括对各级相关图顶点按照类似Prim算法排序,将度最高的顶点v1排第一,与v1相邻的度最高的顶点v2排第二,与v1或v2相邻的度最高的顶点v3排第三,……,直到该级相关图所有顶点都已经排序。
10.根据权利要求1所述的构造用于处理大规模词典的完美哈希函数的方法,其特征在于,步骤C中所述对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数包括对各级相关图的每个顶点依次关联一个合适的整数,将与当前顶点相邻的所有单词映射到哈希表空闲地址,即对于单词k=c1c2…cn,平滑后单词形如k`=c1f1(c2)f2(c2)…f1(cn)f2(cn),对k`各字符关联整数,使得h(k`)=g(c1)+g(f1(c2))+g(f2(c2))+…+g(f1(cn))+g(f2(cn))为完美哈希函数,其中g(f1(ci))和g(f2(ci))分别表示对顶点f1(ci)和f2(ci)关联的整数。
全文摘要
本发明涉及信息检索和自然语言处理技术领域,公开了一种构造用于处理大规模词典的完美哈希函数的方法,该方法包括A、将待构造哈希函数的词典中的单词平滑;B、将平滑后词典按照单词长度分为n个子词典,对每个子词典构造相关图,n为自然数;C、对构造的每个子词典的相关图中的顶点进行排序,对排序后各顶点依次关联整数,将各单词映射到不同的哈希地址,得到词典的完美哈希函数。利用本发明,能够对包含上百万单词的词典成功构造完美哈希函数,并且能够处理中文等大字符集词典,填充因子接近1,提高了填充因子,缩短了构造时间,减少了哈希函数的工作空间。
文档编号G06F17/30GK1996306SQ200610171640
公开日2007年7月11日 申请日期2006年12月31日 优先权日2006年12月31日
发明者龚才春 申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1