真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java的Hutool-dfa怎么使用

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

創(chuàng)新互聯(lián) - 成都棕樹機(jī)房,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),成都棕樹機(jī)房,西南服務(wù)器托管,四川/成都大帶寬,機(jī)柜大帶寬,四川老牌IDC服務(wù)商

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

hutool-dfa使用文檔

1.概述

由來

在我最早入職的一家公司,主要負(fù)責(zé)內(nèi)容方面的業(yè)務(wù),對我來說大部分的工作是對內(nèi)容的清洗和規(guī)整。當(dāng)然,清洗過程免不了的就是按照關(guān)鍵詞過濾,你懂的。需求如下:

后臺人員添加N個關(guān)鍵字,然后對主站所有的內(nèi)容進(jìn)行清洗,含有這些關(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,即確定有窮自動機(jī)。因為本人算法學(xué)的不好,有興趣的可以看這篇博客: 基于DFA敏感詞查詢的算法簡析

解釋起來原理其實(shí)也不難,就是用所有關(guān)鍵字構(gòu)造一棵樹,然后用正文遍歷這棵樹,遍歷到葉子節(jié)點(diǎn)即表示文章中存在這個關(guān)鍵字。

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

針對DFA算法以及網(wǎng)上的一些實(shí)現(xiàn),Hutool做了整理和改進(jìn),最終形成現(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 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)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


網(wǎng)站名稱:java的Hutool-dfa怎么使用
文章鏈接:http://weahome.cn/article/pdcdje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部