具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种近似匹配方法,如图1所示,包括以下步骤:
步骤s101,拆分关键词生成关键词子串集合,为所述关键词子串集合建立对应的表项,其中表项包括跳跃表、哈希表和前缀表。
步骤s102,根据所述表项将待匹配内容与所述关键词子串集合进行精确匹配。
步骤s103,对精确匹配成功的关键词子串对应的关键词和所述待匹配内容进行近似匹配验证,获得近似匹配结果。
本发明的实施例中,拆分关键词以生成关键词子串集合并为关键词子串集合建立表项,进而进行精确匹配和近似匹配验证以得到近似匹配结果。从而大幅提高了大规模关键词情况下近似匹配算法的性能。具体的,通过建立跳跃表,使得搜索阶段精确匹配各关键词子串时能够快速的向前跳跃;通过建立哈希表,使得搜索阶段出现可能的精确匹配时,找到可能存在匹配的关键词片断;通过建立前缀表,使得搜索阶段精确匹配时过滤不可能匹配的关键词子串。通过上述跳跃表、哈希表和前缀表的结合使用,提高了大规模关键词情况下近似匹配的效率,满足了文本或网络内容近似匹配处理的实用要求。
本发明实施例中提供的近似匹配方法,具体包括预处理阶段、精确匹配阶段以及近似匹配验证阶段。以下分别对不同阶段的处理流程进行详细介绍。
如图2所示,预处理阶段的详细流程包括:
步骤s201,拆分关键词生成每个关键词的关键词子串。
该步骤中拆分关键词生成每个关键词的关键词子串的具体方法为:对于任一个近似特征pi,该关键词对应的长度是mi,最大允许的错误值是ki,将该关键词尽量平均分成(ki+1)个关键词子串,每个子串长度约为mi/(ki+1)。 如果原关键词可以被近似匹配,则生成的关键词子串中必然有一个可以被精确匹配。
步骤s202,将拆分得到的关键词子串组成关键词子串集合。
该步骤中,将拆分后的关键词子串组成关键词子串集合,并建立每个关键词子串与原关键词的映射。
步骤s203,为关键词子串集合中的所有关键词子串建立跳跃表。
跳跃表用于在精确匹配各关键词子串时,快速的向前跳跃。跳跃表由索引和跳跃值组成,表项的索引由第一哈希函数用长度为B1的数据块产生,其中B1为2~4。扫描文本或网络内容时,根据跳跃表中的跳跃值移动搜索窗口。
跳跃表的具体产生办法包括:首先对每个可能的大小为B1字节的字符串,用第一哈希函数生成移动表的索引值,并将跳跃表中所有表项的跳跃值初始化为m-B1+1;考察第一个关键词的前m个字节(m的值根据经验进行设置),从m个字节的末尾开始依次向前,分别取B1长度的数据块,记它的起始位置为q,对该数据块用第一哈希函数产生的索引查找跳跃表,得到的跳跃值与m-q中较小的一个作为该项跳跃表值。然后逐一考察所有关键词,按照上述方法修改跳跃表各项的跳跃值。当关键词集合中的每个关键词都处理完成后,跳跃表的建立过程结束。
以“barbarian”“bomb”为例,建立的跳跃表的表值如图3所示。
步骤s204,建立关键词子串集合对应的哈希表。
哈希表用于搜索可能出现的精确匹配时,找到可能存在匹配的关键词子串。哈希表表项的索引由第二哈希函数用长度为B2的数据块产生,其中B2为2~4。哈希表对待匹配的关键词片集合进行了划分,将所有末尾B2个字符的哈希值相等的关键词片集中在一起,存储在这个哈希值指定的哈希表的表项中。以关键词“bomb”、“barbarian”、“constant”和“musician”为例,建立的哈希表如图4所示。
步骤s205,建立关键词子串集合对应的前缀表。
前缀表用于在精确匹配时过滤不可能存在的关键词子串。前缀表的索引是第三哈希函数利用长度为B3的关键词子串前缀得到的。跳跃表值为0时,先通过查找哈希表得到与待分析文本或网络内容同一后缀的关键词子串链表,计算文本的前缀值,并利用它来过滤那些后缀相同但是前缀不同的关键词子串。
在精确匹配阶段,即搜索阶段中,流程如下:
(1),确定关键词子串集合中最短关键词的长度m,将一个大小为m的窗口置于待分析的文本或网络内容的开始处。
(2),对窗口内的后B1个字节进行第一哈希运算,用得到的哈希值检索跳跃表,若对应表项的跳跃值不为零,则说明无匹配的关键词子串,按照跳跃值移动窗口,重复(2),否则执行步骤(3);例如,若对应表项的跳跃值为1,则窗口移动1。
(3),若(2)中检索得到的跳跃值为零,则窗口不发生移动,根据窗口中后B2个字节查找哈希表,根据哈希表表项的不同情况作不同的处理,处理包括:
(3.1)若哈希表的表项为空,表示没有与该段文本或网络内容相同的关键词子串,窗口向右移动一个字符,执行(2);
(3.2)、若哈希表表项中有关键词子串,将各关键词子串的前缀与待分析的文本或网络内容中的相应字段查前缀表进行比较,若前缀表不相同,窗口向右移动一个字符,重复(2),若相同则执行(4)。
(4),将前缀与待分析的文本或网络内容相同的关键词子串进行单模式精确匹配,匹配失败则窗口移动一个字节,如果存在匹配成功的情况,则进行近似匹配验证。
(5),重复(2)和(3),直到窗口到达待分析的文本或网络内容的最末端。
如果在上述搜索阶段发现待分析文本或网络内容中存在与某一或多个关键词子串精确匹配的情况,例如图5中发现关键字barbarian匹配命中,则进行近似匹配验证过程,即近似匹配验证阶段。
近似匹配验证阶段中,首先根据之前建立的关键词子串与原始关键词的映射关系,找到与匹配的关键词子串对应的原始关键词;
如果在精确匹配过程中出现了某关键词子串与当前文本相匹配的情况,则根据关键词子串与原始关键词的映射关系取出该关键词子串对应的原始关键词,然后用优化的BPM算法进行验证,BPM算法中:
对于长度不大于32位的原始关键词,采用32位并行BPM算法进行单模式近似匹配的验证;对于长度大于32位,不大于64位的原始关键词,采用64位并行BPM算法进行单模式近似匹配的验证;对于长度大于64位的原始关键词,采用任意位并行BPM算法进行单模式近似匹配的验证。
如果出现近似匹配成功的情况就报告匹配位置,然后转到搜索阶段继续进行关键词子串的精确匹配过程;如果近似匹配失败,直接转到搜索阶段继续进行精确匹配过程。
由于同一个近似特征串被拆分成ki+1个子串之后很有可能出现ki+1个子串中的多个子串都在输入数据中被搜索到,这样就会出现在重复验证同一个近似特征串,同一匹配位置多次报告的情况。所以如果在上一轮扫描中发现关键词被拆分后ki+1个子串中的一个子串在待分析数据中出现,并且经过验证后确认该原始关键词和文本在某处近似匹配成功。如果在本轮扫描中发现该原始关键词的另一个子串也在待分析数据中出现,那么应当判断原始关键词在待分析数据中出现的位置是否已经被报告过,如果已经被报告,即上次匹配的位置在本次要验证的位置之后或与所述验证位置重合时,并且上次报告匹配的原始关键词编号和本次待验证的原始关键词编号相同,则不需要再次使用该原始关键词与待分析数据做近似匹配验证。如果不符合此条件则需要将本次映射到的原始关键词和待分析数据做验证,并报告本次验证的结果。
本发明实施例提供的上述方法中,在预处理阶段拆分关键词以生成关键词子串集合并为关键词子串集合建立对应的表项,进而进行精确匹配和近似匹配验证以得到近似匹配结果。从而大幅提高了大规模关键词情况下近似匹配算法的性能,满足了文本或网络内容近似匹配处理的实用要求。
本发明的实施例还提供一种匹配装置,用于面向大规模关键词下情况的近似匹配,如图6所示,包括:
预处理单元10,用于拆分关键词并生成关键词子串集合,为所述关键词子串集合建立对应的表项,其中表项包括跳跃表、哈希表和前缀表;
精确匹配单元20,用于根据预处理单元10建立的表项将待匹配内容与所述关键词子串集合进行精确匹配;
近似匹配单元30,用于对精确匹配单元20精确匹配成功的关键词子串对应的关键词和所述待匹配内容进行近似匹配验证,获得近似匹配结果。
本发明的另一实施例中,匹配装置的结构还可以如图7所示,
预处理单元具体10可以进一步包括:
拆分子单元11,用于提取关键词集合,拆分每个关键词并生成每个关键词的关键词子串;将所述关键词子串组成关键词子串集合,建立每个所述关键词子串与原关键词的映射;
跳跃表建立子单元12,用于对所述关键词子串集合中的所有关键词子串产生跳跃表,所述跳跃表用于在精确匹配各关键词子串时,快速的向前跳跃;
哈希表建立子单元13,用于对所述关键词子串集合产生哈希表,所述哈希表用于搜索可能出现的精确匹配时,找到可能存在匹配的关键词子串;
前缀表建立子单元14,用于对所述关键词子串集合产生前缀表,所述前缀表用于在精确匹配时过滤不可能存在的关键词子串。
精确匹配单元20可以进一步包括:
匹配窗口设置子单元21、用于确定关键词子串集合中最短关键词的长度,根据最短关键词的长度在所述待匹配内容开始处设置匹配窗口并发送通知;
跳跃表检索子单元22,用于接收匹配窗口设置子单元21的通知,对匹配窗口中的待匹配内容的后特定数量个字节进行哈希运算,利用得到的哈希值检索所述跳跃表;当所述跳跃表中对应表项跳跃值不为零时则重复本子单元中所述哈希运算和跳跃表检索的步骤,否则发送通知;
第一处理子单元23,用于接收跳跃表检索子单元22发送的通知,根据匹配窗口中的待匹配内容的后特定数量个字节查找所述哈希表,根据所述哈希表中表项的情况进行相应处理;所述处理包括:若哈希表中表项为空,则将匹配窗口向右移动一个字符,并将匹配窗口的位置通知跳跃表检索子单元22;若哈希表中表项有关键词子串,则将各关键词子串的前缀表中的前缀与待匹配内容中的相应字段的前缀表中的前缀进行比较,若不同则通知跳跃表检索子单元22,否则发送触发通知;
精确匹配子单元24,用于接收第一处理子单元23发送的触发通知,将前缀与所述待匹配内容相同的关键词子串进行单模式精确匹配,匹配失败则移动匹配窗口一个字节并通知判断子单元25,匹配成功则通知近似匹配单元30将待匹配内容与所述关键词子串对应的关键词进行近似匹配验证;
判断子单元25,用于当匹配窗口未到达待匹配内容的末端时,通知跳跃表检索子单元22和第一处理子单元23。
近似匹配单元30可以进一步包括:
关键词提取子单元31,用于取出所述精确匹配成功的关键词子串在拆分前所在的关键词;
对齐子单元32,用于将所述关键词和待匹配内容的相应位置进行对齐;
近似匹配验证子单元33,用于使用BPM算法对所述关键词和待匹配内容进行近似匹配验证;
判断子单元34,用于当一关键词的第一关键词子串精确匹配成功,且所述关键词和所述待匹配内容近似匹配时,记录所述关键词在所述待匹配内容中出现的匹配位置;所述关键词的第二关键词子串精确匹配成功时,获取所述关键词子串要验证的位置;所述匹配的位置在所述验证位置之后或与所述验证位置重合时,停止对所述关键词与待匹配数据进行近似匹配验证。
上述近似匹配验证子单元33可以具体用于:对于长度不大于32位的关键词,采用32位并行BPM算法进行单模式近似匹配的验证;对于长度大于32位,不大于64位的关键词,采用64位并行BPM算法进行单模式近似匹配的验证;对于长度大于64位的关键词,采用任意位并行BPM算法进行单模式近似匹配的验证。
本发明实施例提供的方法和装置中,在预处理阶段拆分关键词以生成关键词子串集合并为关键词子串集合建立对应的表项,进而进行精确匹配和近似匹配验证以得到近似匹配结果。因此大幅提高了大规模关键词情况下近似匹配算法的性能。具体的,通过建立跳跃表,使得搜索阶段精确匹配各关键词子串时能够快速的向前跳跃;通过建立哈希表,使得搜索阶段出现可能的精确匹配时,找到可能存在匹配的关键词片断;通过建立前缀表,使得搜索阶段精确匹配时过滤不可能匹配的关键词子串。通过上述跳跃表、哈希表和前缀表的结合使用,提高了大规模关键词情况下近似匹配的效率,满足了超大规模关键词情况下文本或网络内容近似匹配处理的实用要求。和现有技术相比,性能较传统算法有十倍以上的提升。确保了算法在平均情况下的匹配性能保持在一个很高的水平。在验证阶段,对经典近似匹配算法BPM算法进行了优化,分别针对32位、64位及64位以上的关键词作了优化,提高了验证阶段单模式近似匹配算法的匹配速度。
通过以上优化,本发明实施例提供的方法性能达到在实际应用中有较好的表现,相比现有算法100Mbps以下的处理能力,本发明实施例的方法在模式数为1000时,匹配性能达到3300Mbps,在模式数为10000时,匹配性能仍超过1500Mbps(上述性能数据为双核双CPU Xeon2GHz处理器,前端总线频率1333MHz,L2CACHE4MB,Unix操作系统下的实测数据),达到了实用化要求。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。