Hutool - DFA:基于 DFA 模型的多關鍵字查找

一、簡介

在文本處理中,常常需要在一段文本里查找多個關鍵字是否存在,例如敏感詞過濾、關鍵詞匹配等場景。Hutool - DFA 模塊基于確定性有限自動機(Deterministic Finite Automaton,DFA)模型,為我們提供了高效的多關鍵字查找功能。DFA 模型是一種狀態機,它通過預先構建一個狀態轉移表,能夠在一次遍歷文本的過程中,快速判斷是否存在多個關鍵字,時間復雜度為 O ( n ) O(n) O(n),其中 n n n 是文本的長度,這使得它在處理大規模文本和大量關鍵字時具有很高的效率。

二、引入依賴

若使用 Maven 項目,在 pom.xml 中添加以下依賴:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

如果是 Gradle 項目,在 build.gradle 中添加:

implementation 'cn.hutool:hutool-all:5.8.16'
三、基本使用步驟
1. 創建 DFA 匹配器
import cn.hutool.dfa.FoundWord;
import cn.hutool.dfa.WordTree;
import java.util.ArrayList;
import java.util.List;public class DFAExample {public static void main(String[] args) {// 創建 WordTree 對象,用于構建 DFA 模型WordTree wordTree = new WordTree();// 添加關鍵字List<String> keywords = new ArrayList<>();keywords.add("蘋果");keywords.add("香蕉");keywords.add("葡萄");wordTree.addWords(keywords);}
}

在上述代碼中,首先創建了一個 WordTree 對象,它是 Hutool - DFA 中用于構建 DFA 模型的核心類。然后,創建一個包含多個關鍵字的列表,并使用 addWords 方法將這些關鍵字添加到 WordTree 中,從而完成 DFA 模型的構建。

2. 進行關鍵字查找
import cn.hutool.dfa.FoundWord;
import cn.hutool.dfa.WordTree;
import java.util.ArrayList;
import java.util.List;public class DFAExample {public static void main(String[] args) {// 創建 WordTree 對象,用于構建 DFA 模型WordTree wordTree = new WordTree();// 添加關鍵字List<String> keywords = new ArrayList<>();keywords.add("蘋果");keywords.add("香蕉");keywords.add("葡萄");wordTree.addWords(keywords);// 待查找的文本String text = "我喜歡吃蘋果和香蕉。";// 查找文本中包含的關鍵字List<FoundWord> foundWords = wordTree.matchAll(text);for (FoundWord foundWord : foundWords) {System.out.println("找到關鍵字:" + foundWord.getWord() + ",起始位置:" + foundWord.getStartIndex() + ",結束位置:" + foundWord.getEndIndex());}}
}

在這個代碼片段中,定義了一段待查找的文本,然后使用 matchAll 方法在文本中查找之前添加的關鍵字。matchAll 方法會返回一個 FoundWord 對象的列表,每個 FoundWord 對象包含了找到的關鍵字、關鍵字在文本中的起始位置和結束位置。通過遍歷這個列表,我們可以輸出找到的關鍵字及其位置信息。

四、高級用法
1. 忽略大小寫匹配
import cn.hutool.dfa.FoundWord;
import cn.hutool.dfa.WordTree;
import java.util.ArrayList;
import java.util.List;public class CaseInsensitiveDFAExample {public static void main(String[] args) {WordTree wordTree = new WordTree();List<String> keywords = new ArrayList<>();keywords.add("Apple");wordTree.addWords(keywords);String text = "I like apple.";// 忽略大小寫進行匹配List<FoundWord> foundWords = wordTree.matchAll(text, true);for (FoundWord foundWord : foundWords) {System.out.println("找到關鍵字:" + foundWord.getWord() + ",起始位置:" + foundWord.getStartIndex() + ",結束位置:" + foundWord.getEndIndex());}}
}

matchAll 方法中,第二個參數設置為 true 表示忽略大小寫進行匹配。這樣,即使文本中的關鍵字大小寫與添加的關鍵字不一致,也能被正確匹配。

2. 最長匹配原則
import cn.hutool.dfa.FoundWord;
import cn.hutool.dfa.WordTree;
import java.util.ArrayList;
import java.util.List;public class LongestMatchDFAExample {public static void main(String[] args) {WordTree wordTree = new WordTree();List<String> keywords = new ArrayList<>();keywords.add("蘋果");keywords.add("紅蘋果");wordTree.addWords(keywords);String text = "我喜歡吃紅蘋果。";// 開啟最長匹配List<FoundWord> foundWords = wordTree.matchAll(text, false, true);for (FoundWord foundWord : foundWords) {System.out.println("找到關鍵字:" + foundWord.getWord() + ",起始位置:" + foundWord.getStartIndex() + ",結束位置:" + foundWord.getEndIndex());}}
}

matchAll 方法中,第三個參數設置為 true 表示使用最長匹配原則。在上述示例中,文本中包含“紅蘋果”,由于開啟了最長匹配,只會匹配到“紅蘋果”,而不會匹配到“蘋果”。

五、注意事項
  • 關鍵字添加順序:關鍵字的添加順序不影響匹配結果,因為 DFA 模型是基于狀態轉移的,所有關鍵字會被統一構建到狀態轉移表中。
  • 性能考慮:DFA 模型在處理大規模文本和大量關鍵字時具有較高的性能,但在構建 DFA 模型時,需要消耗一定的內存和時間。因此,在實際應用中,應根據具體情況合理管理關鍵字的數量。
  • 字符編碼:確保文本和關鍵字使用相同的字符編碼,避免因編碼問題導致匹配失敗。

通過使用 Hutool - DFA,開發者可以方便地實現高效的多關鍵字查找功能,無論是敏感詞過濾、信息檢索還是其他文本處理場景,都能輕松應對。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71595.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++STL容器之map

1.介紹 map是 C 標準模板庫&#xff08;STL&#xff09;中的一個關聯容器&#xff0c;用于存儲鍵值對&#xff08;key-value pairs&#xff09;。map中的元素是按照鍵&#xff08;key&#xff09;進行排序的&#xff0c;并且每個鍵在容器中是唯一的。map通常基于紅黑樹&#xf…

CentOS的ssh復制文件

1.前提 首先要已經連接上了對方的ssh 2.命令 scp [文件] 目標IP:目標路徑 例如&#xff1a; $PWD是一個環境變量&#xff0c;可以獲取當前絕對目錄&#xff0c;ssh上傳的時候一定要確保對方有這個目錄才行&#xff0c;不然會報錯 3.遞歸上傳 scp -r 目錄 目標IP:路徑 可以…

《Python實戰進階》專欄 No.3:Django 項目結構解析與入門DEMO

《Python實戰進階》專欄 第3集&#xff1a;Django 項目結構解析與入門DEMO 在本集中&#xff0c;我們將深入探討 Django 的項目結構&#xff0c;并實際配置并運行一個入門DEMO博客網站&#xff0c;幫助你在 Web 開發中更高效地使用 Django。Django 是一個功能強大的 Python Web…

每日一題——376. 擺動序列

題目鏈接&#xff1a;376. 擺動序列 - 力扣&#xff08;LeetCode&#xff09; 代碼&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {int curdiff 0;int prediff 0;int result 1; for(int i 0;i < nums.size()-1;i){curdiff …

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比 一、誕生背景與技術演進路徑 1.1 OpenAI與ChatGPT的生態布局 ChatGPT的研發主體OpenAI成立于2015年,早期定位為非營利性研究機構,核心目標為實現通用人工智能(AGI)。其技術路徑以Transformer架構為基礎,通過堆疊參數規…

[原創](Modern C++)現代C++的關鍵性概念: 學習新算法: std::unique_copy

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delphi、XCode、Eclipse…

前端(vue)學習筆記(CLASS 1):vue框架入門

1、vue上手 概念&#xff1a;vue是一個用于構建用戶界面的漸進式框架 vue的兩種使用方式&#xff1a; 1、vue的核心包開發 場景&#xff1a;局部模塊改造 2、vue核心包&vue插件工程化開發 場景&#xff1a;整站開發 1、創建實例 核心步驟 1、準備容器&#xff08;…

synchronized鎖字符串

示例一 在沒有使用synchronized鎖的情況下: import java.util.HashMap; import java.util.Map;public class NonSynchronizedSchoolExample {private static final Map<String, Integer> schoolCountMap new HashMap<>(); // 存儲每個學校的交卷數量public sta…

1.14作業

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

Hopper架構 GEMM教程

一 使用 1.1 makefile compile:nvcc -arch=sm_90a -lcuda -lcublas -std=c++17 matmul_h100_optimal.cu -o testrun:./test加入-lcublas,不然會有函數無法被識別 二 代碼分析 2.1 kernel外參數分析 2.1.1 基本參數 constexpr int BM = 64*2;constexpr int BN = 256;cons…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技術飛速發展的今天&#xff0c;深度學習模型已成為推動各行各業智能化轉型的核心驅動力。DeepSeek 作為一款領先的 AI 模型&#xff0c;憑借其高效的性能和靈活的部署方式&#xff0c;受到了廣泛關注。無論是自然語言處理、圖像識別&#xff0c;還是…

數據倉庫、數據湖和數據湖倉

數據倉庫、數據湖和數據湖倉是三種常見的數據存儲和管理技術&#xff0c;各自有不同的特點和適用場景。以下是它們的詳細比較&#xff1a; 1. 數據倉庫&#xff08;Data Warehouse&#xff09; 定義&#xff1a;用于存儲結構化數據&#xff0c;經過清洗、轉換和建模&#xff…

學習aigc

DALLE2 論文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…

POI pptx轉圖片

前言 ppt頁面預覽一直是個問題&#xff0c;office本身雖然有預覽功能但是收費&#xff0c;一些開源的項目的預覽又不太好用&#xff0c;例如開源的&#xff1a;kkfileview pptx轉圖片 1. 引入pom依賴 我這個項目比較老&#xff0c;使用版本較舊 <dependency><gro…

零基礎學python--------第三節:Python的流程控制語法

Python&#xff0c;浮點數 11.345(單&#xff1a;4個字節&#xff0c; 雙&#xff1a;8個字節) 。 十進制的數字25 ---> 11001 講一個小數轉化為二進制&#xff1a; 不斷的乘以2 。取整數部分。 十進制的0.625 ----> 二進制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

2025.2.21 Restless And Brave

今天是2025年的2月21日&#xff0c;星期五。 距離考研出分還有兩天半的時間。 這種時候&#xff0c;我想考的特別好的同學或者考的特別差的同學都不會太焦慮&#xff0c;只有我這種考的不上不下的人才會焦慮。 我曾不止一次的想過如何面對失敗&#xff0c;但每每想到這個問題…

骶骨神經

骶骨腫瘤手術后遺癥是什么_39健康網_癌癥 [健康之路]匠心仁術&#xff08;七&#xff09; 勇闖禁區 骶骨腫瘤切除術

DeepSeek智能測試知識庫助手PRO版:多格式支持+性能優化

前言 測試工程師在管理測試資產時,需要面對多種文檔格式、大量文件分類及知識庫的構建任務。為了解決這些問題,我們升級了 DeepSeek智能測試知識庫助手,不僅支持更多文檔格式,還加入了 多線程并發處理 和 可擴展格式支持,大幅提升處理性能和靈活性。 主要功能亮點: 多格…

Ubuntu編譯ZLMediaKit

下載 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安裝工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…

如何做接口自動化測試?

一、前言 接口通俗來講就是前端和后段之間傳輸數據的橋梁&#xff0c;注意&#xff1a;不是每一個項目都有接口&#xff0c;一些大型項目是前后端分離的&#xff0c;那么他們怎么實現數據的傳遞和返回呢&#xff1f;在通俗來講就是前端和后段都有一個模擬參數數據 二、接口自…