基于自动机的中文多模式匹配算法研究及其应用

 

基于自动机的中文多模式匹配算法研究及其应用

乐红霞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所示。

基于自动机的中文多模式匹配算法研究及其应用_第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′),转步骤③。

例如:

(1ASCII h=104s=115e=101i=105r=114,第一层{h,s}Next表:产生2个新状态,状态1,2

 

基于自动机的中文多模式匹配算法研究及其应用_第2张图片

 

 

Base表:Base[0]=-103

  Check表:Check[1]=0;Check[2]=0;

 

2ASCII h=104s=115e=101i=105r=114,模式集第二层{e,h,i}Next表:产生3个新状态,状态3,4,5

 

 基于自动机的中文多模式匹配算法研究及其应用_第3张图片

 

 

Base表:

1状态:he,hi; Base[1]=-100

2状态:sh; Base[2]=-113

  Check表:Check[3]=1;Check[4]=1; Check[5]=2;

 

3ASCII h=104s=115e=101i=105r=114,模式集第三层{e,s,r}Next表:产生3个新状态,状态6,7,8

 

 

 基于自动机的中文多模式匹配算法研究及其应用_第4张图片

 

Base表:

3状态:her; Base[3]=-112

4状态:his; Base[4]=-116

5状态:sheBase[5]=-97

Check表:Check[3]=3;Check[7]=4; Check[8]=5;

 

4ASCII h=104s=115e=101i=105r=114,模式集第四层{s}Next表:产生1个新状态,状态9

 

基于自动机的中文多模式匹配算法研究及其应用_第5张图片

 

 

Base表:

6状态:hers; Base[6]=-111

Check表:Check[9]=6

 

python代码实现的结果如下:

 

基于自动机的中文多模式匹配算法研究及其应用_第6张图片

 

AC算法预处理时需建立有限状态自动机,其时间复杂为 О(m) ,其中m为所有模式串的长度总和;匹配过程中仅需扫描一遍文本串,时间复杂为 О(n) , n为文本串的长度,与模式串的个数及每个模式串的长度无关。

单模式匹配算法处理多个模式串时需多次扫描文本串。AC 算法通过有限状态自动机,可对所有模式串并行的进行处理,同单模式匹配算法相比,减少了比较的次数,提高了模式串的匹配速度。

 

2.2 AC_BM算法

AC 算法匹配过程需逐个扫描文本串的字符,不能进行跳跃式匹配。改进后为AC_BM 算法,描述如下:

1)预处理

①构建有限状态自动机。

与AC算法不同的是,AC_BM 算法需构造反向有限状态自动机。例如对模式串“amne”和“abcde”,AC 算法和 AC_BM 算法构造的有限状态自动机如下图所示。

基于自动机的中文多模式匹配算法研究及其应用_第7张图片

基于自动机的中文多模式匹配算法研究及其应用_第8张图片

②计算跳转距离。

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 出现在有限状态自动机中的某个模式串中,设其深度为 pkm)(如果字符 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,时间效率显著提高。

 

  1. AC算法的应用

  AC算法在中文分词、关键词提取、文本反垃圾、敏感词过滤中都有运行,他们的本质都是关键字匹配。

 

[1] 宋华,戴一奇.一种用于内容过滤和检测的快速多关键词识别算法[J]. 计算机研究与发展,2004,41(6): 940-945 

[2]  王慧强,杜晔,庞永刚.入侵检测技术研究[J].计算机应用研究.2003,10:90-115

 

 

 

 

 

 

 

 

你可能感兴趣的:(基于自动机的中文多模式匹配算法研究及其应用)