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