一种基于cedar双数组字典树算法进行术语匹配的方法技术

技术编号:14930600 阅读:542 留言:0更新日期:2017-03-31 12:27
一种基于cedar双数组字典树算法进行术语匹配的方法,其特征是包括建索引的步骤,及用索引进行术语查询匹配的步骤;其中,所述建索引的步骤是遍历数据库,获取术语集合,调用cedar双数组字典树插入术语,用以形成术语集合的索引;所述cedar双数组字典树包括一个以基准值和校验值为成员的结构体数组,一个与结构体数组体量相同的循环队列;将cedar双数组算法应用于术语匹配引擎的建索引和根据索引来查询术语,极大地提升了术语匹配引擎的效率,同时该算法也避免了经典的双数组算法libdatrie对大量术语建索引时速度非常慢而不利于快速重建数据的缺点;二叉树作为一种辅助结构,可以用来快速地还原整个双数组字典树。

【技术实现步骤摘要】

本专利技术属于计算机通信领域,尤其涉及一一种基于cedar双数组字典树算法进行术语匹配的方法
技术介绍
目前翻译行业不断扩大,语料和术语的增长速度都比较快,且数目也比较大。而大量术语是翻译的基石,必须使用有效的信息化技术手段来对它们进行管理。目前公司内部关于术语的原文、译文以及其它详细信息存放于mongo数据库,直接查询数据库来获取原文或译文速度很慢,而原文或译文可能过长,也不便作为索引字段。现有一套术语匹配引擎实现,用双数组算法对术语建立外围索引,然后用将双数组建立的索引与mongo数据库里每条术语记录的Objectld(相当于数据库关键字字段)相关联并存放于redis作为二级索引缓存,最终加快对mongo数据库的查询速度。而在这套匹配引擎系统里,选择双数组字典树算法作为其核心模块,不论建索引还是查询速度,要求都比较高。双数组字典树算法是翻译行业文本处理一种通用的算法,可以对术语建索引,对术语进行前缀模糊查询,对术语进行精确查询等。一般该算法扩展开来可用于高效的分词,在术语匹配引擎里我们用它来做基于mongo术语数据库快速建索引。双数组字典树,即双数组Trie(Double-ArrayTrie),主要包含base,check数组,根据不同的算法实现可能有tail数组,base数组和check数组根据算法的不同也会有不同的表现形式(比如,混合在结构体内部)。目前通用的双数组字典树算法实现库是libdatrie,查询效率比较高,但在大量插入数据的情况下就会显得速度很慢,主要就是频繁地解决插入冲突以及在大量数据插入的情况下不断调整tail数组导致的。libdatrie的实现由于base和check之间的关系采用加减运算关系,当存储的字符串是中文时,由于中文字符编码过长就会使得双数组base与check之间对应的下标差距过大,从而产生很多未初始化的元素,也加大了查询时遍历双数组的时间开销,以及解决插入冲突的调整成本。cedar双数组算法直接采用位运算来得出base与check之间的关系,并压缩base与check之间的差距。此外cedar双数组算法在数据结构的设计上也采取了一些优化手段,减少了一些中间计算量。
技术实现思路
本专利技术所要解决的技术问题是目前基于数据库的术语匹配引擎在查词效率上速度偏慢,而改善这一问题的办法就是对数据库里的术语建一个快速索引,引入双数组字典树可以解决大量术语建索引慢以及查询慢的问题。为解决上述技术问题,本专利技术提供了一种基于cedar双数组字典树算法进行术语匹配的方法,其特征是包括建索引的步骤,及用索引进行术语查询匹配的步骤;其中,所述建索引的步骤是遍历数据库,获取术语集合,调用cedar双数组字典树插入术语,用以形成术语集合的索引;所述cedar双数组字典树包括一个以基准值和校验值为成员的结构体数组,一个循环队列;所述调用cedar双数组字典树插入术语的步骤包括:(1)根据计算式集合一获取插入术语和双数组字典树的初始化数值,所述计算式集合一为:from[0]=0to[0]=0^key[0]from[1]=to[0]array[0].base=0array[0].check=0(2)根据check值和计算式二,计算ehead值,所述计算式二为:queue[from[pos+1]].ehead=array[from[pos+1]].check(3)遍历术语中的每个字符,获取插入术语的字符值,根据计算式集合三计算得出双数组字典树的基准值和校验值,所述计算式集合三如下:array[from[pos+1]].base=queue[from[pos+1]].ehead^key[pos]to[pos+1]=array[from[pos]].base^key[pos]array[to[pos+1]].check=from[pos]from[pos+1]=to[pos]所述pos为遍历到的字符在术语中的当前位置值,所述key[pos]为插入术语中当前位置的字符值;所述array为双数组,queue为循环队列,base为基准值,check为校验值,ehead为循环队列中第一个元素成员的下标值;所述from[pos]和to[pos]分别为当前位置的字符在双数组中所对应的起始下标值和结束下标值,其中,所述用索引进行术语查询匹配的步骤是:遍历术语的每一个字符,将字符值代入计算式集合四,以array[to[pos+1]].check=from[pos]为返回条件,直到遍历完,返回该术语在双数组中的位置;所述计算式集合四如下:from[0]=0to[pos+1]=array[from[pos]].base^key[pos+1]所述key表示要查询的术语,pos为当前遍历到的字符在key中的位置值。进一步,所述cedar双数组字典树还包括一个用来存放字符所组成的父子以及兄弟关系的二叉树数组;所述调用cedar双数组字典树插入术语的步骤还包括根据插入术语构建二叉树数组,所述构建二叉树数组的方法是获取术语里的字符间的父子及兄弟关系。进一步,所述调用cedar双数组字典树插入术语的步骤还包括对双数组字典树与插入术语进行冲突处理,构建双数组的过程中,如果计算出的基准值和校验值是之前已经存在了的有效值,寻找没有被占用的双数组节点,然后再遍历术语里的每个字符,算出后续的所有双数组节点。进一步,所述数据库为mongo数据库。进一步,所述索引为双向索引。进一步,所述索引是建立在术语语料所在的数据库之外。进一步,所述索引包括一级索引和二级索引。进一步,还包括当索引达到数量阈值后写入硬盘。进一步,所述循环队列与结构体数组体量相同。采用上述技术方案,可达到以下效果:将cedar双数组算法应用于术语匹配引擎的建索引和根据索引来查询术语,极大地提升了术语匹配引擎的效率,同时该算法也避免了传统算法对大量术语建索引时速度非常慢而不利于快速重建数据的缺点;二叉树作为一种辅助结构,可以用来快速地还原整个双数组字典树。附图说明此处所说明的附图用来提供对本专利技术的进一步理解,构成本申请的一部分,本专利技术的示意性实施例及其说明用于解释本专利技术,并不构成对本专利技术的不当限定,在附图中:图1示出了基于cedar双数组字典树算法进行术语匹配的方法的流程示意图;图2示出了调用cedar双数组字典树插入术语的步骤的的流程示意图;图3示出了结构体数组array[n]的结构示意图;图4示出了循环队列queue[n]的结构示意图;图5示出了二叉树数组ninfo[n]的结构示意图;图6示出了sibling数组的父子及兄弟关系的示意图。具体实施方式下面结合附图和具体实施方式对本专利技术的技术方案作进一步具体说明。为解决上述技术问题,如图1所示,本专利技术提供了一种基于cedar双数组字典树算法进行术语匹配的方法,其特征是包括建索引的步骤,及用索引进行术语查询匹配的步骤;其中,1.所述建索引的步骤是遍历数据库,获取术语集合,调用cedar双数组字典树插入术语,用以形成术语集合的索引;所述cedar双数组字典树中,每个数组元素包括一个以基准值和校验值为成员的结构体数组array[n](如图3所示),一个与结构体数组体量相同的循环队列queue[n],以及一个用来存放字符所组成的父本文档来自技高网
...
一种基于cedar双数组字典树算法进行术语匹配的方法

【技术保护点】
一种基于cedar双数组字典树算法进行术语匹配的方法,其特征是包括建索引的步骤,及用索引进行术语查询匹配的步骤;其中,所述建索引的步骤是遍历数据库,获取术语集合,调用cedar双数组字典树插入术语,用以形成术语集合的索引;所述cedar双数组字典树包括一个以基准值和校验值为成员的结构体数组,一个循环队列;所述调用cedar双数组字典树插入术语的步骤包括:根据计算式集合一获取插入术语和双数组字典树的初始化数值,所述计算式集合一为:from[0] = 0to[0] = 0 ^ key[0]from[1] = to[0]array[0].base=0array[0].check=0根据check值和计算式二,计算ehead值,所述计算式二为:queue[from[pos+1]].ehead = array[from[pos+1]].check遍历术语中的每个字符,获取插入术语的字符值,根据计算式集合三计算得出双数组字典树的基准值和校验值,所述计算式集合三如下:array[from[pos+1]].base = queue[from[pos+1]].ehead^ key[pos]to[pos + 1] = array[from[pos]].base ^ key[pos]array[to[pos + 1]].check = from[pos]from[pos + 1] = to[pos]所述pos为遍历到的字符在术语中的当前位置值,所述key[pos]为插入术语中当前位置的字符值;所述array为双数组,queue为循环队列,base为基准值,check为校验值,ehead为循环队列中第一个元素成员的下标值;所述from[pos]和to[pos]分别为当前位置的字符在双数组中所对应的起始下标值和结束下标值,其中,所述用索引进行术语查询匹配的步骤是:遍历术语的每一个字符,将字符值代入计算式集合四,以array[to[pos + 1]].check=from[pos]为返回条件,直到遍历完,返回该术语在双数组中的位置;所述计算式集合四如下:from[0] = 0to[pos+1] = array[from[pos]].base ^ key[pos+1]所述key表示要查询的术语,pos为当前遍历到的字符在key中的位置值。...

【技术特征摘要】
1.一种基于cedar双数组字典树算法进行术语匹配的方法,其特征是包括建索引的步骤,及用索引进行术语查询匹配的步骤;其中,所述建索引的步骤是遍历数据库,获取术语集合,调用cedar双数组字典树插入术语,用以形成术语集合的索引;所述cedar双数组字典树包括一个以基准值和校验值为成员的结构体数组,一个循环队列;所述调用cedar双数组字典树插入术语的步骤包括:根据计算式集合一获取插入术语和双数组字典树的初始化数值,所述计算式集合一为:from[0]=0to[0]=0^key[0]from[1]=to[0]array[0].base=0array[0].check=0根据check值和计算式二,计算ehead值,所述计算式二为:queue[from[pos+1]].ehead=array[from[pos+1]].check遍历术语中的每个字符,获取插入术语的字符值,根据计算式集合三计算得出双数组字典树的基准值和校验值,所述计算式集合三如下:array[from[pos+1]].base=queue[from[pos+1]].ehead^key[pos]to[pos+1]=array[from[pos]].base^key[pos]array[to[pos+1]].check=from[pos]from[pos+1]=to[pos]所述pos为遍历到的字符在术语中的当前位置值,所述key[pos]为插入术语中当前位置的字符值;所述array为双数组,queue为循环队列,base为基准值,check为校验值,ehead为循环队列中第一个元素成员的下标值;所述from[pos]和to[pos]分别为当前位置的字符在双数组中所对应的起始下标值和结束下标值,其中,所述用索引进行术语查询匹配的步骤是:遍历术语的每一个字符,将字符值代入计算式集合四,以array[to[pos+1]].check=f...

【专利技术属性】
技术研发人员:冯泽康
申请(专利权)人:北京语联炉火信息技术有限公司
类型:发明
国别省市:北京;11

相关技术
    暂无相关专利
网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1