您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“java的Hutool-dfa怎么使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
這個模塊注意針對于關(guān)鍵詞查找的功能
在我最早入職的一家公司,主要負責(zé)內(nèi)容方面的業(yè)務(wù),對我來說大部分的工作是對內(nèi)容的清洗和規(guī)整。當(dāng)然,清洗過程免不了的就是按照關(guān)鍵詞過濾,你懂的。需求如下:
后臺人員添加N個關(guān)鍵字,然后對主站所有的內(nèi)容進行清洗,含有這些關(guān)鍵字的所有內(nèi)容都置為無效。
拿到此需求,我最早的方案比較粗暴:針對關(guān)鍵字建立一個HashSet,然后遍歷整個數(shù)據(jù)庫,針對每篇文章遍歷這個Set,查找是否contains關(guān)鍵字……好吧我承認(rèn)這不是一個好方法,隨著關(guān)鍵字的增多和數(shù)據(jù)的增多,這個過程消耗的時間成指數(shù)型增長!
于是我找到度娘,發(fā)現(xiàn)一個算法:DFA。
DFA全稱為:Deterministic Finite Automaton,即確定有窮自動機。因為本人算法學(xué)的不好,有興趣的可以看這篇博客: 基于DFA敏感詞查詢的算法簡析
解釋起來原理其實也不難,就是用所有關(guān)鍵字構(gòu)造一棵樹,然后用正文遍歷這棵樹,遍歷到葉子節(jié)點即表示文章中存在這個關(guān)鍵字。
我們暫且忽略構(gòu)建關(guān)鍵詞樹的時間,每次查找正文只需要O(n)復(fù)雜度就可以搞定。
針對DFA算法以及網(wǎng)上的一些實現(xiàn),Hutool做了整理和改進,最終形成現(xiàn)在的Hutool-dfa模塊。
WordTree tree = new WordTree(); tree.addWord("大"); tree.addWord("大土豆"); tree.addWord("土豆"); tree.addWord("剛出鍋"); tree.addWord("出鍋");
//正文 String text = "我有一顆大土豆,剛出鍋的";
情況一:標(biāo)準(zhǔn)匹配,匹配到最短關(guān)鍵詞,并跳過已經(jīng)匹配的關(guān)鍵詞
// 匹配到【大】,就不再繼續(xù)匹配了,因此【大土豆】不匹配 // 匹配到【剛出鍋】,就跳過這三個字了,因此【出鍋】不匹配(由于剛首先被匹配,因此長的被匹配,最短匹配只針對第一個字相同選最短) List<String> matchAll = tree.matchAll(text, -1, false, false); Assert.assertEquals(matchAll.toString(), "[大, 土豆, 剛出鍋]");
2.情況二:匹配到最短關(guān)鍵詞,不跳過已經(jīng)匹配的關(guān)鍵詞
// 【大】被匹配,最短匹配原則【大土豆】被跳過,【土豆繼續(xù)被匹配】 // 【剛出鍋】被匹配,由于不跳過已經(jīng)匹配的詞,【出鍋】被匹配 matchAll = tree.matchAll(text, -1, true, false); Assert.assertEquals(matchAll.toString(), "[大, 土豆, 剛出鍋, 出鍋]");
情況三:匹配到最長關(guān)鍵詞,跳過已經(jīng)匹配的關(guān)鍵詞
// 匹配到【大】,由于到最長匹配,因此【大土豆】接著被匹配 // 由于【大土豆】被匹配,【土豆】被跳過,由于【剛出鍋】被匹配,【出鍋】被跳過 matchAll = tree.matchAll(text, -1, false, true); Assert.assertEquals(matchAll.toString(), "[大, 大土豆, 剛出鍋]");
4.情況四:匹配到最長關(guān)鍵詞,不跳過已經(jīng)匹配的關(guān)鍵詞(最全關(guān)鍵詞)
// 匹配到【大】,由于到最長匹配,因此【大土豆】接著被匹配,由于不跳過已經(jīng)匹配的關(guān)鍵詞,土豆繼續(xù)被匹配 // 【剛出鍋】被匹配,由于不跳過已經(jīng)匹配的詞,【出鍋】被匹配 matchAll = tree.matchAll(text, -1, true, true); Assert.assertEquals(matchAll.toString(), "[大, 大土豆, 土豆, 剛出鍋, 出鍋]");
除了matchAll
方法,WordTree
還提供了match
和isMatch
兩個方法,這兩個方法只會查找第一個匹配的結(jié)果,這樣一旦找到第一個關(guān)鍵字,就會停止繼續(xù)匹配,大大提高了匹配效率。
有時候,正文中的關(guān)鍵字常常包含特殊字符,比如:"〓關(guān)鍵☆字",針對這種情況,Hutool提供了StopChar
類,專門針對特殊字符做跳過處理,這個過程是在match
方法或matchAll
方法執(zhí)行的時候自動去掉特殊字符。
“java的Hutool-dfa怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。