引言
目前,大多數(shù)自由文本搜索技術(shù)采用類似于Lucene的策略,通過解析搜索文本為各個組成部分來定位關(guān)鍵詞。這種方法在處理少量關(guān)鍵詞時表現(xiàn)良好。但當(dāng)搜索的關(guān)鍵詞數(shù)量達(dá)到10萬個或更多時,這種方法的效率會顯著下降,尤其是在需要與詞典進(jìn)行詳盡對比的場景中。本文將介紹的Aho-Corasick(AC)自動機(jī)作為多模式匹配中的經(jīng)典算法,不僅能夠處理大規(guī)模文本數(shù)據(jù),還能確保搜索過程的實(shí)時性和準(zhǔn)確性。
AC自動機(jī):文本搜索的革命性工具
AC自動機(jī)可以被形象地比喻為一個超級找詞機(jī)器。想象你手頭有一本內(nèi)容繁多的書籍和一份包含多個詞語的列表,你的任務(wù)是快速找出所有這些詞語在書中出現(xiàn)的位置。如果采用傳統(tǒng)方法,即逐個詞進(jìn)行查找,工作量將會非常巨大。而AC自動機(jī)通過構(gòu)建一種特殊的樹狀結(jié)構(gòu)——前綴樹或Trie,來極大地提升搜索效率。
AC自動機(jī)構(gòu)建與搜索機(jī)制
構(gòu)建前綴樹(Trie)
AC自動機(jī)首先會根據(jù)所有關(guān)鍵詞構(gòu)建一個前綴樹。這種樹狀結(jié)構(gòu)的每個節(jié)點(diǎn)代表一個字母,并且每個字母都指向下一個可能的字母,從而形成一個連續(xù)的路徑,表示一個或多個關(guān)鍵詞的前綴
圖片來源網(wǎng)絡(luò)
失配指針(Fail指針)
在搜索過程中,如果當(dāng)前路徑上無法找到匹配的關(guān)鍵詞,AC自動機(jī)會利用失配指針進(jìn)行快速回溯。這些指針預(yù)先設(shè)置在樹的每個節(jié)點(diǎn)上,指向其他可能的匹配路徑,從而避免了從頭開始搜索的低效性
圖片來源網(wǎng)絡(luò)
實(shí)時搜索與高效報告
AC自動機(jī)在讀取文本的同時,能夠快速地遍歷前綴樹結(jié)構(gòu)。一旦發(fā)現(xiàn)關(guān)鍵詞出現(xiàn)在文本中,它能夠立即報告這個詞及其出現(xiàn)的位置。這種能力使得AC自動機(jī)能夠一次性高效完成大量關(guān)鍵詞的搜索任務(wù)
圖片來源網(wǎng)絡(luò)
算法核心組件與復(fù)雜度
核心組件:
?goto(轉(zhuǎn)跳):每個遇到的字符都會被提交給goto結(jié)構(gòu)中的狀態(tài)對象,以確定新的當(dāng)前狀態(tài)
?fail(失敗轉(zhuǎn)移):如果沒有找到匹配狀態(tài),算法會觸發(fā)fail并回溯至深度更淺的狀態(tài),從那里繼續(xù)搜索
?output(輸出):每當(dāng)達(dá)到與整個關(guān)鍵詞相匹配的狀態(tài)時,該狀態(tài)會被發(fā)送到輸出集合中,完成掃描后即可讀取這些匹配項
時間復(fù)雜度:
Aho-Corasick算法的時間復(fù)雜度為O(n),其中n是文本的長度。這意味著無論提供多少關(guān)鍵詞,搜索的性能都將呈線性下降,與關(guān)鍵詞的數(shù)量無關(guān)。
AC自動機(jī)的應(yīng)用
AC自動機(jī)在多種場景下都能發(fā)揮重要作用,包括:
?在文本中查找并鏈接或突出顯示關(guān)鍵詞,提高信息的可檢索性
?為純文本添加語義,使文本內(nèi)容更加豐富和有層次
?檢查文本中的語法錯誤,通過與詞典的對比來識別和糾正錯誤
應(yīng)用案例:使用Aho-Corasick算法來識別和高亮HTML文本中的關(guān)鍵詞
本Java程序?qū)⒀菔救绾问褂肁ho-Corasick自動機(jī)庫來搜索和高亮HTML文本中的關(guān)鍵詞。程序首先構(gòu)建一個自動狀態(tài)機(jī),該狀態(tài)機(jī)被訓(xùn)練識別一系列中文關(guān)鍵詞。然后,程序?qū)⑻幚鞨TML文檔,查找這些關(guān)鍵詞的出現(xiàn),并用標(biāo)簽將它們包裹起來,以實(shí)現(xiàn)加粗顯示的效果。
第一步:Maven依賴配置,引入Aho-Corasick自動機(jī)庫
org.ahocorasick ahocorasick 0.6.3
第二步:代碼實(shí)現(xiàn)
public class HighlightKeywordsInHtml { public static void main(String[] args) { // 定義HTML內(nèi)容的字符串,包含了南京大學(xué)的介紹 String htmlContent = createHtmlContentForNanjingUniversity(); // 創(chuàng)建Aho-Corasick Trie的構(gòu)建器實(shí)例 Trie trie = buildAhoCorasickTrie(); // 使用Trie實(shí)例處理HTML文本,獲取匹配的Token集合 Collection tokens = trie.tokenize(htmlContent); // 使用StringBuilder構(gòu)建最終的HTML字符串,用于輸出高亮的關(guān)鍵詞 StringBuilder html = new StringBuilder(); html.append(""); // 遍歷Token集合 for (Token token : tokens) { // 如果Token匹配關(guān)鍵詞,則添加標(biāo)簽以實(shí)現(xiàn)加粗效果 if (token.isMatch()) { html.append(""); } // 添加Token對應(yīng)的文本片段 html.append(token.getFragment()); // 如果Token匹配關(guān)鍵詞,結(jié)束標(biāo)簽 if (token.isMatch()) { html.append(""); } } // 完成HTML字符串的構(gòu)建 html.append(""); // 打印最終的HTML字符串,其中包含高亮顯示的關(guān)鍵詞 System.out.println(html); } private static String createHtmlContentForNanjingUniversity() { // 此處添加創(chuàng)建南京大學(xué)HTML內(nèi)容的方法實(shí)現(xiàn) String speech = """ 南京大學(xué)簡介 body { font-family: "微軟雅黑", "宋體", Arial, sans-serif; line-height: 1.6; color: #333; } .university-intro { text-align: justify; margin-bottom: 2em; padding: 1rem; background-color: #f5f5f5; border-radius: 5px; } 南京大學(xué):百年名校,學(xué)術(shù)卓越 南京大學(xué),簡稱“南大”,位于中國江蘇省南京市,是中國最頂尖的高等學(xué)府之一,擁有百年的辦學(xué)歷史和深厚的文化底蘊(yùn)。作為中國教育部直屬的全國重點(diǎn)大學(xué),南大以其卓越的學(xué)術(shù)成就和教育質(zhì)量聞名于世。 南京大學(xué)以其強(qiáng)大的師資力量和學(xué)術(shù)研究而著稱,提供多元化的學(xué)科教育,包括自然科學(xué)、人文社會科學(xué)、工程技術(shù)等多個領(lǐng)域。學(xué)校注重培養(yǎng)學(xué)生的創(chuàng)新能力和國際視野,為國家和社會培養(yǎng)了大量杰出人才。 南大校園環(huán)境優(yōu)美,歷史與現(xiàn)代交融,是學(xué)術(shù)研究和知識探索的理想場所。學(xué)校在計算機(jī)科學(xué)、地球科學(xué)、化學(xué)等學(xué)科領(lǐng)域具有國際領(lǐng)先水平,并在推動科學(xué)技術(shù)進(jìn)步和文化傳承方面發(fā)揮著重要作用。 """; return speech; } private static Trie buildAhoCorasickTrie() { return Trie.builder() .ignoreOverlaps() // 設(shè)置不捕獲重疊的關(guān)鍵詞 .onlyWholeWords() // 僅匹配完整的單詞 .ignoreCase() // 忽略關(guān)鍵詞的大小寫 .addKeywords(Arrays.asList("南京大學(xué)", "南大", "地球科學(xué)")) .build(); // 構(gòu)建Trie實(shí)例 } }
第三步:運(yùn)行程序,符合預(yù)期
南京大學(xué)簡介 body { font-family: "微軟雅黑", "宋體", Arial, sans-serif; line-height: 1.6; color: #333; } .university-intro { text-align: justify; margin-bottom: 2em; padding: 1rem; background-color: #f5f5f5; border-radius: 5px; } 南京大學(xué):百年名校,學(xué)術(shù)卓越 南京大學(xué),簡稱“南大”,位于中國江蘇省南京市,是中國最頂尖的高等學(xué)府之一,擁有百年的辦學(xué)歷史和深厚的文化底蘊(yùn)。作為中國教育部直屬的全國重點(diǎn)大學(xué),南大以其卓越的學(xué)術(shù)成就和教育質(zhì)量聞名于世。 南京大學(xué)以其強(qiáng)大的師資力量和學(xué)術(shù)研究而著稱,提供多元化的學(xué)科教育,包括自然科學(xué)、人文社會科學(xué)、工程技術(shù)等多個領(lǐng)域。學(xué)校注重培養(yǎng)學(xué)生的創(chuàng)新能力和國際視野,為國家和社會培養(yǎng)了大量杰出人才。 南大校園環(huán)境優(yōu)美,歷史與現(xiàn)代交融,是學(xué)術(shù)研究和知識探索的理想場所。學(xué)校在計算機(jī)科學(xué)、地球科學(xué)、化學(xué)等學(xué)科領(lǐng)域具有國際領(lǐng)先水平,并在推動科學(xué)技術(shù)進(jìn)步和文化傳承方面發(fā)揮著重要作用。
本文對Aho-Corasick(AC)自動機(jī)算法進(jìn)行了拋磚引玉,揭示了其在處理大規(guī)模文本數(shù)據(jù)方面的卓越性能和應(yīng)用潛力。若你渴望深入挖掘AC算法的精髓,進(jìn)一步探索其高級應(yīng)用和實(shí)現(xiàn)細(xì)節(jié),建議參考以下的參考資料進(jìn)行進(jìn)一步的學(xué)習(xí)與挖掘。
參考資料
1. http://cr.yp.to/bib/1975/aho.pdf?
2. https://github.com/robert-bor/aho-corasick
審核編輯 黃宇
-
算法
+關(guān)注
關(guān)注
23文章
4666瀏覽量
94174 -
自動機(jī)
+關(guān)注
關(guān)注
1文章
28瀏覽量
9420
發(fā)布評論請先 登錄
相關(guān)推薦
[討論]提高網(wǎng)站關(guān)鍵詞排名的28個SEO小技巧
亞馬遜代運(yùn)營 amazon Search term 關(guān)鍵詞填寫的“神技”
HanLP關(guān)鍵詞提取算法分析詳解
關(guān)鍵詞優(yōu)化有哪些實(shí)用的方法
#2023,你的 FPGA 年度關(guān)鍵詞是什么? #
2010年10大流行搜索關(guān)鍵詞 Facebook居首
[自動機(jī)與自動線].李紹炎.掃描版
自動機(jī)械設(shè)計
基于盲GDH簽名的無記憶模糊關(guān)鍵詞搜索
基于自動關(guān)鍵詞抽取方法

對加密電子醫(yī)療記錄的關(guān)鍵詞的搜索
基于統(tǒng)計的AC自動機(jī)空間優(yōu)化

一種改變標(biāo)準(zhǔn)的谷歌關(guān)鍵詞搜索的新方式

自動機(jī)終結(jié)字查找算法實(shí)現(xiàn)優(yōu)化綜述

評論