一种快速检索相似字符串的方法及***
技术领域
本申请涉及信息处理技术领域,特别涉及一种快速检索相似字符串的方法及***。
背景技术
在当前的信息处理技术领域中,经常需要在海量的文本条目中查询与目标字符串相似的字符串,现有的算法是对目标字符串与海量的文本条目中的每个字符串计算编辑距离,并将编辑距离小于某个阈值的所有字符串列为相似的字符串。
现有技术中的这种方法时间复杂度极高,在数十万文本条目的情况下往往性能无法到达商用要求。除需要进行对比的文本条目数外,现有算法的时间复杂度还与所有文本条目的字符串平均长度相关,无法应用到如今大数据量的场景中。
发明内容
本申请实施方式的目的在于提供一种快速检索相似字符串的方法及***,能够极大提高字符串检索的速度。
为实现上述目的,本申请一方面提供一种快速检索相似字符串的方法,所述方法包括:
读取已有的预设数量的文本条目,并针对每条文本条目,将所述文本条目拆分为若干词组,并为每个词组分配对应的权重值;
基于分配的权重值,对拆分后的词组进行哈希运算,以得到所述文本条目对应的第一哈希字符串;
对所述第一哈希字符串进行塌缩处理,以得到长度符合指定条件的第二哈希字符串;
对所述第二哈希字符串建立前缀树,并基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串。
在本实施方式中,为每个词组分配对应的权重值包括:
根据当前词组与所述文本条目的关联性,为所述当前词组分配对应的权重值;其中,所述关联性越高,对应的权重值则越大。
在本实施方式中,对拆分后的词组进行哈希运算包括:
利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述文本条目对应的第一哈希字符串。
在本实施方式中,对所述第一哈希字符串进行塌缩处理包括:
按照固定间隔将所述第一哈希字符串拆分为多个子字符串,并为拆分得到的各个子字符串分配同样的权重值;
利用SimHash算法,对拆分后的子字符串及其对应的权重值进行处理,以得到所述第一哈希字符串对应的第三哈希字符串;
如果需要,对所述第三哈希字符串进行裁剪,以使得裁剪后的第二哈希字符串的长度小于所述第一哈希字符串的长度,并且所述第二哈希字符串与所述第一哈希字符串之间的对应关系不被割裂。
在本实施方式中,检索出与目标字符串相似的字符串包括:
将所述目标字符串拆分为若干词组,并为每个词组分配对应的权重值;
利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述目标字符串对应的第四哈希字符串;
对所述第四哈希字符串进行塌缩处理,以得到长度小于所述第四哈希字符串的第五哈希字符串;
在所述前缀树中对所述第五哈希字符串进行检索,以得到第一结果集合;
对所述第一结果集合建立新的前缀树,并在所述新的前缀树中对所述第四哈希字符串进行检索,以得到第二结果集合;
将所述第二结果集合作为与所述第四哈希字符串相似的字符串的集合。
在本实施方式中,基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串包括:
S51:从所述前缀树的顶层节点开始逐层向下搜索,并计算当前节点与所述目标字符串之间的编辑距离;
S52:当所述编辑距离小于指定阈值时,重复步骤S51,以完成对子节点的搜索;
S53:当所述编辑距离达到所述指定阈值时,中止当前节点以及所述当前节点的子节点的搜索过程,并从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
S54:如果当前节点内已无子节点,则认为该节点对应的哈希字符串与目标字符串的哈希字符串是相似的,并中止当前节点的检索过程,然后从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
S55:当所述前缀树中所有的节点均已遍历完毕或者搜索过程中止时,结束相似字符串的检索过程。
为实现上述目的,本申请还提供一种快速检索相似字符串的***,所述***包括:
文本条目处理单元,用于读取已有的预设数量的文本条目,并针对每条文本条目,将所述文本条目拆分为若干词组,并为每个词组分配对应的权重值;
第一哈希字符串确定单元,用于基于分配的权重值,对拆分后的词组进行哈希运算,以得到所述文本条目对应的第一哈希字符串;
塌缩处理单元,用于对所述第一哈希字符串进行塌缩处理,以得到长度符合指定条件的第二哈希字符串;
检索单元,用于对所述第二哈希字符串建立前缀树,并基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串。
在本实施方式中,所述塌缩处理单元包括:
拆分模块,用于按照固定间隔将所述第一哈希字符串拆分为多个子字符串,并为拆分得到的各个子字符串分配同样的权重值;
SimHash模块,用于利用SimHash算法,对拆分后的子字符串及其对应的权重值进行处理,以得到所述第一哈希字符串对应的第三哈希字符串;
裁剪模块,用于对所述第三哈希字符串进行裁剪,以使得裁剪后的第二哈希字符串的长度小于所述第一哈希字符串的长度,并且所述第二哈希字符串与所述第一哈希字符串之间的对应关系不被割裂。
在本实施方式中,所述检索单元包括:
目标字符串处理模块,用于将所述目标字符串拆分为若干词组,并为每个词组分配对应的权重值;
第四哈希字符串确定模块,用于利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述目标字符串对应的第四哈希字符串;
塌缩处理模块,用于对所述第四哈希字符串进行塌缩处理,以得到长度小于所述第四哈希字符串的第五哈希字符串;
中间检索模块,用于在所述前缀树中对所述第五哈希字符串进行检索,以得到第一结果集合;
再次检索模块,用于对所述第一结果集合建立新的前缀树,并在所述新的前缀树中对所述第四哈希字符串进行检索,以得到第二结果集合;
结果确定模块,用于将所述第二结果集合作为与所述第四哈希字符串相似的字符串的集合。
在本实施方式中,所述检索单元包括:
编辑距离计算模块,用于从所述前缀树的顶层节点开始逐层向下搜索,并计算当前节点与所述目标字符串的哈希字符串之间的编辑距离;
第一判定模块,用于当所述编辑距离小于指定阈值时,重复所述编辑距离计算模块的处理过程,以完成对子节点的搜索;
第二判定模块,用于当所述编辑距离达到所述指定阈值时,中止当前节点以及所述当前节点的子节点的搜索过程,并从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
第三判定模块,用于如果当前节点内已无子节点,则认为该节点对应的哈希字符串与目标字符串的哈希字符串是相似的,并中止当前节点的检索过程,然后从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
检索结束模块,用于当所述前缀树中所有的节点均已遍历完毕或者搜索过程中止时,结束相似字符串的检索过程。
本发明能将非常复杂和运算量巨大的文本相似匹配过程转换为对若干棵具有关联关系或动态生成的前缀树的查找,通过控制相似度阈值可以在一定范围内匹配大致一致的相似文本。该算法的时间复杂度比起一一计算字符串之间的编辑距离来说,要小若干数量级,从而极大地提高了检索效率。
参照后文的说明和附图,详细公开了本申请的特定实施方式,指明了本申请的原理可以被采用的方式。应该理解,本申请的实施方式在范围上并不因而受到限制。在所附权利要求的精神和条款的范围内,本申请的实施方式包括许多改变、修改和等同。
针对一种实施方式描述和/或示出的特征可以以相同或类似的方式在一个或更多个其它实施方式中使用,与其它实施方式中的特征相组合,或替代其它实施方式中的特征。
应该强调,术语“包括/包含”在本文使用时指特征、整件、步骤或组件的存在,但并不排除一个或更多个其它特征、整件、步骤或组件的存在或附加。
附图说明
所包括的附图用来提供对本申请实施方式的进一步的理解,其构成了说明书的一部分,用于例示本申请的实施方式,并与文字描述一起来阐释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本申请实施方式中前缀树的建立流程图;
图2为本申请实施方式中相似字符串的检索流程图;
图3为本申请另一个实施方式中相似字符串的检索流程图;
图4为本申请实施方式中快速检索相似字符串的***的功能模块图。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施方式中的附图,对本申请实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式仅仅是本申请一部分实施方式,而不是全部的实施方式。基于本申请中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施方式,都应当属于本申请保护的范围。
请参阅图1,本申请提供一种快速检索相似字符串的方法,所述方法包括:
S1:读取已有的预设数量的文本条目,并针对每条文本条目,将所述文本条目拆分为若干词组,并为每个词组分配对应的权重值;
S2:基于分配的权重值,对拆分后的词组进行哈希运算,以得到所述文本条目对应的第一哈希字符串;
S3:对所述第一哈希字符串进行塌缩处理,以得到长度符合指定条件的第二哈希字符串;
S4:对所述第二哈希字符串建立前缀树,并基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串。
在本实施方式中,为每个词组分配对应的权重值包括:
根据当前词组与所述文本条目的关联性,为所述当前词组分配对应的权重值;其中,所述关联性越高,对应的权重值则越大。
在本实施方式中,当前词组与文本条目的关联性可以通过计算向量之间的空间距离来确定。具体地,可以将当前词组和文本条目均转换为词向量,这样,通过计算两个词向量之间的空间距离,从而可以确定这两者之间的关联性,距离越近,关联性则越高。
在本实施方式中,对拆分后的词组进行哈希运算包括:
利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述文本条目对应的第一哈希字符串。
在本实施方式中,对所述第一哈希字符串进行塌缩处理包括:
按照固定间隔将所述第一哈希字符串拆分为多个子字符串,并为拆分得到的各个子字符串分配同样的权重值;
利用SimHash算法,对拆分后的子字符串及其对应的权重值进行处理,以得到所述第一哈希字符串对应的第三哈希字符串;
对所述第三哈希字符串进行裁剪,以使得裁剪后的第二哈希字符串的长度小于所述第一哈希字符串的长度,并且所述第二哈希字符串与所述第一哈希字符串之间的对应关系不被割裂。
请参阅图2,在本实施方式中,检索出与目标字符串相似的字符串包括:
将所述目标字符串拆分为若干词组,并为每个词组分配对应的权重值;
利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述目标字符串对应的第四哈希字符串;
对所述第四哈希字符串进行塌缩处理,以得到长度小于所述第四哈希字符串的第五哈希字符串;
在所述前缀树中对所述第五哈希字符串进行检索,以得到第一结果集合;
对所述第一结果集合建立新的前缀树,并在所述新的前缀树中对所述第四哈希字符串进行检索,以得到第二结果集合;
将所述第二结果集合作为与所述第四哈希字符串相似的字符串的集合。
具体地,在一个应用场景中,可以按照以下步骤来检索相似字符串:
依据分词算法对需要处理的已有的海量字符串进行分词,并对分词后的文本抽取特征;
对不同特征赋予不同权重,使用SimHash算法对其进行局部敏感的哈希运算,得出哈希字符串H1;
对H1按照固定字符间隔切成若干个字符段H2,对每个字符段设置一致的权重(通常设为1),而后对切割后的字符段H2再次进行SimHash运算,得到哈希字符串H3;
裁剪H3,使得H3的长度小于H1,此过程为哈希的坍缩,称坍缩算法;
对H3建立前缀树T1,同时保证H1与H3的对应关系不被割裂;
对于输入的待检索的字符串H4,按照前述方式计算得到其两次哈希值H5、H6;
通过H6完成对T1树的快速相似查找,得到一个集合S1;
对S1建立前缀树T2,通过H5完成对T2的快速相似查找,最终得到一个集合S2;
该集合S2可以认为系H4的相似集合。
请参阅图3,在本申请一个实施方式中,基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串包括:
S51:从所述前缀树的顶层节点开始逐层向下搜索,并计算当前节点与所述目标字符串之间的编辑距离;
S52:当所述编辑距离小于指定阈值时,重复步骤S51,以完成对子节点的搜索;
S53:当所述编辑距离达到所述指定阈值时,中止当前节点以及所述当前节点的子节点的搜索过程,并从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
S54:如果当前节点内已无子节点,则认为该节点对应的哈希字符串与目标字符串的哈希字符串是相似的,并中止当前节点的检索过程,然后从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
S55:当所述前缀树中所有的节点均已遍历完毕或者搜索过程中止时,结束相似字符串的检索过程。
请参阅图4,本申请还提供一种快速检索相似字符串的***,所述***包括:
文本条目处理单元100,用于读取已有的预设数量的文本条目,并针对每条文本条目,将所述文本条目拆分为若干词组,并为每个词组分配对应的权重值;
第一哈希字符串确定单元200,用于基于分配的权重值,对拆分后的词组进行哈希运算,以得到所述文本条目对应的第一哈希字符串;
塌缩处理单元300,用于对所述第一哈希字符串进行塌缩处理,以得到长度符合指定条件的第二哈希字符串;
检索单元400,用于对所述第二哈希字符串建立前缀树,并基于所述前缀树从所述已有的预设数量的文本条目中检索出与目标字符串相似的字符串。
在本实施方式中,所述塌缩处理单元包括:
拆分模块,用于按照固定间隔将所述第一哈希字符串拆分为多个子字符串,并为拆分得到的各个子字符串分配同样的权重值;
SimHash模块,用于利用SimHash算法,对拆分后的子字符串及其对应的权重值进行处理,以得到所述第一哈希字符串对应的第三哈希字符串;
裁剪模块,用于对所述第三哈希字符串进行裁剪,以使得裁剪后的第二哈希字符串的长度小于所述第一哈希字符串的长度,并且所述第二哈希字符串与所述第一哈希字符串之间的对应关系不被割裂。
在本实施方式中,所述检索单元包括:
目标字符串处理模块,用于将所述目标字符串拆分为若干词组,并为每个词组分配对应的权重值;
第四哈希字符串确定模块,用于利用SimHash算法,对拆分后的词组及其对应的权重值进行处理,以得到所述目标字符串对应的第四哈希字符串;
塌缩处理模块,用于对所述第四哈希字符串进行塌缩处理,以得到长度小于所述第四哈希字符串的第五哈希字符串;
中间检索模块,用于在所述前缀树中对所述第五哈希字符串进行检索,以得到第一结果集合;
再次检索模块,用于对所述第一结果集合建立新的前缀树,并在所述新的前缀树中对所述第四哈希字符串进行检索,以得到第二结果集合;
结果确定模块,用于将所述第二结果集合作为与所述第四哈希字符串相似的字符串的集合。
在本实施方式中,所述检索单元包括:
编辑距离计算模块,用于从所述前缀树的顶层节点开始逐层向下搜索,并计算当前节点与所述目标字符串的哈希字符串之间的编辑距离;
第一判定模块,用于当所述编辑距离小于指定阈值时,重复所述编辑距离计算模块的处理过程,以完成对子节点的搜索;
第二判定模块,用于当所述编辑距离达到所述指定阈值时,中止当前节点以及所述当前节点的子节点的搜索过程,并从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
第三判定模块,用于如果当前节点内已无子节点,则认为该节点对应的哈希字符串与目标字符串的哈希字符串是相似的,并中止当前节点的检索过程,然后从与所述当前节点处于同级的兄弟节点的下一节点开始逐层进行搜索;
检索结束模块,用于当所述前缀树中所有的节点均已遍历完毕或者搜索过程中止时,结束相似字符串的检索过程。
本发明能将非常复杂和运算量巨大的文本相似匹配过程转换为对若干棵具有关联关系或动态生成的前缀树的查找,通过控制相似度阈值可以在一定范围内匹配大致一致的相似文本。该算法的时间复杂度比起一一计算字符串之间的编辑距离来说,要小若干数量级,从而极大地提高了检索效率。
上面对本申请的各种实施方式的描述以描述的目的提供给本领域技术人员。其不旨在是穷举的、或者不旨在将本发明限制于单个公开的实施方式。如上所述,本申请的各种替代和变化对于上述技术所属领域技术人员而言将是显而易见的。因此,虽然已经具体讨论了一些另选的实施方式,但是其它实施方式将是显而易见的,或者本领域技术人员相对容易得出。本申请旨在包括在此已经讨论过的本发明的所有替代、修改、和变化,以及落在上述申请的精神和范围内的其它实施方式。