建立模式匹配状态机的方法及装置制造方法及图纸

技术编号:3773155 阅读:187 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种建立模式匹配状态机的方法及装置,该方法包括:获取预定义的关键字集合;根据所述关键字集合生成迁移Goto函数;根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;根据Goto函数和Failure函数生成输出Output函数。利用本发明专利技术,可以减少模式匹配过程中低效的Failure链,提高模式匹配处理效率。

【技术实现步骤摘要】

本专利技术涉及模式匹配技术,具体涉及一种建立模式匹配状态机的方法及装置
技术介绍
模式匹配一般是指在文本数据中搜索预定义的关键字。模式匹配问题是计 算机科学中的一个基本问题,其研究内容在信息检索、模式识别等众多领域均 有重要价值,在拼写检查、语言翻译、数据压缩、搜索引擎、入侵检测、内容 过滤、计算机病毒特征码匹配以及基因序列比较等应用中起着重要的作用。比 如,在一些信息获取、文本编辑应用中,用户会指定一些关键字,需要在文本 中快速定位关键字的位置。Aho-Corasick (阿霍-克若思克)算法描述了 一种简单有效的算法,能够 在任意的文本中定位有限数目的关键字的所有位置。其原理是首先根据这一 系列关键字定义一个有限状态模式匹配机,然后把文本作为模式匹配机的输 入。只要匹配到关键字,就会通报本关键字匹配成功。以用户指定关键字集合(he, she, his, hers)为例,用户希望在文本搜索中出 现任一个关键字,就输出搜索结果,通知用户。如图1所示,利用Aho-Comsick 进行模式匹配的过程如下根据关键字集合(he, she, his, hers》生成Goto函数、 Failure、 Output函数,包括两个步骤第一步确定状态和Goto函数,第二步 计算Failure函数。Output函数的构建在第一步开始,在第二步完成。如图l (a)所示,根据关键字集合生成Goto函数(在算式中以g代表Goto 函数)。Goto函数g根据当前状态和输入符号决定迁移状态。例如,在0状态输入h 会迁移到l状态,表示为g(O, h)=l;在状态3输入h会迁移到状态4,表示为g(3, h)=4。如果在某状态输入某个符号无法迁移成功,则意味着Goto函数失败,结 果以fail表示,如在状态3输入e导致Goto函数失败,则表示为g(3, e)=fail。Output函数表示在某状态匹配成功,可以输出的结果,如Output(2) = "he"。 为了构建Goto函数,要构建一个goto有向图。有向图以一个代表初始状态0的顶点开始,然后输入关键字到有向图中,添加一个从初始状态开始的路径。在添加絲4圣的过程中,新的顶点和边^皮添加到了有向图中,所以/人初始状态开始一条路径能拼出一个完整的关键字。这条路径在某个状态终止,这个状态被添加到了Output函数中。假设(he, she, his, hers》是关键字集合,生成有限状态机的过程如图2所示添加第一个关键字"he,,到有向图中,得到图2(a)所示。从状态0到状态2 拼出关4建字"he,,;将输出"he"关联到状态2上,即Output(2"(he》。将第二个关键字"she,,添加到有向图中,得到图2(b)所示。将输出"she,, 关联到状态5,即Output(5"(she》。将第三个关键字"his"添加到有向图中,得到如图2 (c)所示。需要注意的是,当添加关4建字"his"时,已经有一个标记为h的边,从状态0 到状态l,所以不需要再添加其他标记h的边从状态O到状态l。将输出"his"关联 到状态7,即Output(7)^his〉。添加最后一个关键字"hers",得到如图2 (d)所示。输出"hers,,关联到状 态9,即Output(9"(hers)。在添加过程中,可以使用已经存在的标记h的边(从 状态0到状态1)和标记e的边(从状态1到状态2)。为了完成Goto函数的构建,还需要添加一个循环,该循环从状态0到状态0, 对应于除了h和s外的其他输入符号。得到结果如图l (a)所示。Failure函数(在算式中以f代表)表示在某个状态Goto函数失败时,应该 跳转到哪一个状态继续进行匹配。如图l (b)所示,在状态5,当输入一个r 符号时,g(5, r)= fail,就要调用f(5"2处理,即先跳转到状态2,然后再调用 g(2,r)处理。因为Failure函数代表着一个状态向另一个状态的迁移,相当于增 加了 一条链在两个状态之间, 一般也可以将某状态Failure函数的指向称为本状 态的Failure链。Failure函数基于Goto函数构建。首先定义一个状态s在goto有向图中的深 度,即从初始状态到s的最短路径的长度。在图l (a),初始状态的深度为O, 状态1和3的深度为1,状态2、 4、 6的深度为2,依此类推。计算一个状态的Failure函数f的算法如下先计算所有深度为1的状态的 Failure状态,然后是计算所有深度为2的状态的Failure状态, 一直到所有状态7的Failure状态都被计算,则本状态机的Failure函数构建完成。置所有深度为l的状态的Failure状态为O,现在假设已经计算出了深度小于d的所有状态的Failure状态,则深度为d的状态s的Failure状态可以由深度为d-l状态的Goto函数的非fail值推导出来,具体过程如下 首先,考虑深度为d-l的每个状态r并执行以下处理1. 如果对所有的输入符号a,都是g(r,a^fail,则结束状态r的处理。2. 否则,对每个输入符号a产生输出g(r,a"s的情况,执行以下操作(a) 设置状态变量state二f(r);(b) 执行算式state —f(state)(即将f(state)赋值给状态变量state )零到多次, 直到state的值满足g(state, a) # fail。(因为g(O, a) - fail,所以适合的state 值总能被发现);(c) "i殳置f(s)二g(state, a)。例如,为了计算图l (a)中的Failure函数,应该首先设置f(l)二f(3)二0,因 为1和3是深度为1的状态。然后计算深度2的状态2、 4、 6的Failure函数。 为了计算f(2),设置state二f(l"0;因为g(O, e)=0,所以f(2"0。 为了计算f(6),设置state二f(l一0;因为g(0,i)二0,所以f(6)二0。 为了计算f(4),设置state二f(3"0;因为g(0,h一l,所以f(4)二l。 依照这种思路计算,就得到完整的Failure函数,如图l (b)所示。 在Failure函数的计算过程中,同时更新Output函数。当确定f(s"s',而状 态s和s-同时是Output状态时,则将s-的输出集合并到s的输出集中。例如, 从图l (a)中,可以确定f(5"2。在这个点上,合并状态2的输出集(he)到状态 5,从而得到新的输出集(he, she}。最终的Output函数如图1 (c)所示。 下面举例进一步说明状态机的匹配过程。以输入文本,,sshe,,进行搜索为例,当输入第一个s时,g(O, s)=3,所以迁移 到状态3;输入第二个s, Goto函数失败,g(3, s)=fail,则调用Failure函数,f(3)=0 表示跳转到状态O,然后g(O, s)=3,所以当前状态仍然是状态3;输入h, g(3, h)=4, 迁移到状态4;输入e, g(4, e)=5,迁移到状态5;因为Output(5"(she, he},所 以本次搜索发现了 {she, he}两个用户预定义关键字。在实现本专利技术的过程中,专利技术人发现,现有的Aho-Corasick算法本文档来自技高网...

【技术保护点】
一种建立模式匹配状态机的方法,其特征在于,包括: 获取预定义的关键字集合; 根据所述关键字集合生成迁移Goto函数; 根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态 的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败; 根据Goto函数和Failure函数生成输出Output函数。

【技术特征摘要】

【专利技术属性】
技术研发人员:陈建魏启坤陈国海
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:94[中国|深圳]

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

1