中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java的Hutool-dfa怎么使用

發布時間:2021-12-31 13:47:46 來源:億速云 閱讀:298 作者:iii 欄目:大數據

本篇內容介紹了“java的Hutool-dfa怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

這個模塊注意針對于關鍵詞查找的功能

hutool-dfa使用文檔

1.概述

由來

在我最早入職的一家公司,主要負責內容方面的業務,對我來說大部分的工作是對內容的清洗和規整。當然,清洗過程免不了的就是按照關鍵詞過濾,你懂的。需求如下:

后臺人員添加N個關鍵字,然后對主站所有的內容進行清洗,含有這些關鍵字的所有內容都置為無效。

思路

拿到此需求,我最早的方案比較粗暴:針對關鍵字建立一個HashSet,然后遍歷整個數據庫,針對每篇文章遍歷這個Set,查找是否contains關鍵字……好吧我承認這不是一個好方法,隨著關鍵字的增多和數據的增多,這個過程消耗的時間成指數型增長!

于是我找到度娘,發現一個算法:DFA。

DFA介紹

DFA全稱為:Deterministic Finite Automaton,即確定有窮自動機。因為本人算法學的不好,有興趣的可以看這篇博客: 基于DFA敏感詞查詢的算法簡析

解釋起來原理其實也不難,就是用所有關鍵字構造一棵樹,然后用正文遍歷這棵樹,遍歷到葉子節點即表示文章中存在這個關鍵字。

我們暫且忽略構建關鍵詞樹的時間,每次查找正文只需要O(n)復雜度就可以搞定。

針對DFA算法以及網上的一些實現,Hutool做了整理和改進,最終形成現在的Hutool-dfa模塊。

2.DFA查找

1.構建關鍵詞樹

WordTree tree = new WordTree();
tree.addWord("大");
tree.addWord("大土豆");
tree.addWord("土豆");
tree.addWord("剛出鍋");
tree.addWord("出鍋");

2.查找關鍵詞

//正文
String text = "我有一顆大土豆,剛出鍋的";
  1. 情況一:標準匹配,匹配到最短關鍵詞,并跳過已經匹配的關鍵詞

// 匹配到【大】,就不再繼續匹配了,因此【大土豆】不匹配
// 匹配到【剛出鍋】,就跳過這三個字了,因此【出鍋】不匹配(由于剛首先被匹配,因此長的被匹配,最短匹配只針對第一個字相同選最短)
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(), "[大, 土豆, 剛出鍋, 出鍋]");
  1. 情況三:匹配到最長關鍵詞,跳過已經匹配的關鍵詞

// 匹配到【大】,由于到最長匹配,因此【大土豆】接著被匹配
// 由于【大土豆】被匹配,【土豆】被跳過,由于【剛出鍋】被匹配,【出鍋】被跳過
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還提供了matchisMatch兩個方法,這兩個方法只會查找第一個匹配的結果,這樣一旦找到第一個關鍵字,就會停止繼續匹配,大大提高了匹配效率。

3.針對特殊字符

有時候,正文中的關鍵字常常包含特殊字符,比如:"〓關鍵☆字",針對這種情況,Hutool提供了StopChar類,專門針對特殊字符做跳過處理,這個過程是在match方法或matchAll方法執行的時候自動去掉特殊字符。

“java的Hutool-dfa怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永吉县| 应用必备| 南丹县| 都安| 禹城市| 元谋县| 嘉峪关市| 六枝特区| 红河县| 布尔津县| 库车县| 大邑县| 九江市| 乌拉特前旗| 清镇市| 蒙城县| 芮城县| 铜梁县| 扶余县| 广德县| 通道| 南丰县| 喀什市| 信宜市| 沧州市| 三台县| 乌恰县| 台安县| 丰都县| 祁连县| 屏东县| 广宗县| 黎川县| 平果县| 正阳县| 富源县| 泸定县| 南部县| 湘潭市| 嘉祥县| 穆棱市|