一种基于分支界定的全文检索方法及系统与流程

文档序号:19738191发布日期:2020-01-18 04:48阅读:155来源:国知局
一种基于分支界定的全文检索方法及系统与流程

本发明涉及文档检索领域,具体涉及一种基于分支界定的全文检索方法及系统。



背景技术:

随着互联网技术的快速发展,无论线上还是线下,文本库的规模急剧膨胀,如何对这些文本集合建立高效的索引和进行快速检索已经成为一个亟待解决的问题。由于文档长短不一,使用简单的几个词语、短句甚至片段等无法表征其核心内容,或者说难以全面概括文档内容。此外,词序在文档中也扮演着重要的作用,传统的基于关键字的检索方法和现有的全文检索方法在这方面考虑不足,造成检索效率低,准确率低。

在基于二维指纹进行全文检索的方法,它保留了文档的结构信息,可以有效提高检索的准确性和查询效率。在该方法中,首先为语料库中的文档生成各阶距离图,然后基于这些距离图来生成二维指纹,并创建了基于二维指纹的索引结构。有了索引,即可通过顺序扫描的方式进行二维指纹的相似度计算,得到与待检索文档指纹最相似的指纹集合,通过索引即可获得对应的原始文档集合。

由于指纹相似度的计算并不像字符串匹配那么简单,并且随着语料库规模的增加,顺序扫描的方式进行指纹的检索,非常耗时。在保证准确率的情况下,大规模语料库的检索效率还较为低下。



技术实现要素:

为了解决现有技术中所存在的大规模语料库的检索效率低和准确率低的问题,本发明提供一种基于分支界定的全文检索方法。

本发明提供的技术方案是:

一种基于分支界定的全文检索方法,其改进之处在于,包括:

采用并行方式,基于距离图法为待检文档构建指纹;

对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝;

在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹;

所述指纹对应的文档为针对待检文档的检索结果。

优选地,所述指纹库的构建包括:

基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引,所述指纹和指纹索引构成指纹库。

优选地,所述对预先构建的指纹库划分指纹子集包括:

基于所述指纹索引,按照指纹高度分组,得到分级指纹集,

对各分级指纹集划分指纹子集。

优选地,所述基于所述指纹索引,按照指纹高度分组,得到分级指纹集包括:

基于所述指纹索引,按照指纹高度计算指纹的级数,所有相同级数的指纹构成一个分级指纹集,不同的级数对应不同的分级指纹集;

随机选取所述各分级指纹集中的一批指纹构成的代表点集合,对所述各分级指纹集中的指纹进行顺序扫描,如果指纹到所述代表点集合中最近代表点的归一化汉明距离不超过归一化半径,则将该指纹放入最近代表点对应的集合中,否则放入代表点集合中,直至所述各分级指纹集中的指纹扫描完毕,得到各分级指纹集的代表点集合和对应各代表点的指纹集合。

优选地,所述对各分级指纹集划分指纹子集包括:

基于各分级指纹集的代表点集合和对应各代表点的指纹集合,对每个对应代表点的指纹集合进行遍历,如果指纹集合的规模小于预先设置的最小规划临界量,则将所述指纹和所述指纹对应的代表点移到临时指纹集合中;

遍历所述临时指纹集合,若所述指纹与其对应的代表点的归一化汉明距离小于归一化半径,则将所述指纹从所述代表点集合中移到对应代表点的指纹集合中;否则,将指纹添加到大离群点集合中;

代表点集合中剩余的代表点与对应的指纹集合构成了一个指纹子集;

将所有对应各代表点的指纹集合进行划分,生成指纹子集。

优选地,所述基于所述待检文档的指纹采用支界定法对预先构建的指纹库中的指纹子集进行剪枝包括:

基于所述预先构建的指纹库中的指纹子集,计算所述代表点集合和大离群点集合中指纹与目标文档中指纹的相似度的最大值,将之作为全局悲观界的初始值;

将每个指纹子集内所有指纹与目标文档中指纹的相似度的上限作为该指纹子集的局部乐观界,对所有指纹子集的局部乐观界进行降序排列;

基于所述待检文档的指纹,对所述指纹子集进行剪枝,去除低于全局悲观界的局部乐观界对应的指纹子集。

优选地,所述在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹包括:

基于所述待检文档的指纹,根据指纹高度确定指纹级数;

基于指纹索引读取与待检文档的指纹级数相同的所述剪枝后的指纹子集中的指纹,计算两个指纹的相似度;

将所述相似度的值作为键,所述指纹库中指纹对应的文档作为值,组成键值对;

计算生成所述检索目标中所有同级指纹对应的键值对,并按照键进行降序排序,其中最大的1个或者多个键值对的值,就是与待检文档最相似的文档。

优选地,所述基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引包括:

对语料库中所有文档的全文执行停用词去除操作,得到有效文档集;

基于所述有效文档集,生成语料库中文档对应的距离图;

按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引。

优选地,所述基于所述有效文档集,生成语料库中文档对应的距离图包括:

对所述有效文档集中的单词进行去重,生成有效文档集单词列表;

对所述有效文档集单词列表中的单词进行编号,每个单词的编号唯一,得到单词到数字的映射表;

基于所述单词到数字的映射表,将所述有效文档集中单词替换为数字,生成数字文档集;

对所述数字文档集的数字进行遍历,生成语料库中文档对应的距离图,所述距离图以邻接表形式进行存储;

所述按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引包括:

按照所述距离图中的边数将指纹划分为不同层级;

在所述每一层级中计算指纹高度,采用hash函数,遍历所述距离图中的边,存在二维数组中,生成指纹索引。

基于同一发明构思,本发明还提供一种基于分支界定的全文检索系统,包括指纹模块、剪枝模块:相似度模块和检索模块:

指纹模块:用于采用并行方式,基于距离图法为待检文档构建指纹;

剪枝模块:用于对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝;

相似度模块:在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹;

结果模块:用于所述指纹对应的文档为针对待检文档的检索结果。

与现有技术相比,本发明的有益效果为:

本发明提供的技术方案采用分支界定法对指纹库中的并行子集进行剪枝,精简了检索目标,采用并行的方式进行检索,在保障检索准确性的情况下,提高了检索效率。

本发明提供的技术方案采用,采用了并行处理方式,相比于单机或者串行检索,具有更快的速度,并且对于计算机的硬件要求低,适用性强,易于推广。

附图说明

图1为本发明的基于分支界定的全文检索方法示意图;

图2为本发明实施例中一个二维指纹的结构示意图;

图3为本发明实施例中倒排索引结构示意图;

图4为本发明实施例中基于指纹的索引结构示意图;

图5为本发明实施例中生成指纹的过程示意图;

图6为本发明实施例中去除停用词得到有效文档的过程示意图;

图7为本发明实施例中从有效文档获取单词列表的过程示意图;

图8为本发明实施例中有效文档生成距离图的过程示意图;

图9为本发明实施例中从距离图生成指纹的过程示意图;

图10为本发明实施例中指纹划分成子集的过程示意图;,

图11为本发明实施例中指纹划分子集以及生成代表点集合的过程示意图;

图12为本发明实施例中生成临时指纹集合过程示意图;

图13为本发明实施例中计算待检索文档的指纹与代表点的相似度以进行全局悲观界初始化的过程示意图;

图14为本发明实施例中剪枝过程示意图;

图15为本发明实施例中剪枝后进行并行顺序扫描计算相似度过程示意图

图16为本发明实施例中基于分支界定的全文检索系统示意图。

具体实施方式

为了更好地理解本发明,下面结合说明书附图和实例对本发明的内容做进一步的说明。

实施例1:

一种基于分支界定的全文检索方法,如图1所示,包括:

步骤1:采用并行方式,基于距离图法为待检文档构建指纹;

步骤2:对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝;

步骤3:在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹;

步骤4:所述指纹对应的文档为针对待检文档的检索结果。

步骤1:采用并行方式,基于距离图法为待检文档构建指纹。

步骤2:对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝。

具体地,所述指纹库的构建包括:

基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引,所述指纹和指纹索引构成指纹库。

具体地,所述基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引包括:

对语料库中所有文档的全文执行停用词去除操作,得到有效文档集;

基于所述有效文档集,生成语料库中文档对应的距离图;

按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引。

具体地,所述基于所述有效文档集,生成语料库中文档对应的距离图包括:

对所述有效文档集中的单词进行去重,生成有效文档集单词列表;

对所述有效文档集单词列表中的单词进行编号,每个单词的编号唯一,得到单词到数字的映射表;

基于所述单词到数字的映射表,将所述有效文档集中单词替换为数字,生成数字文档集;

对所述数字文档集的数字进行遍历,生成语料库中文档对应的距离图,所述距离图以邻接表形式进行存储;

所述按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引包括:

按照所述距离图中的边数将指纹划分为不同层级;

在所述每一层级中计算指纹高度,采用hash函数,遍历所述距离图中的边,存在二维数组中,生成指纹索引。

具体地,所述对预先构建的指纹库划分指纹子集包括:

基于所述指纹索引,按照指纹高度分组,得到分级指纹集,

对各分级指纹集划分指纹子集。

具体地,所述基于所述指纹索引,按照指纹高度分组,得到分级指纹集包括:

基于所述指纹索引,按照指纹高度计算指纹的级数,所有相同级数的指纹构成一个分级指纹集,不同的级数对应不同的分级指纹集;

随机选取所述各分级指纹集中的一批指纹构成的代表点集合,对所述各分级指纹集中的指纹进行顺序扫描,如果指纹到所述代表点集合中最近代表点的归一化汉明距离不超过归一化半径,则将该指纹放入最近代表点对应的集合中,否则放入代表点集合中,直至所述各分级指纹集中的指纹扫描完毕,得到各分级指纹集的代表点集合和对应各代表点的指纹集合。

具体地,所述对各分级指纹集划分指纹子集包括:

基于各分级指纹集的代表点集合和对应各代表点的指纹集合,对每个对应代表点的指纹集合进行遍历,如果指纹集合的规模小于预先设置的最小规划临界量,则将所述指纹和所述指纹对应的代表点移到临时指纹集合中;

遍历所述临时指纹集合,若所述指纹与其对应的代表点的归一化汉明距离小于归一化半径,则将所述指纹从所述代表点集合中移到对应代表点的指纹集合中;否则,将指纹添加到大离群点集合中;

代表点集合中剩余的代表点与对应的指纹集合构成了一个指纹子集;

将所有对应各代表点的指纹集合进行划分,生成指纹子集。

具体地,所述基于所述待检文档的指纹采用支界定法对预先构建的指纹库中的指纹子集进行剪枝包括:

基于所述预先构建的指纹库中的指纹子集,计算所述代表点集合和大离群点集合中指纹与目标文档中指纹的相似度的最大值,将之作为全局悲观界的初始值;

将每个指纹子集内所有指纹与目标文档中指纹的相似度的上限作为该指纹子集的局部乐观界,对所有指纹子集的局部乐观界进行降序排列;

基于所述待检文档的指纹,对所述指纹子集进行剪枝,去除低于全局悲观界的局部乐观界对应的指纹子集。

步骤3:在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹,包括:

基于所述待检文档的指纹,根据指纹高度确定指纹级数;

基于指纹索引读取与待检文档的指纹级数相同的所述剪枝后的指纹子集中的指纹,计算两个指纹的相似度;

将所述相似度的值作为键,所述指纹库中指纹对应的文档作为值,组成键值对;

计算生成所述检索目标中所有同级指纹对应的键值对,并按照键进行降序排序,其中最大的1个或者多个键值对的值,就是与待检文档最相似的文档。

步骤4:所述指纹对应的文档为针对待检文档的检索结果。

实施例2:

参照传统的全文索引的流程,基于二维指纹的语料库并行全文检索方法也可以划分成两大阶段:生成索引和基于索引的搜索。创建索引的过程是一次性的,只要文档的主要内容和结构不发生变化,对应的索引一般不进行更新操作。

为了便于描述,先将本发明涉及到的相关概念及其符号表示定义如下:

k阶距离:对于给定文档d,其单词序列记作seq(d),单词集合记作n(d)。如果在seq(d)中,单词ni在单词nj之前最多k个位置至少出现过1次,其中ni,nj∈n(d),则称ni到nj的距离为k阶距离,k≥0。

k阶边:如果文档d中的节点ni到nj的距离为k阶距离,则称ni到nj的有向边为ei,j为k阶边,记作或

k阶距离图:由n(d)中的所有节点以及连接这些节点的k阶边构成的图,称为该文档的k阶距离图,记作dgk(d)={n(d),ek(d)},其中,n(d)表示距离图中的节点的集合,节点数量||n(d)||记作n(d),其大小与阶数无关;ek(d)表示文档d的k阶距离图中边集合,也是文档d对应的k阶边的集合,k阶边集合的大小||ek(d)||记作mk(d)。对于同一文档,阶数越高,对应的距离图中的边数越多。

级数:级数是对距离图中边的数量和指纹高度的一种度量表示。对于给定的距离图,其级数是确定,由距离图中的边数唯一确定。为保证指纹占用尽量小的空间,对于距离图dgk(d),定义其级数也记作lk(d),表示文档d的k阶距离图的级数。

指纹:距离图的一种二维压缩表示,一般用f表示。一个指纹对应一个宽度w,高度h的2维2进制数组,如图2所示,各列中1的数量是相同的。其中,w主要用来保证指纹的鲁棒性和检索的准确性,其取值一般是固定的,与文档或距离图无关;高度h则与距离图中的边数有关。

指纹高度:指纹对应的2维2进制数组的高度。

q级指纹:由于指纹和距离图一一对应,因此指纹也是有级数的,q级指纹是指纹高度h为2q-1的指纹,记作fq

q级hash函数:能均匀映射到[0,2q-1]的hash函数称为q级hash函数。

指纹相似度:对于两个大小相同(级数相同)的指纹t和d,假设指纹的宽度为w,高度为h,则它们之间的相似度定义为两个指纹中内容为1的单元格的重合率,用公式表述如下:

其中,fi,(t):指纹t的下标为(i-1,j-1)的单元的值;m(t):指纹t对应的距离图的边数,也是指纹t的任一列中数值为1的单元的数量;fi,(d):指纹d的下标为(i-1,j-1)的单元的值;m(d):指纹d对应的距离图的边数,也是指纹t的任一列中数值为1的单元的数量。

分级指纹集:对于语料库c,其所有文档生成的指纹集合记作f(c),简记为f。由于指纹是分级的,f中所有q级指纹的集合,叫做q级指纹集合,记作fq(c),简记为fq。f={f1,f2,...,ft},t为f中指纹的最高级数。

指纹子集:由分级指纹集fq中的部分指纹构成的集合,即f中部分q级指纹构成的集合,记作gq

代表点:对于一个分级指纹子集g,如果有r∈g与g内其他指纹的相似度最大,则称r为g的代表点。

相比于传统的词语、短句、段落等,距离图更能表征文档的结构和内容,表达的更全面,所以基于距离图的文档检索的准确率更高。由于计算机进行逐位操作效率非常高,在进行指纹的相似性度量的过程中,采用了逐位操作,这就带来了更高的处理效率。由于整个文档检索的各阶段都是基于mapreduce的分布式并行框架实现的,所以相比于单机或者串行检索,具有更快的速度。由于mapreduce分布式并行框架可以运行与廉价计算机或者服务器之上,所以,文档并行检索方法更具经济性且具有更高的查询效率。

步骤1:采用并行方式,基于距离图法为待检文档构建指纹;

步骤2:对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝。

在介绍生成索引的方法之前,先介绍一下索引结构。在传统的基于关键字的检索和全文检索系统中,一般采用倒排索引的结构来保存字、词、短语等及其出现的位置的映射关系。倒排索引一般采用链表的形式进行表示,包括两部分:字/词典和倒排表。其中,字/词典一般由一系列字/词或者短语构成,倒排表则由诸多链表构成,每一条链表对应一个字/词或者短语,记录其出现过的所有文档的id,链表的每个节点存储一个文档id,各节点通过链表连接。图4为常见的倒排索引结构示意图。

借鉴倒排索引结构,为文档创建基于二维指纹的索引结构。由于每一个指纹都对应着一篇文档的整体结构,并不需要倒排表,或者说每一个倒排表里面的节点数量都只有1个。这样,倒排索引的结构就从list<map<word,list<docid>>>这种复杂结构简化成了list<map<fingerprint,docid>>。由于一篇文档一般是由大量字(词)或者短语构成的,所以在倒排索引中,不同的字(词)或者短语对应的倒排表中的节点存在大量重复,例如,图3中“lamb”和“stock”同时出现在了id为15的文档中。由于一篇文档可以生成多个距离图,每个距离图具有不同的阶,用order表示,用于衡量结构图的复杂程度,而每个距离图都可以生成一个指纹,每个指纹对应一个不同的阶,借鉴倒排索引的结构,只不过同一个docid可能出现多次罢了。图4(a)是不考虑指纹级数情况下的基于指纹的索引结构,其中docid为17的文档就有两个指纹,这就是不同的指纹对应着同一文档,或者说一个文档有多个指纹。图4(b)是考虑了指纹级数情况下的索引结构,docid为17的文档的两个指纹的级数分别为11和14。由于相似度计算只能发生在相同大小的指纹之间,所以为了加快查询的速度,将相同级数的指纹聚到一起,将索引结构从list<map<fingerprint,docid>>变成list<level,list<map<fingerprint,docid>>>,对于某个固定的level,list<map<fingerprint,docid>>中的fingerprint的大小相同。但从本质上讲,图4中的两种索引结构是一样的,图4(a)结构简单,但检索速度慢,而图4(b)则用空间换时间,结构复杂,但检索速度快。如无特殊说明,本发明后续所述文档索引结构均指图4(b)所述结构。

生成索引

从一篇原始文档开始构建该文档对应的指纹的过程如图5所示,主要分成3个步骤:(1)去除停用词;(2)生成距离图;(3)构建指纹,生成索引。

(1)去除停用词

对整个原始文档集(语料库)执行停用词去除操作,得到有效文档集。基于mapreduce对整个原始文档集进行去除停用词操作过程如图6所示。其中map阶段处理逻辑主要包括:

a.map()读取停用词列表;

b.map()读取整篇文档;

c.map()对停用词列表进行遍历,如果文档中出现了该停用词,则替换为空;

d.输出被替换后的文档到分布式文件系统,文件名与原文档保持对应。

(2)生成距离图

为了生成距离图,首先要获取有效文档集的单词列表。基于mapreduce实现单词去重,输入为有效文档集,输出为单词列表,如图7所示。整个过程的主要逻辑如下:

a.在map阶段,map()函数逐个读取单词并生成<word,1>这种形式的键值对。map阶段将reduce()函数作为combine()函数,将本文档内的相同单词进行合并,得到<word,1>键值对;

b.在混洗阶段,按照reduce()函数的单词划分(同一个单词只能在一个reduce节点处理),键值对被传送到对应的reduce节点;

c.在reduce阶段,reduce()函数接收其处理的键值对,将相同的单词合并后输出到分布式文件系统,生成单词列表,输出时只输出单词,且每个单词只输出一次中。

得到单词列表之后,基于mapreduce对各有效文档进行并行处理,得到各文档对应的各阶距离图,具体过程如图9所示。其中map阶段处理的主要逻辑如下:

a.map()函数读取一篇有效文档;

b.map()函数对阶数j∈[0,k]进行遍历,k为给定的最高阶数;

c.对于固定的阶数j,map()函数对有效文档中的单词i进行遍历;

d.对于文档中的每一个单词i,获取其后0到j个数字分别作为值,与i作为键组成键值对;

e.输出以邻接表形式存储的j阶距离图到文件。

(3)构建指纹,生成索引

由于指纹是文档的压缩表示,而hash函数天然具备压缩的性质,所以这里选择hash函数作为生成指纹的方法。又由于文档的长短差异可能非常大,为了能够用尽量少的hash函数覆盖尽可能广的范围,同时尽可能保证一定长度差异范围内的文档可比较,按照指数范围来根据距离图中的边数将指纹划分到不同层级,也就是级,

对于每一层级,都选择w个不同的hash函数构成对应层级的hash函数集,记作所有层级的hash函数集构成了针对语料库的一个hash函数库h={hlower,hlower+1,...,hupper}。同一层级的所有距离图使用相同的hash函数集生成对应的指纹。由于不同级的hash函数的映射范围不同,所以不同级的距离图自然也就使用了不同的hash函数。

从前面级数的定义可知,hash函数库的最小级数和最大级数是由语料库中所有文档对应的距离图的最小边数和最大边数决定的

指纹的计算过程如下:对于给定的距离图dgk(d)={n(d),ek(d)}和对应的hash函数集以及所有的边通过连接i、‘#’和j创建一个新的字符串,然后将hk中的所有hash函数直接作用于创建的字符串i⊕‘#’⊕j,其中⊕表示连接运算符,得到数值然后将该距离图对应的指纹fk(d)的下标为的单元置1(默认为0)。最终得到的指纹就是填充了0和1的宽为w,高为h的一个二维数组。很显然每一列的1的数字都是相同的。

由于使用hash函数来生成指纹,所以存在映射冲突,即不同的输入得到相同的输出。因此,为了保证指纹的准确性,应当对指纹的高度进行相应的设置,以降低冲突的概率。对于距离图dgk(d),其对应的指纹fk(d)的高度很显然满足hk(d)≥mk(d),否则必存在冲突。而所以可以用作为指纹fk(d)的高度。为了进一步降低冲突的概率,引入了扩充系数α来增加冗余空间,将指纹fk(d)的高度设定为其中α≥0。

基于mapreduce生成某一语料库c对应的指纹库f(c)过程如图9所示。其中map阶段处理的主要逻辑如下:

a.map()函数读取hash函数库h;

b.map()函数读取距离图dg(d);

c.map()函数读取距离图的第一行数据,得到该距离图的边数m;

d.map()函数根据计算指纹的级别,选择对应的hash函数集hl

e.map()函数根据h=(2l-1)·(1+α)计算出指纹高度,然后创建并初始化一个大小为w·h的2维数组;

f.map()函数对dg(d)中的边进行遍历,对于每条边ek,j,分别使用hl中的w个hash函数进行计算,并将w·h数组中的单元置1;

g.输出指纹f对应的二维数组到文件,得到各距离图对应的指纹文件。这些指纹一起构成了语料库c的指纹库f(c)。

至此,语料库中的所有文档都生成了对应的指纹,也就意味着针对语料库的索引构建完毕。

使用分支界定这种剪枝方法,先将指纹库划分成多个子集,然后在有序搜索过程中对其中的一些子集进行剪枝,被剪枝的子集内的所有文档都不会被考虑,这样可以大大减少计算量,从而提高检索效率。

子集划分

每个子集只能包含某一级的指纹,所以,先将指纹按照高度分组,得到分级指纹集flower,flower+1,...,fupper,其中fti由指纹库f中所有t级指纹构成,分组过程如图11所示,主要逻辑如下:

a.在map阶段,map()函数读取指纹f,根据其中的边数m,计算对应的级数q,然后以q的值为键,指纹路径作为值,组成键值对并输出;

b.在混洗阶段,相同的键被传送到同一个reduce节点;

c.在reduce阶段,reduce()函数收集相同级的指纹路径,然后将这些指纹置于同一个文件夹中,得到各级的指纹集。

指纹库按照级别重新组织之后,就要在各级指纹集内进行并行子集划分了,各级指纹集的处理过程也是并行的。

为了便于表述,以t级指纹集ft为例,介绍一下划分子集的过程。该过程主要包括2个阶段:

第一阶段主要包括以下步骤:

a.先从ft随机选出一批指纹构成集合r,这些指纹被称为代表点,r称为代表点集合,每个代表节点又分别对应一个指纹集合,记作z,初始为空;

b.对ft中所有指纹f进行顺序扫描;

c.如果f到r中最近点rk的归一化汉明距离不超过归一化半径γ,则将f放到zk中;

d.否则,将f添加到r中。

对于“代表点”这个词,很容易理解其代表的含义。对于某一个子集,其代表点代表了该子集,可以视为该子集的中心,要保证子集内的所有节点到其代表点的距离必须约束在一定范围内,也就是说子集是由一个代表点以及一系列围绕该代表点的节点共同构成的一个集合。从前面的定义以及指纹的构成可知,选取代表点的依据其实就是汉明距离。由于汉明距离表示两个等长字符串在对应位置上不同字符的数目,在同级指纹集内,由于指纹大小相同,使用汉明距离表征各指纹到代表点的距离以及使用该距离的最大值作为该子集的半径是没有问题的。但是对于多级指纹,由于指纹大小不同,势必造成各级指纹集子集的半径比较的不公平性。例如,将q级指纹集中的某一个子集进行s等比例扩展,各指纹高度变成原来的两倍,指纹各列中1的数量翻倍,得到q+1级的子集s’,很显然,s’的半径变成了s的半径的2倍,但是s’的紧密程度是和s一样的,所以使用半径的绝对值是不太适合跨级子集的比较的。然而,在文档检索过程中,是将所有级别的指纹同时进行检索的,所以这里有必要引入一个相对的参数来表征各子集的半径。引入归一化半径γ=r/(w·h),它是子集实际半径与指纹大小的比值,归一化汉明距离也是如此。这样,归一化半径就与指纹大小无关了,可以作为跨级比较指纹的一个统一度量。既然是划分子集,则每个子集都应该有一个最小规模的限制,这里引入了临界量μ来表示构建子集应达到的最小规模。

第一阶段的并行过程的如图11所示:

a.在map阶段,map()维护一个代表点集合r;

b.在map阶段,map()从指纹集中读取一条指纹f,然后遍历r,计算f到各代表点的归一化汉明距离,如果f到某代表点ra的归一化汉明距离小于归一化半径γ,则输出<ra,f>;否则,输出<0,f>;

c.在reduce阶段,reduce()函数为各代表点收集归属到其代表的集合中的指纹,例如,将键为ra的键值对的值都收集起来生成za,键为0的键值对的值都添加到r中,如图11中的ft。

第一阶段结束后,会得到一个代表点集合r={r1,r2,...,rk}和对应各代表点的指纹集合z={z1,z2,...,zk},虽然某些za中的指纹数量可能并没有达到临界量μ的要求。此时,ft={r,z},ft中的指纹要么在r中,要么在z中(代表点ri不会在其对应的zi中重复出现)。对于规模小于临界量μ的指纹集合za,其中的指纹面临2个选择:要么被重新划分到其他代表点对应的集合中,要么放大离群点集合中。

第二阶段如下:

a.创建一个临时指纹集合,用tmp表示,创建一个离散点集合,用o表示,并初始化为空;

b.对z进行遍历操作,如果zi的规模小于临界量μ,则将对应的代表点ri从r中移出,并将ra与za中所有指纹一起放到临时指纹集合中;

c.对临时指纹集合tmp中的指纹进行遍历,如果某指纹f到r中某代表点ra的归一化汉明距离小于归一化半径γ,则将该指纹从r中移到za中;否则,将f添加到o集合中;

d.r中剩余的代表点rs与对应的指纹集合zs共同构成了ft的一个有效指纹子集,记为gt=(r,z),表示指纹库f中的t级指纹集ft的一个子集划分。

生成临时指纹集合tmp的过程如图12所示,主要包括以下几个步骤:

a.在map阶段,map()函数读取子集划分ga,这里r也被当做一个子集。

b.在map阶段,map()函数判断ga的大小,如果大于临界量μ,则不输出任何内容;否则,将ga中的所有内容,连同ra,分别作为值,与临时指纹集合为键组成键值对输出,同时输出<0,-ra>表示ra应当从r中移除;

c.在reduce阶段,2个reduce节点分别是临时指纹集合tmp为键的键值对和0为键的键值对,对于临时指纹集合tmp为键的键值对,将键值对中的值合并到一起,形成临时指纹集合tmp;而对于0为键的键值对,将那些需要移除的代表点从r中移除。

采用第二阶段的步骤对临时指纹集合tmp进行遍历以重新分配其中的指纹。

第二阶段完成后,得到3种集合:1个代表点集合r,1个离群点集合o,和一系列子集g={g1,g2,…,gk}。

基于分支界定的并行检索

基于顺序扫描的指纹相似度计算虽然很简洁,但是对于超大规模的语料库来说,时间开销也是很大的。基于剪枝的方法将不可能成为检索结果的节点提前减去,可以大大减少检索的规模。特别是经过子集划分后,采用剪枝方法,可以批量地剪除那些不可能成为检索结果的指纹,从而大大提高检索效率。

在指纹检索过程中,分支界定的思想主要是通过如下的步骤得以实现:

a.对于待检索的目标文旦t以及对应的指纹集f(t)={flower(t),flower+1(t),...,fupper(t)},遍历f(t),计算f(t)中各指纹fq(t)与r中各k级指纹rtq的相似度(同级指纹才能计算相似度)sim(fq(t),riq);

b.维护一个全局变量全局悲观界,用gpb表示,其值为到目前为止得到的与f(t)中指纹的相似度的最大值;

c.为每个子集维护一个局部乐观界,用lob表示,并进行降序排列。所谓子集的局部乐观界,其实是指该子集内所有指纹与目标指纹的相似度的上限。对于某一子集gs,其对应的局部乐观界为

其中q:gs的级数;rs:gs的代表点,此处用m来指代指纹对应的距离图的边数,而不是指纹高度h。

从局部乐观界的计算过程可知,对于固定的目标文档t,每一个子集的局部乐观界是个固定值。

d.按照lob降序遍历对应的子集gi,然后比较lobi与gpb的大小。

e.如果gpb<lobi,说明局部乐观界优于全局悲观界,说明子集gi中可能存在某些指纹与目标文档的指纹的相似度值大于目前的最好的指纹,即gpb对应的那个指纹。遍历gi,如果存在指纹fi,j∈gi,使得sim(fi,j,fq(t))>gpb,则用sim(fi,j,fq(t))更新gpb,因此gpb单调递增。

f.如果gpb≥lobi,说明gi中所有的指纹都不会比目前gpb对应的指纹更优。由于按照lob降序处理各子集,排在gi之后的其余子集只会比gi更差,可以结束对子集的遍历。此时得到的gpb对应的指纹所归属的文档就是要检索目标。

对于需要返回k个最优结果的文档查询,上述过程同样适用,只需将维护单个gpb改成维护一个长度长度为k的gpb列表。

基于分支界定的并行检索方法主要包括3个阶段:初始化全局变量全局悲观界阶段、剪枝阶段和并行查询阶段。

初始化全局变量全局悲观界阶段主要目的是迅速选出一个较优的gpb,主要思路是将r和离群点集合o作为候选集,选择一个合适的值进行gpb初始化。考虑到gpb是单调增的,如果选的gpb值越大,那么后面的剪枝效率越高。因此,计算r和o中指纹与目标文档t的指纹的相似度的最大值,将之作为gpb的初始值。初始化过程如图13所示。流程如下:

a.在map阶段,map()函数读取r或者o中的一个指纹fi,然后计算其级数q,读取f(t)中的对应级数的指纹fq(t),计算两者之间的相似度sim(fq(t),fi),输出;

b.在reduce阶段,reduce()函数将收集到的相似度值进行排序,按照降序输出,最大相似度的值作为全局悲观界gpb。

剪枝阶段的目的是直接删除不太可能称为检索结构的子集,大规模降低查询匹配的空间,提高检索效率,剪枝过程如图14所示,可以有多个reduce节点。由于gpb的初始值基本就是r中的最大值或者o中的最大值,相当于直接把全局悲观值提的非常高,这一个门槛会卡掉非常多的子集。另外,把各子集的乐观界按照降序排列,只要到了某个位置,乐观界低于悲观界,则其后的所有子集都会被剪枝,这个过程看起来简单,但是效率却非常高,主要步骤如下:

a.在map阶段,map()函数读取r中的某一指纹ri,根据前面介绍的公式计算loci;

b.在reduce阶段,reduce()函数加载上一阶段得到gpb初始值,然后将之与收集到的loci比较,如果gpb<loci,则输出<ri,1>,表示该代表点所对应的子集可能进一步提高gpb,这一过程中,ri被忽略,因为对gpb初始化时已经可以排除ri;否则不输出,也就是说reduce只输出有可能改善gpb的子集。

并行查询过程如图15所示。如果要查询最为相似的1篇文档,则图15中的reduce节点数量设为1即可。reduce输出与目标t的指纹最相似的指纹后,根据第一阶段创建的索引,就可以找到该指纹对应的原始文档。具体步骤为:

基于所述待检文档的指纹,根据指纹高度确定指纹级数;

基于指纹索引读取与待检文档的指纹级数相同的所述剪枝后的指纹子集中的指纹,计算两个指纹的相似度;

将所述相似度的值作为键,所述指纹库中指纹对应的文档作为值,组成键值对,文档可用文档id表示;

计算生成所述检索目标中所有同级指纹对应的键值对,并按照键进行降序排序,其中最大的1个或者多个键值对的值,就是与待检文档最相似的文档。

步骤3:所述指纹对应的文档为针对待检文档的检索结果。

实施例3:

基于同一种发明构思,本发明还提供了一种基于分支界定的全文检索系统,如图16所示,所述系统包括指纹模块、剪枝模块:相似度模块和检索模块:

指纹模块:用于采用并行方式,基于距离图法为待检文档构建指纹;

剪枝模块:用于对预先构建的指纹库划分指纹子集,基于所述待检文档的指纹采用分支界定法对所述指纹子集进行剪枝;

相似度模块:在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹;

结果模块:用于所述指纹对应的文档为针对待检文档的检索结果。

其中,剪枝模块中所述指纹库的构建包括:

基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引,所述指纹和指纹索引构成指纹库。

具体地,所述基于语料库中所有文档的全文采用距离图法为每个文档构建指纹,并生成指纹索引包括:

对语料库中所有文档的全文执行停用词去除操作,得到有效文档集;

基于所述有效文档集,生成语料库中文档对应的距离图;

按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引。

具体地,所述基于所述有效文档集,生成语料库中文档对应的距离图包括:

对所述有效文档集中的单词进行去重,生成有效文档集单词列表;

对所述有效文档集单词列表中的单词进行编号,每个单词的编号唯一,得到单词到数字的映射表;

基于所述单词到数字的映射表,将所述有效文档集中单词替换为数字,生成数字文档集;

对所述数字文档集的数字进行遍历,生成语料库中文档对应的距离图,所述距离图以邻接表形式进行存储;

所述按照所述距离图中的边数将指纹划分到不同层级,生成指纹索引包括:

按照所述距离图中的边数将指纹划分为不同层级;

在所述每一层级中计算指纹高度,采用hash函数,遍历所述距离图中的边,存在二维数组中,生成指纹索引。

具体地,所述对预先构建的指纹库划分指纹子集包括:

基于所述指纹索引,按照指纹高度分组,得到分级指纹集,

对各分级指纹集划分指纹子集。

具体地,所述基于所述指纹索引,按照指纹高度分组,得到分级指纹集包括:

基于所述指纹索引,按照指纹高度计算指纹的级数,所有相同级数的指纹构成一个分级指纹集,不同的级数对应不同的分级指纹集;

随机选取所述各分级指纹集中的一批指纹构成的代表点集合,对所述各分级指纹集中的指纹进行顺序扫描,如果指纹到所述代表点集合中最近代表点的归一化汉明距离不超过归一化半径,则将该指纹放入最近代表点对应的集合中,否则放入代表点集合中,直至所述各分级指纹集中的指纹扫描完毕,得到各分级指纹集的代表点集合和对应各代表点的指纹集合。

具体地,所述对各分级指纹集划分指纹子集包括:

基于各分级指纹集的代表点集合和对应各代表点的指纹集合,对每个对应代表点的指纹集合进行遍历,如果指纹集合的规模小于预先设置的最小规划临界量,则将所述指纹和所述指纹对应的代表点移到临时指纹集合中;

遍历所述临时指纹集合,若所述指纹与其对应的代表点的归一化汉明距离小于归一化半径,则将所述指纹从所述代表点集合中移到对应代表点的指纹集合中;否则,将指纹添加到大离群点集合中;

代表点集合中剩余的代表点与对应的指纹集合构成了一个指纹子集;

将所有对应各代表点的指纹集合进行划分,生成指纹子集。

具体地,所述基于所述待检文档的指纹采用支界定法对预先构建的指纹库中的指纹子集进行剪枝包括:

基于所述预先构建的指纹库中的指纹子集,计算所述代表点集合和大离群点集合中指纹与目标文档中指纹的相似度的最大值,将之作为全局悲观界的初始值;

将每个指纹子集内所有指纹与目标文档中指纹的相似度的上限作为该指纹子集的局部乐观界,对所有指纹子集的局部乐观界进行降序排列;

基于所述待检文档的指纹,对所述指纹子集进行剪枝,去除低于全局悲观界的局部乐观界对应的指纹子集。

相似度模块中,所述在剪枝后的指纹子集中并行查找与所述待检文档的指纹相似度最大的1个或多个指纹,包括:

基于所述待检文档的指纹,根据指纹高度确定指纹级数;

基于指纹索引读取与待检文档的指纹级数相同的所述剪枝后的指纹子集中的指纹,计算两个指纹的相似度;

将所述相似度的值作为键,所述指纹库中指纹对应的文档作为值,组成键值对;

计算生成所述检索目标中所有同级指纹对应的键值对,并按照键进行降序排序,其中最大的1个或者多个键值对的值,就是与待检文档最相似的文档。

上述实施例表明,技术方案采用分支界定法对指纹库中的并行子集进行剪枝,精简了检索目标,采用并行的方式进行检索,在保障检索准确性的情况下,提高了检索效率。在全文检索的各阶段都是基于mapreduce的分布式并行框架实现的,相比于单机或者串行检索,具有更快的速度,并且对于计算机的硬件要求低,适用性强,易于推广。

显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上仅为本发明的实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均包含在申请待批的本发明的权利要求范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1