溫馨提示×

溫馨提示×

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

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

java的Hutool-dfa怎么使用

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

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

這個模塊注意針對于關(guān)鍵詞查找的功能

hutool-dfa使用文檔

1.概述

由來

在我最早入職的一家公司,主要負責(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介紹

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模塊。

2.DFA查找

1.構(gòu)建關(guān)鍵詞樹

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

2.查找關(guān)鍵詞

//正文
String text = "我有一顆大土豆,剛出鍋的";
  1. 情況一:標(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(), "[大, 土豆, 剛出鍋, 出鍋]");
  1. 情況三:匹配到最長關(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還提供了matchisMatch兩個方法,這兩個方法只會查找第一個匹配的結(jié)果,這樣一旦找到第一個關(guān)鍵字,就會停止繼續(xù)匹配,大大提高了匹配效率。

3.針對特殊字符

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

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

向AI問一下細節(jié)

免責(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)容。

AI