專利名稱:一種建立模式匹配狀態(tài)機(jī)、模式識(shí)別的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及模式匹配技術(shù)領(lǐng)域,特別涉及一種建立模式匹配狀態(tài)機(jī)、模式識(shí)別的方法和 裝置。
背景技術(shù):
模式匹配一般是指在文本數(shù)據(jù)中搜索預(yù)定義的關(guān)鍵字。模式匹配問(wèn)題是計(jì)算機(jī)科學(xué)中的' 一個(gè)基本問(wèn)題,其研究?jī)?nèi)容在信息檢索、模式識(shí)別等眾多領(lǐng)域均有重要價(jià)值,在拼寫(xiě)檢査、 語(yǔ)言翻譯、數(shù)據(jù)壓縮、搜索引擎、入侵檢測(cè)、內(nèi)容過(guò)濾、計(jì)算機(jī)病毒特征碼匹配以及基因序 列比較等應(yīng)用中起著重要的作用。比如,在一些信息獲取、文本編輯應(yīng)用中,用戶會(huì)指定
些關(guān)鍵字;需要在文本中快速定位關(guān)鍵字的位置。
Aho-Corasick算法(阿霍-克若思克算法,簡(jiǎn)稱AC算法)描述了一種簡(jiǎn)單有效的算法, 能夠在任意的文本中定位有限數(shù)目的關(guān)鍵字的所有位置。其原理是首先根據(jù)這一系列關(guān)鍵 字定義一個(gè)有限狀態(tài)模式匹配機(jī),然后把文本作為模式匹配機(jī)的輸入。只要匹配到關(guān)鍵字, 就會(huì)通報(bào)本關(guān)鍵字匹配成功。其中,AC算法可以根據(jù)每次輸入的字節(jié)數(shù),劃分為原始AC算 法(每次輸入1個(gè)字節(jié))和多字節(jié)AC算法。
參見(jiàn)圖1,為現(xiàn)有技術(shù)提供的利用原始AC構(gòu)建的函數(shù)示意圖,以用戶指定關(guān)鍵字集合 {he, she, Ws, hers》為例,用戶希望在文本搜索中出現(xiàn)任一個(gè)關(guān)鍵字,就輸出搜索結(jié)果, 通知用戶。利用原始AC進(jìn)行模式匹配的過(guò)程如下根據(jù)關(guān)鍵字集合0ie, she, his, hers} 生成Goto函數(shù)(圖1A所示)、Failure (圖IB所示)、Output函數(shù)(圖1C所示),包括兩個(gè) 步驟第一步確定狀態(tài)和Goto函數(shù)(以g表示),第二步計(jì)算Failure函數(shù)(以f表示)。Output 函數(shù)的構(gòu)建在第一步開(kāi)始,在第二步完成。以輸入文本"sshe"進(jìn)行搜索為例,當(dāng)輸入s時(shí),g(O, s)=3,所以遷移到狀態(tài)3;輸入第二個(gè)s, Goto函數(shù)失敗,g(3, s)=fail,則調(diào)用Failure函 數(shù),f(3)=0表示跳轉(zhuǎn)到狀態(tài)0 ,然后g(O, s)=3,所以當(dāng)前狀態(tài)仍然是狀態(tài)3;輸入h, g(3, h)=4,遷移到狀態(tài)4;輸入'e', g(4, e)=5,遷移到狀態(tài)5;因?yàn)镺utput(5)={she, he},所 以本次搜索發(fā)現(xiàn)了《she, he)兩個(gè)用戶預(yù)定義關(guān)鍵字。
由于原始AC算法的每次輸入都是1個(gè)字節(jié),為了提高算法效率,Sarang提出了改進(jìn)AC算法(即多字節(jié)AC算法),其基本思想是每次輸入n個(gè)字節(jié)并進(jìn)行檢測(cè),因?yàn)槎x的n個(gè) 字節(jié)的特征串在輸入的待測(cè)數(shù)據(jù)中的位置有可能并非正好是從輸入數(shù)據(jù)起始位置開(kāi)始的n的 整數(shù)倍上可能會(huì)出現(xiàn)任意偏移O個(gè)到n-l個(gè)字符,為了避免檢測(cè)遺漏,因此需要對(duì)所有偏 移位置都進(jìn)行檢測(cè),即并行的采用n個(gè)檢測(cè)狀態(tài)匹配機(jī)來(lái)進(jìn)行同時(shí)檢測(cè)。
參見(jiàn)圖2,為現(xiàn)有技術(shù)提供的利用多字節(jié)AC構(gòu)建的函數(shù)示意圖,以用戶指定的關(guān)鍵詞的 組合為(Sl: :technical; S2: technically; S3: tel.; S4: telephone; S5: phone; S6: elephant} 為例,檢測(cè)步長(zhǎng)n為4字節(jié);圖2A給出了構(gòu)造得到的Goto函數(shù)示意圖,從狀態(tài)q0開(kāi)始, 輸入tech轉(zhuǎn)移到ql ,輸入tele轉(zhuǎn)移到q2,輸入phon轉(zhuǎn)移到q3 ,輸入elep轉(zhuǎn)移到q4等等。 由于匹配模式不一定都是4字節(jié)的整數(shù)倍,因此還需要補(bǔ)充短的字段,圖2B給出了帶Failure 函數(shù)的示意圖,該圖補(bǔ)充了短的字段。
采用多字節(jié)的AC,可以在每次跳轉(zhuǎn)以n字節(jié)為步長(zhǎng),相對(duì)于原始的AC算法實(shí)現(xiàn)n字節(jié) 跳轉(zhuǎn)需要訪問(wèn)n次內(nèi)存,現(xiàn)在只需要訪問(wèn)一次,是原始的AC的訪問(wèn)速度的4倍。
但是;無(wú)論是原始AC算法,還是多字節(jié)AC算法,由于Failure函數(shù)的出現(xiàn),會(huì)導(dǎo)致AC 模式匹配狀態(tài)機(jī)在Goto函數(shù)出現(xiàn)Failure時(shí)要多一次或多次訪問(wèn)內(nèi)存的操作一需要去讀取 Failure函數(shù),影響了 AC算法的效率。
并且,特別是針對(duì)多字節(jié)AC算法,狀態(tài)轉(zhuǎn)移表的索引不只是輸入狀態(tài),還要包括輸入 的字符串,所以每條記錄必須把完整的Failure鏈保存下來(lái),不然一旦匹配失敗,將找不到失 敗后的狀態(tài),參見(jiàn)圖3,為針對(duì)圖2提供的多字節(jié)AC算法的的狀態(tài)示意圖,以圖中的〈q2,. phon〉記錄,如果只保存第一級(jí)失效的q3狀態(tài),當(dāng)輸入的字符串在q3狀態(tài)下仍然失效時(shí),則 需要查詢到在q3輸入狀態(tài)下的Failure輸出狀態(tài),但q3的Failure輸出狀態(tài)是保存在q3的父 狀態(tài)即〈q0, phon〉條目中的,由于無(wú)法從簡(jiǎn)單的從q3反推出q3的上一級(jí)狀態(tài)是q0,也就無(wú) 法在這個(gè)狀態(tài)表中進(jìn)行新的失效函數(shù)的查詢,因此會(huì)導(dǎo)致無(wú)法工作下去。
并且,由于Failure鏈不定長(zhǎng),無(wú)法在一個(gè)表項(xiàng)保存,所以應(yīng)當(dāng)另建Failure鏈表用來(lái)保 存完整Failure鏈,通過(guò)指針函數(shù)等形式將原始表中的Failure指向新建的完整Failure鏈表的 某個(gè)地址,而這樣處理方法復(fù)雜多變,且需要額外的存儲(chǔ)空間,因此需要額外的處理步驟。
綜上,為了提高AC算法的效率,現(xiàn)有技術(shù)提供一種針對(duì)原始AC算法去除Failure函數(shù) 得方法,其中,該方法通過(guò)引入一個(gè)^函數(shù),取代原先的Goto函數(shù)g,即將所有Goto函數(shù) 和Failure函數(shù)合并了后的新的轉(zhuǎn)移函數(shù)其創(chuàng)建要以Goto函數(shù)和Failure函數(shù)為基礎(chǔ)。建 立了這個(gè)^函數(shù)以后,AC算法的模式匹配狀態(tài)機(jī)就由一個(gè)有限的狀態(tài)集合S及這個(gè)下一跳轉(zhuǎn) 移函數(shù)5組成。對(duì)于每一個(gè)狀態(tài)r下的輸入字符a, "s,a)都會(huì)有一個(gè)屬于有限的狀態(tài)集合S的輸出狀態(tài)S,也就是說(shuō)對(duì)于每一個(gè)輸入字符,都有一個(gè)確定的輸出狀態(tài)。這樣實(shí)際上就沒(méi)有 了 Failure函數(shù)了,在進(jìn)行模式匹配時(shí)簡(jiǎn)單的執(zhí)行加fe仨5(加fe,",)即可。其中,生成該^函 數(shù)的步驟為
1. 新建一個(gè)空的狀態(tài)集合S;
2. 對(duì)于最起始的狀態(tài)0,將每一個(gè)輸入的Goto函數(shù)生成的狀態(tài)做為^函數(shù)的輸出狀態(tài) WO,") = g(G,fl:),如果輸出狀態(tài)r不為o,則將該狀態(tài)r加入到空的狀態(tài)集合中去S —
3. 從狀態(tài)集合中取出每一個(gè)新的狀態(tài)s,將該狀態(tài)s先從狀態(tài)集合S中刪除,對(duì)于該狀 態(tài)s下的每一個(gè)輸入字符a,執(zhí)行
(1) .如果轉(zhuǎn)移函數(shù)gO,")的輸出不是fail,則將該輸出狀態(tài)設(shè)置為該狀態(tài)下的^函數(shù)的輸
出,如^>,《0 = gO^");
(2) .如果轉(zhuǎn)移函數(shù)g"")的輸出是fail,則將該輸出狀態(tài)的失效函數(shù)的輸出狀態(tài)作為新的 輸入狀態(tài)執(zhí)行轉(zhuǎn)移函數(shù)5,將其輸出狀態(tài)做為轉(zhuǎn)移函數(shù)的輸出狀態(tài)"s,a) =
4. 依次類推,直到狀態(tài)集合S中的狀態(tài)為空。
針對(duì)圖l,圖4為采用^函數(shù)后消除Failure的狀態(tài)轉(zhuǎn)移示意圖,其中,以狀態(tài)8為例, 在圖1中只有Goto到狀態(tài)9的轉(zhuǎn)移函數(shù)和Failure到狀態(tài)0的失效函數(shù),但現(xiàn)在經(jīng)過(guò)合并后, 就把失效到狀態(tài)O的失效函數(shù)轉(zhuǎn)成了輸入h到狀態(tài)l的新的^函數(shù)了,其中,輸入為"."是 指除了s、 h外所有其他的字符。有了這樣的^函數(shù)后,就不需要考慮是Failure還是Goto函 數(shù)了,可以依據(jù)5函數(shù)的指示進(jìn)行明確的一步跳轉(zhuǎn),提高原始AC算法的效率。
但是,在實(shí)際實(shí)現(xiàn)時(shí),為了保證運(yùn)行效率,每個(gè)狀態(tài)下的可轉(zhuǎn)移狀態(tài)都是一個(gè)256個(gè)單 元的一維數(shù)組,對(duì)每個(gè)輸入狀態(tài)下的所有可能的n個(gè)輸入都填入下一跳轉(zhuǎn)移輸出^函數(shù),n 個(gè)字節(jié)的所有可能輸入是nx256個(gè)可能,而實(shí)際有效的輸入不會(huì)超過(guò)5個(gè),這樣的存儲(chǔ)形式, 會(huì)造成資源的浪費(fèi)。
發(fā)明內(nèi)容
為了解決AC算法中的Failure函數(shù)處理導(dǎo)致的復(fù)雜存儲(chǔ)、處理和低效率的問(wèn)題,提高 AC算法的處理速度,本發(fā)明實(shí)施例提供了一種建立模式匹配狀態(tài)機(jī)、模式識(shí)別的方法和裝置。
所述技術(shù)方案如下 , 一種建立模式匹配狀態(tài)機(jī)的方法,所述方法包括
根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段; 根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)所述Goto函數(shù),生成所述各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);
根據(jù)所述Goto函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移5函數(shù)。 一種模式識(shí)別的方法,所述方法包括-
根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段;
根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)所述Goto函數(shù),生成所述各 狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);
根據(jù)所述Goto函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。
根據(jù)所述^函數(shù)執(zhí)行子關(guān)鍵字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以 狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段為索引的^函數(shù)的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)q0為所述輸 入狀態(tài)節(jié)點(diǎn)的5函數(shù)的輸入狀態(tài),根據(jù)所述新的輸入狀態(tài)和所述子關(guān)鍵字字段執(zhí)行^函數(shù); 如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú)法獲取到所述子關(guān)鍵字字段的匹配,則設(shè)置所述q0為輸出狀態(tài)。
一種建立模式匹配狀態(tài)機(jī)的裝置,所述裝置包括
根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段; 根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)所述Goto函數(shù),生成所述各 狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);
根據(jù)所述Goto函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移5函數(shù)。 根據(jù)所述^函數(shù)執(zhí)行子關(guān)鍵字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以 狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段為索引的^函數(shù)的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)q0為所述輸 入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸入狀態(tài),根據(jù)所述新的輸入狀態(tài)和所述子關(guān)鍵字字段執(zhí)行^函數(shù); 如果在初始狀態(tài)節(jié)點(diǎn)qO無(wú)法獲取到所述子關(guān)鍵字字段的匹配,則設(shè)置所述q0為輸出狀態(tài)。
一種模式識(shí)別的裝置,所述裝置包括
模式匹配狀態(tài)機(jī)建立模塊,用于根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字, 獲取劃分后得到的子關(guān)鍵字字段;根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù) 所述Goto函數(shù),生成所述各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)所述Goto函數(shù)和所述Failure 函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移5函數(shù)。
處理模塊,用于根據(jù)所述模式匹配狀態(tài)機(jī)建立模塊建立的^函數(shù),根據(jù)所述^函數(shù)執(zhí)行 子關(guān)鍵字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字 字段為索引的^函數(shù)的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)qO為所述輸入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸 入狀態(tài),根據(jù)所述新的輸入狀態(tài)和所述子關(guān)鍵字字段執(zhí)行^函數(shù);如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú) 法獲取到所述子關(guān)鍵字字段的匹配,則設(shè)置所述q0為輸出狀態(tài)。本發(fā)明實(shí)施例提供的技術(shù)方案的有益效果是
通過(guò)在多字節(jié)的AC算法消除其原有的Failure鏈,連同原有的Goto函數(shù)一同轉(zhuǎn)換成一 種統(tǒng)一的5轉(zhuǎn)移函數(shù),在對(duì)失效鏈進(jìn)行轉(zhuǎn)換的過(guò)程中對(duì)于會(huì)Failure到初始狀態(tài)的表項(xiàng)不生成,
從而不會(huì)導(dǎo)致大規(guī)模的存儲(chǔ)空間的增長(zhǎng),節(jié)約了存儲(chǔ)空間,同時(shí)優(yōu)化了 AC算法的存儲(chǔ)結(jié)構(gòu), 簡(jiǎn)單并固化了 AC算法的處理步驟,從而最終提高了 AC算法的處理速度。
圖1是現(xiàn)有技術(shù)提供的利用原始AC算法構(gòu)建的函數(shù)示意圖; 圖2是現(xiàn)有技術(shù)提供的利用多字節(jié)AC算法構(gòu)建的函數(shù)示意圖3是現(xiàn)有技術(shù)提供的多字節(jié)AC算法的狀態(tài)示意圖; ■ 圖4是現(xiàn)有技術(shù)提供的原始AC算法采用5函數(shù)后消除Failure的狀態(tài)轉(zhuǎn)移示意圖; 圖5是本發(fā)明實(shí)施例1提供的建立模式匹配狀態(tài)機(jī)的方法流程圖; 圖6是本發(fā)明實(shí)施例1提供的多字節(jié)AC算法消除Failure的狀態(tài)示意圖; 圖7是本發(fā)明實(shí)施例1提供的未采用本發(fā)明實(shí)施例提供的技術(shù)方案的多字節(jié)AC的有向 圖示意圖8是本發(fā)明實(shí)施例1提供的未采用本發(fā)明實(shí)施例提供的技術(shù)方案的多字節(jié)AC的狀態(tài) 轉(zhuǎn)移表示意圖9是本發(fā)明實(shí)施例1提供的相對(duì)于圖7采用本發(fā)明實(shí)施例提供的技術(shù)方案去除Failure 鏈的有向示意圖10是本發(fā)明實(shí)施例1提供的相對(duì)于圖7采用本發(fā)明實(shí)施例提供的技術(shù)方案去除Failure 鏈的狀態(tài)轉(zhuǎn)移表示意圖11是本發(fā)明實(shí)施例2提供的建立模式匹配狀態(tài)機(jī)的裝置示意圖; 圖12是本發(fā)明實(shí)施例3提供的模式識(shí)別的裝置示意圖。
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn) 一步地詳細(xì)描述。
本發(fā)明實(shí)施例提供的建立模式匹配狀態(tài)機(jī)的方法如下根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān) 鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段;根據(jù)子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)Goto函數(shù),生成各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)Goto函數(shù)和Failure
函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。 .
其中,在獲取子關(guān)鍵字字段時(shí),按預(yù)設(shè)字節(jié)為單位,對(duì)預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字 進(jìn)行劃分,得到子關(guān)鍵字字段,其中,對(duì)關(guān)鍵字劃分時(shí),如果不滿足預(yù)設(shè)字節(jié)的長(zhǎng)度,不滿 足預(yù)設(shè)字節(jié)長(zhǎng)度的字符構(gòu)成子關(guān)鍵字字段。
其中,根據(jù)Goto函數(shù)和Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù),具體
為
依次獲取狀態(tài)隊(duì)列S中的每一個(gè)狀態(tài)節(jié)點(diǎn),當(dāng)獲取每一個(gè)狀態(tài)節(jié)點(diǎn)時(shí),從狀態(tài)隊(duì)列S中 刪除獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)獲取的狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,生成狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的下一跳
狀態(tài)轉(zhuǎn)移^函數(shù)的輸出。其中,更為具體詳細(xì)的過(guò)程如下 創(chuàng)建狀態(tài)隊(duì)列S,狀態(tài)隊(duì)列初始為空;
從起始狀態(tài)節(jié)點(diǎn)qO開(kāi)始,根據(jù)qO的Goto函數(shù)和子關(guān)鍵字字段,判斷字段串字段對(duì)應(yīng)的 Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在;當(dāng)輸出狀態(tài)節(jié)點(diǎn)存在時(shí),設(shè)置字段串字段對(duì)應(yīng)Goto函 數(shù)的輸出狀態(tài)節(jié)點(diǎn)為字段串字段對(duì)應(yīng)^函數(shù)的輸出狀態(tài)節(jié)點(diǎn);并將非q0的輸出狀態(tài)節(jié)點(diǎn)依次 添加到狀態(tài)隊(duì)列S中;
按照在狀態(tài)隊(duì)列S中的狀態(tài)節(jié)點(diǎn)先進(jìn)先出的原則,依次獲取狀態(tài)隊(duì)列中的每一個(gè)狀態(tài)節(jié) 點(diǎn),當(dāng)獲取一個(gè)狀態(tài)節(jié)點(diǎn)時(shí),從狀態(tài)隊(duì)列中刪除獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)獲取的狀態(tài)節(jié)點(diǎn)和 子關(guān)鍵字字段,生成狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的^函數(shù)的輸出,并將非空的輸出狀態(tài)節(jié)點(diǎn)依次添加到狀 態(tài)隊(duì)列S中;
直到狀態(tài)隊(duì)列為空。
上述根據(jù)獲取的狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,生成狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的^函數(shù)的步驟,具體為:'
將字段串字段做為狀態(tài)節(jié)點(diǎn)的輸入,判斷狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否 存在;
如果狀態(tài)節(jié)點(diǎn)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)不存在,則判斷狀態(tài)節(jié)點(diǎn)的Failure函數(shù)輸出 是否為初始狀態(tài)節(jié)點(diǎn)q0,如果是,則不建立狀態(tài)節(jié)點(diǎn)的^函數(shù)輸出表項(xiàng),結(jié)束;否則,根據(jù) 狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,獲取狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出;
如果Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)存在,將Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)設(shè)置為狀態(tài)節(jié)點(diǎn)的^函 數(shù)的輸出,并將^函數(shù)的輸出狀態(tài)節(jié)點(diǎn)添加到狀態(tài)隊(duì)列。
其中,根據(jù)輸出狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,獲取^函數(shù)的 輸出,具體為將狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段做為^函數(shù)的輸入,獲取^函 數(shù)的輸出,生成Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出,其中,當(dāng)^函數(shù)的輸出不存在, 則不建立狀態(tài)節(jié)點(diǎn)的^函數(shù)輸出表項(xiàng),結(jié)束。
進(jìn)一步地,利用上述建立的模式狀態(tài)匹配機(jī),進(jìn)行模式識(shí)別時(shí),根據(jù)^函數(shù)執(zhí)行子關(guān)鍵 字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段為索引 的^函數(shù)的表項(xiàng),則設(shè)置初始狀態(tài)節(jié)點(diǎn)qO為輸入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸入狀態(tài),根據(jù)新的輸 入狀態(tài)和子關(guān)鍵字字段執(zhí)行^函數(shù);如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú)法獲取到子關(guān)鍵字字段的匹 配,則設(shè)置qO為輸出狀態(tài)。
本發(fā)明實(shí)施例提供的技術(shù)方案,不會(huì)導(dǎo)致大規(guī)模的存儲(chǔ)空間的增長(zhǎng),節(jié)約了存儲(chǔ)空間, 同時(shí)優(yōu)化了 AC算法的存儲(chǔ)結(jié)構(gòu),簡(jiǎn)單并固化了 AC算法的處理步驟,從而最終提高了 AC 算法的處理速度,具體內(nèi)容請(qǐng)參見(jiàn)如下各實(shí)施例
實(shí)施例1
參見(jiàn)圖5,本發(fā)明實(shí)施例提供了一種建立模式匹配狀態(tài)機(jī)的方法,該方法利用了消除 Failure鏈后^函數(shù)處理的簡(jiǎn)潔性,又避免了大量Fail到初始狀態(tài)q0的分支的存儲(chǔ),具體步驟 如下
101:'將模式庫(kù)中的字符串按預(yù)設(shè)長(zhǎng)度為邊界,將各種特征字符串分割成一連串的分段; 其中,將模式庫(kù)中的字符串按預(yù)設(shè)長(zhǎng)度為邊界進(jìn)行劃分時(shí),該預(yù)設(shè)長(zhǎng)度可以為預(yù)設(shè)字節(jié)
n,相應(yīng)地,對(duì)于不足n字節(jié)的也單獨(dú)形成一個(gè)分段。
例如,以背景技術(shù)中提到的關(guān)鍵字段Uechnical、technically,tel、telephone、phone、elephant}
這些特征串,預(yù)設(shè)字節(jié)以4字節(jié)為例,則形成《tech nica 1、 tech nica lly、 tel、 tele phon e、 phon
e》這樣的分段,其中,tech、 nica、 l等等,可以稱為字符串字段(或子關(guān)鍵字段)。 102:以分段獲取的單元為單位,生成Goto有向圖和相應(yīng)的Goto函數(shù)。 其中,在生成Goto有向圖和相應(yīng)的Goto函數(shù)時(shí),可以采用現(xiàn)有技術(shù)提供的任一生成Goto
函數(shù)的方法。
103: 以生成的Goto有向圖為基礎(chǔ),生成各狀態(tài)節(jié)點(diǎn)的Failure函數(shù)。
104:針對(duì)各狀態(tài)節(jié)點(diǎn),為每一個(gè)狀態(tài)節(jié)點(diǎn)生成轉(zhuǎn)移^函數(shù);具體內(nèi)容如下 104A:建立空的狀態(tài)隊(duì)列S;
104B:對(duì)于最起始的初始狀態(tài)q0,將每一個(gè)輸入的Goto函數(shù)生成的狀態(tài)做為^函數(shù)的 輸出狀態(tài)^G,fl0 —g(0,"),如果輸出狀態(tài)r不為0,則將該狀態(tài)r加入到空的狀態(tài)隊(duì)列S中去其中,本實(shí)施例中a為各字符串字段,如tech、 nica等等。
104C:從狀態(tài)隊(duì)列中取出每一個(gè)新的狀態(tài)s,將該狀態(tài)s先從狀態(tài)隊(duì)列S中刪除,對(duì)于該
狀態(tài)s下的輸入字符a,執(zhí)行如下步驟-
201:判斷轉(zhuǎn)移函數(shù)g("^)的輸出是否是fail,如果是,則執(zhí)行歩驟202;否則執(zhí)行步驟205;' 202:判斷該狀態(tài)下的失效函數(shù)Failure輸出是否為初始狀態(tài)qO;如果是,則執(zhí)行步驟203,
否則,執(zhí)行歩驟204;
歩驟203:不建立該節(jié)點(diǎn)的的轉(zhuǎn)移函數(shù)表項(xiàng),結(jié)束該狀態(tài)的處理;
步驟'204:將該狀態(tài)的Failure的輸出狀態(tài)作為新的輸入狀態(tài),執(zhí)行轉(zhuǎn)移函數(shù)^,將其輸
出狀態(tài)做為轉(zhuǎn)移函數(shù)的輸出狀態(tài)") — "/(",");
歩驟205:將該輸出狀態(tài)設(shè)置為該狀態(tài)下的^函數(shù)的輸出,如^"") —并將
輸出狀態(tài)節(jié)點(diǎn)添加到狀態(tài)隊(duì)列s中。
同理,重復(fù)采用上述歩驟,直到狀態(tài)隊(duì)列s的狀態(tài)為空為止。
對(duì)于每一個(gè)狀態(tài)r下的輸入字符串,^"")都會(huì)有一個(gè)屬于有限的狀態(tài)隊(duì)列S的輸出狀 態(tài)s,也就是說(shuō)對(duì)于每一個(gè)輸入的字符,都有一個(gè)確定的輸出狀態(tài)。這樣實(shí)際上就沒(méi)有了 Failure 函數(shù)了 ,在進(jìn)行模式匹配時(shí)簡(jiǎn)單的執(zhí)行Wafe — 5(Wafe,cO即可。
當(dāng)在執(zhí)行虛fe — 5(stofe,a,),如果不能在狀態(tài)轉(zhuǎn)移表中査詢到和"輸入狀態(tài)+輸入字符 串"為索引的表項(xiàng),就直接將qO設(shè)置為下一狀態(tài),即所有的輸入狀態(tài)下默認(rèn)的最終的Failure 處理函數(shù)輸出都為q0。
綜上所述,詳細(xì)論述了建立模式匹配狀態(tài)機(jī)的方法的過(guò)程,參見(jiàn)圖6下面仍以上述提到 的關(guān)鍵字段(technical、 technically、 tel、 telephone, phone、 elephant}為例,采用本發(fā)明實(shí) 施例提供建立模式匹配狀態(tài)機(jī)的方法獲取的多字節(jié)AC算法去除Failure的狀態(tài)轉(zhuǎn)移表的示意 圖,相比與圖3,圖中提供的狀態(tài)轉(zhuǎn)移表增加了圖中的
<q6, e>
NULL
s5
為了進(jìn)一步說(shuō)明采用本發(fā)明實(shí)施例提供的建立模式匹配狀態(tài)機(jī)的方法所帶來(lái)的有益效 果,以《sl: mnophook, s2: ijlkm加prest, s3: efgh ijlk mnop sina, s4: abcd efgh ijlk mnop qrst},
為例進(jìn)行說(shuō)明,其中定義步長(zhǎng)為4字節(jié),參見(jiàn)圖7為未采用本發(fā)明實(shí)施例提供的技術(shù)方案的 多字節(jié)AC的有向圖示意圖,其中,圖中較細(xì)的直線代表Goto函數(shù),其上的字符串代表輸入 字符串,較粗的曲線為Failure函數(shù),很明顯存在很多條重復(fù)的Failure鏈;相應(yīng)地,參見(jiàn)圖8, 為未采用本發(fā)明實(shí)施例提供的技術(shù)方案的多字節(jié)AC的狀態(tài)轉(zhuǎn)移表示意圖;其中,圖示的存 儲(chǔ)結(jié)構(gòu)造成了 43%的不定長(zhǎng)Failure鏈,對(duì)處理效率影響極大。以圖7為例,詳細(xì)的說(shuō)明應(yīng)用本發(fā)明實(shí)施例提供的方法后是如何消除掉冗余的Failure鏈, 內(nèi)容如下
首先,創(chuàng)建狀態(tài)隊(duì)列S,該狀態(tài)隊(duì)列初始為空集合隊(duì)列;
然后,針對(duì)初始狀態(tài)q0,根據(jù)Goto函數(shù)以及字符串,生成非q0的q41、 q31、 q21和qll, 并將生成的q41、 q31、 q21和qll添加到狀態(tài)隊(duì)列S中;
其次,根據(jù)先在狀態(tài)隊(duì)列中先進(jìn)先出的原則,依次獲取狀態(tài)隊(duì)列S中的元素s,即在狀 態(tài)隊(duì)列S中存在的狀態(tài)節(jié)點(diǎn),并在獲取一個(gè)狀態(tài)節(jié)點(diǎn)的同時(shí),將其從狀態(tài)隊(duì)列S中刪除,例 如
獲取q41,刪除S中的q41,根據(jù)Goto函數(shù)和字段串,可以判斷得到G(q41, hook)=q42, 即對(duì)應(yīng)于該狀態(tài)q41當(dāng)輸入字符串字段為hook時(shí),輸出狀態(tài)節(jié)點(diǎn)存在,則設(shè)置^ (q41, hook) =G(q41, hook)=q42;新生成的狀態(tài)節(jié)點(diǎn)q42,匹配成功關(guān)鍵字Sl:mnop hook;對(duì)應(yīng)于該狀 態(tài)q41當(dāng)輸入字符串字段為其它時(shí),由于F(q41)iO,所以,不生成^函數(shù)的輸出表項(xiàng),結(jié)束。
獲取q31 ,刪除S中的q31 ,根據(jù)Goto函數(shù)和字段串,可以判斷得到G(q31 , mnop)=q32, 則設(shè)置^ (q31, mnop) =G(q31, mnop)=q32,添加q32到狀態(tài)隊(duì)列S中;對(duì)應(yīng)于該狀態(tài)q31 當(dāng)輸入字符串字段為其它時(shí),由于F(q31"q0,所以,不生成^函數(shù)的輸出表項(xiàng),結(jié)束。
同理可得,獲取q21,刪除S中的q21,生成^ (q21, ijkl) =G(q21, ijkl)=q22,添加 q22到狀態(tài)隊(duì)列S中;對(duì)應(yīng)于該狀態(tài)q21當(dāng)輸入字符串字段為其它時(shí),由于F(q21)=q0,所以, 不生成^函數(shù)的輸出表項(xiàng),結(jié)束。
同理,獲取qll,刪除S中的qll,生成^ (qll, efgh) =G(qll, efgh)=ql2,添加q12 到狀態(tài)隊(duì)列S中;對(duì)應(yīng)于該狀態(tài)qll當(dāng)輸入字符串字段為其它時(shí),由于F(qll^q0,所以,不 生成^函數(shù)的輸出表項(xiàng),結(jié)束。
獲取q32,刪除S中的q32,生成5 (q32, rest) =G(q32, rest)=q33,當(dāng)輸出狀態(tài)為q33 時(shí),匹配成功關(guān)鍵字S2:ijkl mnop rest;由于F(q31)=q41 ,而^ (q41, hook) =q42,所以,^ (q32, hook) =q42,匹配成功關(guān)鍵字Sl:mnop hook。 '
獲取q22,刪除S中的q22,生成《(q22, mnop) = G(q22, mnop) =q23,添加該q23 到狀態(tài)隊(duì)列S中。
獲取ql2,刪除S中的ql2,生成^ (ql2, ijkl) =G(ql2, ijkl)=ql3,添加該q13到狀 態(tài)隊(duì)列S中;
獲取q23,刪除S中的q23,生成^ (q23, sina) =G(q23, sina):q24,匹配成功關(guān)鍵字 s3: efgh ijlk mnop sina; F(q23)=q32, 所以5 (q23, rest) =J (q32, rest) =q33,匹配成功關(guān)鍵字s2: :ijklmnoprest;由因?yàn)镕(q32)=q41,所以所以^ (q23, hook) (q41, hook) =q42,匹配成功關(guān)鍵字Sl:mn叩hook。
獲取ql3,刪除S中的ql3,生成5 (ql3, mnop) =G(ql3, mnop)=ql4,添加q14到狀 態(tài)隊(duì)列S中;
獲取ql4,刪除隊(duì)列S中的q14,生成^ (ql4, qrst) =G (ql4, qrst) =ql5,匹配成功 關(guān)鍵字s4: abcdefghijlkmnopqrst。由于F(ql4)=q23, 所以^(ql4, sina)=^ (f(ql4), sina) =5 (q23, sina) =q24,匹配成功關(guān)鍵字s3: efghijlkmnop sina;
又由于F(q23一q32,所以3 (ql4, rest) (f(ql4), rest)=< (f(q23), rest) =^ (q32, rest) =q33,匹配成功關(guān)鍵字s2: :ijkl mnop rest;又因?yàn)镕(q32)=q41 ,所以^ (ql4, hook) =5 (f(ql4), hook) =5 (f(q23), hook)=《(f(q32), hook)=《(q41, hook) =q42,匹 配成功關(guān)鍵字Sl:mnophook。
綜上,成功獲取到^函數(shù)的輸出表項(xiàng),參見(jiàn)圖9,為采用本發(fā)明實(shí)施例提供的技術(shù)方案 去除Failure鏈的有向示意圖,參見(jiàn)圖0,為采用本發(fā)明實(shí)施例提供的技術(shù)方案去除Failure 鏈的狀態(tài)轉(zhuǎn)移表示意圖。
綜上,本發(fā)明實(shí)施例提供的建立模式匹配狀態(tài)機(jī)的方法,可以去除多字節(jié)AC算法中的 Failure鏈,優(yōu)化了存儲(chǔ)節(jié)約了存儲(chǔ)資源,并且提高了處理效率。通過(guò)在多字節(jié)的AC算法消 除其原有的Failure鏈,連同原有的Goto函數(shù)一同轉(zhuǎn)換成一種統(tǒng)一的^轉(zhuǎn)移函數(shù),在對(duì)失效 鏈進(jìn)行轉(zhuǎn)換的過(guò)程中對(duì)于會(huì)Failure到初始狀態(tài)的表項(xiàng)不生成,從而不會(huì)導(dǎo)致大規(guī)模的存儲(chǔ)空 間的增長(zhǎng);節(jié)約了存儲(chǔ)空間,同時(shí)優(yōu)化了 AC算法的存儲(chǔ)結(jié)構(gòu),簡(jiǎn)單并固化了AC算法的處 理歩驟,從而最終提高了 AC算法的處理速度。
實(shí)施例2
參見(jiàn)圖ll,本發(fā)明實(shí)施例提供了一種建立模式匹配狀態(tài)機(jī)的裝置,裝置包括 獲取模塊,用于根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到 的子關(guān)鍵字字段;
Goto函數(shù)生成模塊,用于根據(jù)獲取模塊獲取的子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù); Failure函數(shù)生成模塊,用于根據(jù)Goto函數(shù)生成模塊生成的Goto函數(shù),生成各狀態(tài)節(jié)點(diǎn) 的失效Failure函數(shù);
^函數(shù)生成模塊,用于根據(jù)Goto函數(shù)生成模塊生成的Goto函數(shù)和Failure函數(shù)生成模塊 生成的Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。其中,獲取模塊具體包括
劃分單元,用于按預(yù)設(shè)字節(jié)為單位,對(duì)預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字進(jìn)行劃分, 第一獲取單元,用于根據(jù)劃分單元的劃分得到子關(guān)鍵字字段,
第二獲取單元,用于當(dāng)劃分單元的劃分關(guān)鍵字時(shí),如果不滿足預(yù)設(shè)字節(jié)長(zhǎng)度,獲取由不 滿足預(yù)設(shè)字節(jié)長(zhǎng)度的字符構(gòu)成子關(guān)鍵字字段。
其中,^函數(shù)生成模塊具體包括 '
創(chuàng)建單元,用于創(chuàng)建狀態(tài)隊(duì)列S,狀態(tài)隊(duì)列初始為空;從起始狀態(tài)節(jié)點(diǎn)qO開(kāi)始,根據(jù)q0 的Goto函數(shù)和子關(guān)鍵字字段,判斷字段串字段對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在; 當(dāng)輸出狀態(tài)節(jié)點(diǎn)存在時(shí),設(shè)置字段串字段對(duì)應(yīng)Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)為字段串字段對(duì)應(yīng)^ 函數(shù)的輸出狀態(tài)節(jié)點(diǎn);并將輸出狀態(tài)節(jié)點(diǎn)依次添加到狀態(tài)隊(duì)列中;
獲取單元,用于根據(jù)預(yù)設(shè)規(guī)則,依次獲取狀態(tài)隊(duì)列中的每一狀態(tài)節(jié)點(diǎn),當(dāng)獲取一個(gè)狀態(tài) 節(jié)點(diǎn)時(shí),從狀態(tài)隊(duì)列中刪除獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)獲取的狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,生成 狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的5函數(shù)的輸出,并將非空的輸出狀態(tài)節(jié)點(diǎn)依次添加到狀態(tài)隊(duì)列S中直到狀態(tài) 隊(duì)列為空。其中,該預(yù)設(shè)規(guī)則具體可以為在狀態(tài)隊(duì)列S中的狀態(tài)節(jié)點(diǎn)先進(jìn)先出的規(guī)則。
其中,獲取單元具體包括
獲取及刪除子單元,用于獲取狀態(tài)隊(duì)列S中的一個(gè)狀態(tài)節(jié)點(diǎn),并刪除狀態(tài)隊(duì)列中的獲取 的狀態(tài)節(jié)點(diǎn);
第一判斷子單元,用于根據(jù)獲取的狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,判斷子關(guān)鍵字字段和狀態(tài) 節(jié)點(diǎn)對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在;
第一處理子單元,用于當(dāng)?shù)谝慌袛嘧訂卧袛嗟慕Y(jié)果為否時(shí),則判斷狀態(tài)節(jié)點(diǎn)的Failure 函數(shù)輸出是否為初始狀態(tài)節(jié)點(diǎn)q0,如果是,則不建立狀態(tài)節(jié)點(diǎn)的^函數(shù)表項(xiàng),結(jié)束;否則, 根據(jù)狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段,獲取^函數(shù)的輸出;
第二處理子單元,用于第一判斷子單元判斷的結(jié)果為是時(shí),將Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn) 設(shè)置為狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出狀態(tài)節(jié)點(diǎn),并將輸出狀態(tài)節(jié)點(diǎn)添加到狀態(tài)隊(duì)列。
進(jìn)一步地,裝置還包括
設(shè)置模塊,用于如果獲取不到以輸入狀態(tài)節(jié)點(diǎn)和輸入子關(guān)鍵字字段為索引的表項(xiàng),則設(shè) 置初始狀態(tài)節(jié)點(diǎn)q0為狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出。
本發(fā)明實(shí)施例提供的建立模式匹配狀態(tài)機(jī)的裝置,可以去除多字節(jié)AC算法中的Failure 鏈,優(yōu)化了存儲(chǔ)節(jié)約了存儲(chǔ)資源,并且提高了處理效率。通過(guò)在多字節(jié)的AC算法消除其原 有的Failure鏈,連同原有的Goto函數(shù)一同轉(zhuǎn)換成一種統(tǒng)一的^轉(zhuǎn)移函數(shù),在對(duì)失效鏈進(jìn)行轉(zhuǎn)換的過(guò)程中對(duì)于會(huì)Failure到初始狀態(tài)的表項(xiàng)不生成,從而不會(huì)導(dǎo)致大規(guī)模的存儲(chǔ)空間的增 長(zhǎng),節(jié)約了存儲(chǔ)空間,同時(shí)優(yōu)化了 AC算法的存儲(chǔ)結(jié)構(gòu),簡(jiǎn)單并固化了 AC算法的處理步驟, 從而最終提高了 AC算法的處理速度。 實(shí)施例3
參見(jiàn)圖12,本發(fā)明實(shí)施例提供了一種模式識(shí)別的裝置,所述裝置包括
模式匹配狀態(tài)機(jī)建立模塊,用于根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,. 獲取劃分后得到的子關(guān)鍵字字段;根據(jù)子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)Goto 函數(shù),生成各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)Goto函數(shù)和Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn) 的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。
處理模塊,用于根據(jù)模式匹配狀態(tài)機(jī)建立模塊建立的^函數(shù),根據(jù)^函數(shù)執(zhí)行子關(guān)鍵字 段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以狀態(tài)節(jié)點(diǎn)和子關(guān)鍵字字段為索引的 ^函數(shù)的表項(xiàng),則設(shè)置初始狀態(tài)節(jié)點(diǎn)qO為輸入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸入狀態(tài),根據(jù)新的輸入 狀態(tài)和子關(guān)鍵字字段執(zhí)行^函數(shù);如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú)法獲取到子關(guān)鍵字字段的匹配, 則設(shè)置qO為輸出狀態(tài)。
本發(fā)明實(shí)施例提供的模式識(shí)別的裝置,可以去除多字節(jié)AC算法中的Failure鏈,優(yōu)化了 存儲(chǔ)節(jié)約了存儲(chǔ)資源,并且提高了處理效率。通過(guò)在多字節(jié)的AC算法消除其原有的Failurd 鏈,連同原有的Goto函數(shù)一同轉(zhuǎn)換成一種統(tǒng)一的5轉(zhuǎn)移函數(shù),在對(duì)失效鏈進(jìn)行轉(zhuǎn)換的過(guò)程中 對(duì)于會(huì)Failure到初始狀態(tài)的表項(xiàng)不生成,從而不會(huì)導(dǎo)致大規(guī)模的存儲(chǔ)空間的增長(zhǎng),節(jié)約了存 儲(chǔ)空間,同時(shí)優(yōu)化了 AC算法的存儲(chǔ)結(jié)構(gòu),簡(jiǎn)單并固化了 AC算法的處理步驟,從而最終提 高了 AC算法的處理速度。
通過(guò)本發(fā)明實(shí)施例所提供的技術(shù)方案,可以在通信等領(lǐng)域進(jìn)行廣泛,如可用于移動(dòng)網(wǎng)的 內(nèi)容計(jì)費(fèi),也可應(yīng)用于固定網(wǎng)的按業(yè)務(wù)QoS分配中等等。
本發(fā)明實(shí)施例中的部分步驟,可以利用軟件實(shí)現(xiàn),相應(yīng)的軟件程序可以存儲(chǔ)在可讀取的 存儲(chǔ)介質(zhì)中,如光盤(pán)或硬盤(pán)等。
以上所述僅為本發(fā)明的具體實(shí)施例,并不用以限制本發(fā)明,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù) 人員來(lái)說(shuō),凡在不脫離本發(fā)明原理的前提下,所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包 含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述方法包括根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段;根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)所述Goto函數(shù),生成所述各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)所述Goto函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移δ函數(shù)。
2. 如權(quán)利要求1所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述根據(jù)預(yù)設(shè)規(guī)則, 劃分預(yù)定乂的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段,具體為按預(yù)設(shè)字節(jié)為單位,對(duì)所述預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字進(jìn)行劃分,得到子關(guān)鍵字字 段,其中,對(duì)所述關(guān)鍵字劃分時(shí),如果不滿足所述預(yù)設(shè)字節(jié)的長(zhǎng)度,所述不滿足所述預(yù)設(shè)字 節(jié)長(zhǎng)度的字符構(gòu)成子關(guān)鍵字字段。
3. 如權(quán)利要求1所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述根據(jù)所述Goto 函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù),具體為依次獲取狀態(tài)隊(duì)列S中的每一個(gè)狀態(tài)節(jié)點(diǎn),當(dāng)獲取每一個(gè)狀態(tài)節(jié)點(diǎn)時(shí),從所述狀態(tài)隊(duì)列 S中刪除所述獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)所述獲取的狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,生成所述 狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)的輸出。
4. 如權(quán)利要求3所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述根據(jù)所述Goto 函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù),具體為創(chuàng)建狀態(tài)隊(duì)列S,所述狀態(tài)隊(duì)列初始為空;從起始狀態(tài)節(jié)點(diǎn)q0開(kāi)始,根據(jù)所述qO的Goto函數(shù)和所述子關(guān)鍵字字段,判斷所述子關(guān) 鍵字字段對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在;當(dāng)所述輸出狀態(tài)節(jié)點(diǎn)存在時(shí),設(shè)置所述 子關(guān)鍵字字段對(duì)應(yīng)Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)為所述子關(guān)鍵字字段對(duì)應(yīng)^函數(shù)的輸出狀態(tài)節(jié) 點(diǎn);并將所述非q0的輸出狀態(tài)節(jié)點(diǎn)依次添加到所述狀態(tài)隊(duì)列S中;按照預(yù)設(shè)規(guī)則,依次獲取所述狀態(tài)隊(duì)列中的每一個(gè)狀態(tài)節(jié)點(diǎn),當(dāng)獲取一個(gè)狀態(tài)節(jié)點(diǎn)時(shí), 從所述狀態(tài)隊(duì)列中刪除所述獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)所述獲取的狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字 段,生成所述狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的^函數(shù)的輸出,并將所述非空的輸出狀態(tài)節(jié)點(diǎn)依次添加到所述 狀態(tài)隊(duì)列S中;直到所述狀態(tài)隊(duì)列為空。
5. 如權(quán)利要求4所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述根據(jù)所述獲取的狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,生成所述狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的^函數(shù),具體為根據(jù)獲取的所述狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,判斷所述子關(guān)鍵字字段和所述狀態(tài)節(jié)點(diǎn) 對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在;如果所述Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)不存在,則判斷所述狀態(tài)節(jié)點(diǎn)的Failure函數(shù)輸出是 否為初始狀態(tài)節(jié)點(diǎn)q0,如果是,則不建立所述狀態(tài)節(jié)點(diǎn)的^函數(shù)輸出表項(xiàng),結(jié)束;否則,根 據(jù)所述狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,獲取所述狀態(tài)節(jié)點(diǎn)的^ 函數(shù)的輸出;如果所述Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)存在,將所述Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)設(shè)置為所述 狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出,并將所述^函數(shù)的輸出狀態(tài)節(jié)點(diǎn)添加到所述狀態(tài)隊(duì)列。
6. 如權(quán)利要求5所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述根據(jù)所述輸出狀 態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,獲取所述^函數(shù)的輸出,具體為將所述狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段做為^函數(shù)的輸入, 生成所述Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出,其中,當(dāng)所述^函數(shù)的輸出不存在, 則不建立所述狀態(tài)節(jié)點(diǎn)的^函數(shù)輸出表項(xiàng),結(jié)束。
7. 如權(quán)要要求3所述的建立模式匹配狀態(tài)機(jī)的方法,其特征在于,所述預(yù)設(shè)規(guī)則具體為 按照所述狀態(tài)隊(duì)列S中的狀態(tài)節(jié)點(diǎn)先進(jìn)先出的規(guī)則。
8. —種模式識(shí)別的方法,其特征在于,所述方法包括根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段; 根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)所述Goto函數(shù),生成所述各 狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)所述Goto函數(shù)和所述Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。 根據(jù)所述^函數(shù)執(zhí)行子關(guān)鍵字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以 狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段為索引的^函數(shù)的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)q0為所述輸 入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸入狀態(tài),根據(jù)所述新的輸入狀態(tài)和所述子關(guān)鍵字字段執(zhí)行^函數(shù); 如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú)法獲取到所述子關(guān)鍵字字段的匹配,則設(shè)置所述q0為輸出狀態(tài)。
9. 一種建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,所述裝置包括獲取模塊,用于根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到 的子關(guān)鍵字字段;Goto函數(shù)生成模塊,用于根據(jù)所述獲取模塊獲取的子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto 函數(shù);Failure函數(shù)生成模塊,用于根據(jù)所述Goto函數(shù)生成模塊生成的Goto函數(shù),生成所述各 狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);^函數(shù)生成模塊,用于根據(jù)所述Goto函數(shù)生成模塊生成的Goto函數(shù)和所述Failure函數(shù) 生成模塊生成的Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移S函數(shù)。
10. 如權(quán)利要求9所述的建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,所述獲取模塊具體 包括劃分單元,用于按預(yù)設(shè)字節(jié)為單位,對(duì)所述預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字進(jìn)行劃分,, 第一獲取單元,用于根據(jù)所述劃分單元的劃分得到子關(guān)鍵字字段,第二獲取單元,用于當(dāng)所述劃分單元的劃分所述關(guān)鍵字時(shí),如果不滿足所述預(yù)設(shè)字節(jié)長(zhǎng) 度,獲取由所述不滿足所述預(yù)設(shè)字節(jié)長(zhǎng)度的字符構(gòu)成子關(guān)鍵字字段。
11. 沖權(quán)利要求9所述的建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,所述^函數(shù)生成模 塊具體包括創(chuàng)建單元,用于創(chuàng)建狀態(tài)隊(duì)列S,所述狀態(tài)隊(duì)列初始為空;從起始狀態(tài)節(jié)點(diǎn)q0開(kāi)始,根 據(jù)所述q0的Goto函數(shù)和所述子關(guān)鍵字字段,判斷所述字段串字段對(duì)應(yīng)的Goto函數(shù)的輸出狀 態(tài)節(jié)點(diǎn)是否存在;當(dāng)所述輸出狀態(tài)節(jié)點(diǎn)存在時(shí),設(shè)置所述字段串字段對(duì)應(yīng)Goto函數(shù)的輸出狀 態(tài)節(jié)點(diǎn)為所述字段串字段對(duì)應(yīng)S函數(shù)的輸出狀態(tài)節(jié)點(diǎn);并將所述非q0輸出狀態(tài)節(jié)點(diǎn)依次添加 到所述狀態(tài)隊(duì)列中; '獲取單元,用于根據(jù)預(yù)設(shè)規(guī)則,依次獲取所述狀態(tài)隊(duì)列中的每一狀態(tài)節(jié)點(diǎn),當(dāng)獲取一個(gè) 狀態(tài)節(jié)點(diǎn)時(shí),從所述狀態(tài)隊(duì)列中刪除所述獲取的狀態(tài)節(jié)點(diǎn),并根據(jù)所述獲取的狀態(tài)節(jié)點(diǎn)和所 述子關(guān)鍵字字段,生成所述狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的^函數(shù)的輸出,并將所述非空的輸出狀態(tài)節(jié)點(diǎn)依 次添加到所述狀態(tài)隊(duì)列S中直到所述狀態(tài)隊(duì)列為空。
12. 如權(quán)利要求11所述的建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,所述獲取單元具體 包括獲取及刪除子單元,用于獲取所述狀態(tài)隊(duì)列S中的一個(gè)狀態(tài)節(jié)點(diǎn),并刪除所述狀態(tài)隊(duì)列 中的所述獲取的狀態(tài)節(jié)點(diǎn);第一判斷子單元,用于根據(jù)獲取的所述狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,判斷所述子關(guān)鍵 字字段和所述狀態(tài)節(jié)點(diǎn)對(duì)應(yīng)的Goto函數(shù)的輸出狀態(tài)節(jié)點(diǎn)是否存在;第一處理子單元,用于當(dāng)所述第一判斷子單元判斷的結(jié)果為否時(shí),則判斷所述狀態(tài)節(jié)點(diǎn) 的Failure函數(shù)輸出是否為初始狀態(tài)節(jié)點(diǎn)q0,如果是,則不建立所述狀態(tài)節(jié)點(diǎn)的^函數(shù)表項(xiàng), 結(jié)束;否則,根據(jù)所述狀態(tài)節(jié)點(diǎn)的Failure函數(shù)的輸出狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字字段,獲取所述^函數(shù)的輸出;第二處理子單元,用于所述第一判斷子單元判斷的結(jié)果為是時(shí),將所述Goto函數(shù)的輸出 狀態(tài)節(jié)點(diǎn)設(shè)置為所述狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出狀態(tài)節(jié)點(diǎn),并將所述輸出狀態(tài)節(jié)點(diǎn)添加到所述 狀態(tài)隊(duì)列。
13. 如權(quán)利要求9所述的建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,所述裝置還包括 設(shè)置模塊,用于如果獲取不到以輸入狀態(tài)節(jié)點(diǎn)和輸入子關(guān)鍵字字段為索引的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)q0為所述狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸出。
14. 一種模式識(shí)別的裝置,其特征在于,所述裝置包括模式匹配狀態(tài)機(jī)建立模塊,用于根據(jù)預(yù)設(shè)規(guī)則,劃分預(yù)定義的關(guān)鍵字集合中的關(guān)鍵字,獲取劃分后得到的子關(guān)鍵字字段;根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù) 所述Goto函數(shù),生成所述各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)所述Goto函數(shù)和所述Failure 函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移^函數(shù)。處理模塊,用于根據(jù)所述模式匹配狀態(tài)機(jī)建立模塊建立的^函數(shù),根據(jù)所述^函數(shù)執(zhí)行 子關(guān)鍵字段的模式匹配,如果在非初始狀態(tài)節(jié)點(diǎn)q0下無(wú)法獲取到以狀態(tài)節(jié)點(diǎn)和所述子關(guān)鍵字 字段為索引的^函數(shù)的表項(xiàng),則設(shè)置所述初始狀態(tài)節(jié)點(diǎn)q0為所述輸入狀態(tài)節(jié)點(diǎn)的^函數(shù)的輸 入狀態(tài),根據(jù)所述新的輸入狀態(tài)和所述子關(guān)鍵字字段執(zhí)行^函數(shù);如果在初始狀態(tài)節(jié)點(diǎn)q0無(wú) 法獲取到所述子關(guān)鍵字字段的匹配,則設(shè)置所述q0為輸出狀態(tài)。
全文摘要
本發(fā)明公開(kāi)了一種建立模式匹配狀態(tài)機(jī)、模式識(shí)別的方法和裝置,屬于模式匹配技術(shù)領(lǐng)域。使用的方法包括獲取劃分后得到的子關(guān)鍵字字段;根據(jù)所述子關(guān)鍵字字段,生成狀態(tài)轉(zhuǎn)移Goto函數(shù);并根據(jù)Goto函數(shù),生成所述各狀態(tài)節(jié)點(diǎn)的失效Failure函數(shù);根據(jù)Goto函數(shù)和Failure函數(shù),生成各狀態(tài)節(jié)點(diǎn)的下一跳狀態(tài)轉(zhuǎn)移δ函數(shù),根據(jù)生成的δ函數(shù)進(jìn)行模式狀態(tài)的匹配。所述建立裝置包括獲取模塊,Goto函數(shù)生成模塊,F(xiàn)ailure函數(shù)生成模塊,δ函數(shù)生成模塊。通過(guò)在多字節(jié)AC算法消除其原有Failure鏈,連同原有Goto函數(shù)一同轉(zhuǎn)換成統(tǒng)一的δ轉(zhuǎn)移函數(shù),且在對(duì)失效鏈進(jìn)行轉(zhuǎn)換的過(guò)程中對(duì)于會(huì)Failure到初始狀態(tài)的表項(xiàng)不生成,從而避免了大規(guī)模的存儲(chǔ)空間的增長(zhǎng),優(yōu)化了AC算法的存儲(chǔ)結(jié)構(gòu),提高了AC算法的處理速度。
文檔編號(hào)G06F17/30GK101551803SQ20081010306
公開(kāi)日2009年10月7日 申請(qǐng)日期2008年3月31日 優(yōu)先權(quán)日2008年3月31日
發(fā)明者洪 周, 胡新宇, 建 陳 申請(qǐng)人:華為技術(shù)有限公司