基于自动机的中文多模式匹配算法研究及其应用
乐红霞1
1(西南石油大学计算机科学与技术学院 学号:201821000400)
摘要 模式匹配是计算机应用领域重要的研究方向之一,广泛应用于入侵检测、信息搜索,生物科学等方面。随着计算机网络技术的飞速发展,信息量呈爆炸式增长,如何提高模式匹配算法的心梗成了信息检索、内容过滤等领域研究的热门课题。本文主要介绍自动机在AC算法、AC_BM算法上的应用以及AC算法在NLP上的应用。
关键词 多模式匹配;AC算法、AC_BM算法;
1 概述
1.1 模式匹配的意义
随着互联网的广泛应用,计算机网络给人们带来了方便和快捷,但也被其海量信息所淹没。无序、庞大的信息世界和形式多样的链接方式,让人们在查找所需信息时感到无所适从。同时,一些不良信息也严重影响着人们的身心健康。因此,如何能够更准确、更有效地找到自己感兴趣的内容,屏蔽与需求无关的信息或有害信息是很重要的。
模式匹配算法作为信息检索和内容过滤的核心,也被广泛地应用于搜索引擎、入侵检测系统、计算机病毒检测、内容过滤防火墙等。面对网络上的大量信息,对中文模式匹配算法进行优化是很重要的,这对于中心信息检索和内容过滤等有非常重要的意义。
1.2模式匹配的相关算法
最早出现的模式匹配算法是单模式匹配算法 BF算法,后来又有Turbo BMsuanfa 、BM-Horspool-Raita算法、BMI算法、Simon算法、Shift-Or算法、Apostolico算法、KR算法等。不同于单模式匹配算法,多模式匹配算法扫描一遍文本串能识别出多个模式串。于是有一个经典的多模式匹配算法—AC算法。该算法基于自动机,通过状态转移,一次可识别多个模式串。而AC_BM算法对AC算法进行改进,可跳跃式匹配,但其计算安全跳转距离还很保守,平均跳转距离较小。
2 模式匹配的定义
模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。
假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。
2.1 AC算法
AC算法是为了解决多模式匹配问题。换句话说,就是在大字符串S中,看看小字符串s1, s2,...有没有出现。该算法匹配之前先对模式串集合构造有限状态自动机,匹配过程中通过状态的转移,扫描一遍文本串,可识别出全部模式串。AC 算法包括预处理阶段和匹配阶段。
(1)预处理
预处理阶段的主要任务是构造有限状态自动机并计算三个函数:goto(转移函数),failure(失效函数)和 output(输出函数)。
① 构造有限状态自动机
设模式串集合 K={y1,y2,...yi...yn}。对 K 中的每个模式串 yi,初始状态为 0。从状态 0 出发,逐个取出 yi中的每一个字符;如果从当前状态出发能够找到标注该字符的矢线,则将矢线所指的状态作为当前状态;否则,添加一个新状态,新状态为已有的最大状态加 1,并将新加入的状态作为当前状态,继续对 yi中的下一个字符进行处理。当模式串集合 K 中所有的模式串都处理完毕,再添加一条从状态 0到状态 0 的自反线,表示保持状态 0 的字符集。例如,设模式串集合 K={he,she,his,hers},所建立的有限状态自动机如图 2.1所示。
图2.1有限状态自动机
② goto函数
设状态集合U = {0,1,2,…},文本串当前字符为‘a’,则goto函数为一种映射goto(U,a)->U。
goto 函数计算过程:如果从当前状态出发能够找到标注字符“a”的矢线,则返回矢线所指的状态,否则返回跳转失败状态 fail。
③ failure函数
失效函数 failure 函数用来计算某个字符失配时,应转移的状态。计算过程:
(i)若某状态的父状态为0,则该状态的失效函数为 0。
( ii ) 对 于 其 它 状 态 m , 设 其 父 状 态 为 r , 则 该 状 态 的 失 效 函 数
failure(m)=goto(failure(r),a)。
④ output 函数
输出函数 output 函数用来输出已匹配的模式串,计算过程分为两步:
(i) 在构造有限状态自动机的过程中,每处理完一个模式串,将该模式串加入到当前状态 s 的输出函数中。
(ii) 在计算 failure 函数过程中,若 failure(s)=s′,则 output(s)=output(s)∪output(s′)。
(2)匹配过程
①当前状态s 初始化为 0,文本串指针指向文本串的首字符。
②若文本串的当前指针不为空,则取出所指的字“a”;否则匹配过程结束。
③计算s′=goto(s,a)。若 s′≠fail,则 s=s′,向右移动文本串指针 1 位,并计算 output 函数,若 output(s)=NULL,转步骤②;否则,输出 output(s)的值,表示有模式串匹配成功,转步骤②。
④若 s′=fail,调用 failure 函数,即当前状态 s=failure(s′),转步骤③。
例如:
(1)ASCII码 h=104,s=115,e=101,i=105,r=114,第一层{h,s};Next表:产生2个新状态,状态1,2
Base表:Base[0]=-103
Check表:Check[1]=0;Check[2]=0;
(2)ASCII码 h=104,s=115,e=101,i=105,r=114,模式集第二层{e,h,i};Next表:产生3个新状态,状态3,4,5
Base表:
1状态:he,hi; Base[1]=-100
2状态:sh; Base[2]=-113
Check表:Check[3]=1;Check[4]=1; Check[5]=2;
(3)ASCII码 h=104,s=115,e=101,i=105,r=114,模式集第三层{e,s,r};Next表:产生3个新状态,状态6,7,8
Base表:
3状态:her; Base[3]=-112
4状态:his; Base[4]=-116
5状态:she;Base[5]=-97
Check表:Check[3]=3;Check[7]=4; Check[8]=5;
(4)ASCII码 h=104,s=115,e=101,i=105,r=114,模式集第四层{s};Next表:产生1个新状态,状态9
Base表:
6状态:hers; Base[6]=-111
Check表:Check[9]=6
用python代码实现的结果如下:
AC算法预处理时需建立有限状态自动机,其时间复杂为 О(m) ,其中m为所有模式串的长度总和;匹配过程中仅需扫描一遍文本串,时间复杂为 О(n) , n为文本串的长度,与模式串的个数及每个模式串的长度无关。
单模式匹配算法处理多个模式串时需多次扫描文本串。AC 算法通过有限状态自动机,可对所有模式串并行的进行处理,同单模式匹配算法相比,减少了比较的次数,提高了模式串的匹配速度。
2.2 AC_BM算法
AC 算法匹配过程需逐个扫描文本串的字符,不能进行跳跃式匹配。改进后为AC_BM 算法,描述如下:
(1)预处理
①构建有限状态自动机。
与AC算法不同的是,AC_BM 算法需构造反向有限状态自动机。例如对模式串“amne”和“abcde”,AC 算法和 AC_BM 算法构造的有限状态自动机如下图所示。
②计算跳转距离。
AC_BM 算法跳转距离的计算借鉴了 BM
算法的好后缀规则和坏字符规则。设最短模式串长度为 m,失配字符为 t,字符 t 在有限状态自动机中的深度为 k。
(i)好后缀规则
设已匹配的字符串为 S。若在有限状态自动机的 m 深度内存在以字符串 S作为前缀的模式串,则跳转距离为(m-k)个字符;否则,在有限状态自动机的m 深度内查找以字符串 S 的后缀子串作为前缀的模式串:若存在,设其长度为q,则跳转距离为(m-q)个字符;若不存在,则跳转距离为 1 个字符。
(ii)坏字符规则
若失配字符 t 在有限状态自动机的 m 深度内未出现,则跳转距离为(m-k+1)个字符;若字符 t 出现在有限状态自动机中的某个模式串中,设其深度为 p(k
≤m)(如果字符 t 在模式串多处出现,取其深度 p 的最小值),则跳转距离为(p-k)个字符。
(iii)计算跳转距离
分别利用坏字符规则和好后缀规则计算出跳转距离,取其较大者作为失配字符 t 的跳转距离。
(2)匹配阶段
①初始状态 s 为 0,文本串指针指向文本串的首字符。文本串的第 m 个字符与有限状态自动机的第 1 层节点与对齐。
②若文本串的当前指针不为空,则取出所指的字符“a”;否则匹配过程结束。
③计算 s′=goto(s,a)。若 s′≠fail,则 s=s′,并向右移动文本串指针 1 位;否则,利用坏字符规则和好后缀规则分别计算跳转距离,并取其较大者作为文本串指针的跳转距离。
④计算 output 函数,若 output(s)=NULL,转步骤②;否则,输出 output(s)的值,表示有模式串匹配成功,转步骤②。
AC_BM 算法的预处理阶段的时间复杂度同 AC 算法。匹配阶段,最坏情况下的时间复杂度为 О(n) ,其中 n 为文本串的长度;最好情况下的时间复杂度为О(n/ m) ,m 为最短模式串的长度。
AC_BM 算法实现了模式串的跳跃式匹配,使自动机的跳转距离大于 1,时间效率显著提高。
- AC算法的应用
AC算法在中文分词、关键词提取、文本反垃圾、敏感词过滤中都有运行,他们的本质都是关键字匹配。
参 考 文 献
[1] 宋华,戴一奇.一种用于内容过滤和检测的快速多关键词识别算法[J]. 计算机研究与发展,2004,41(6): 940-945
[2] 王慧强,杜晔,庞永刚.入侵检测技术研究[J].计算机应用研究.2003,10:90-115