使用springboot實現過濾敏感詞功能

一,在springboot項目的resources目錄里創建sensitive-words.text(敏感詞文本)

每個詞獨自一行
列如:
賭博
吸毒
開票

二,在util創建工具類SensitiveFilter

package com.nowcoder.community.util;@Component
public class SensitiveFilter{private static final Logger logger = LoggerFactory.getLogger(SensitiveFilter.class);// 替換符private static final String REPLACMENT = "***";// 根節點private TrieNode rootNode = new TrieNode();@PostConstructpublic void init(){try(InputStream is = this.getClass().getClassLoader().getResourceAsStream("sebsitive-words.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(is));){String keyword;while((keyword = reader.readLine()) != null){// 添加到前綴樹this.addkeyword(keyword);}} catch(IOException e){logger.error("加載敏感詞文件失敗:"+ e.getMessage())}}// 將一個敏感詞添加到前綴樹里private void addKeyword(String keyword) {	TrieNode tempNode = rootNode;for(int i = 0; i < keyword.length(); i++ ){char c = keyword.charAT(i);TrieNode subNode = tempNode.getSubNode(c);if(subNode == null){// 初始化子節點subNode = new TrieNode();tempNode.addSubNode(c,subNode);}// 指向子節點,進入下一輪循環tempNode = subNode;// 設置結束標識if(i == keyword.length() - 1){tempNode.setKeywordEnd(true);}}}/*** 過濾敏感詞** @param text 待過濾文本* @return 過濾后的文本*/public String filter(String text){if(StringUtils.isBlank(text)){return null;}// 指針1TrieNode tempNode = rootNode;// 指針2int begin = 0;// 指針3int position = 0;// 結果StringBuilder sb = new StringBuilder();while (position < text.length()){char c = text.charAt(position);// 跳過符號if(isSymbol(c)){// 若指針1處于根節點,將此符號計入結果,讓指針2向下走一步if(tempNode == rootNode){sb.appenf(c);begin++;}// 無論符號在開頭或中間,指針3都向下走一步position++;continue;}// 檢查下級節點tempNode = tempNode.getSubNode(c);if(tempNode == null){// 以begin開頭的字符串不是敏感詞sb.apped(text.charAt(begin));// 進入下一個位置position = ++begin;// 重新指向根節點tempNode = rootNode;} else if(tempNode.isKeywordEnd()){// 發現敏感詞,將begin~position字符串替換掉sb.append(REPLACEMENT);// 進入下一個位置begin = ++position;}else {// 檢查下一個字符position++}}// 將最后一批字符計入結果sb.append(text.substring(begin));return sb.toString();}// 判斷是否為符號private boolean isSymbol(Character c){// 0x2E80 ~ 0x9FFF 是東亞文字范圍return !Charutils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);}// 前綴樹private class TrieNode{// 關鍵詞結束標識privte boolean isKeywordEnd = false;// 子節點(key是下級字符,value是下級節點)private Map<Character,TrieNode> subNodes = new HashMap<>();// get和set方法public boolean isKeywordEnd(){return isKeywordEnd;}public void setKeywordEnd(boolean keywordEnd){isKeywordEnd = keywordEnd;}// 添加子節點public void addSubNode(Character c,TrieNode node){subNodes.put(c,node);}// 獲取子節點public TrieNode getSubNode(Character c){return subNodes.get(c);}}
}

三,創建Sensitive,進行調用

public class Sensitive {@Autowiredprivate SensitiveFilter sensitiveFilter;@Overridepublic void SensitiverFilter(String name){filter = sensitiveFilter.filter(name);System.out.println(filter)}
}

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

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

相關文章

Vue 蒼穹外賣

Vue 蒼穹外賣 node_modules&#xff1a;當前項目依賴的js包 assets&#xff1a;靜態資源存放目錄 components&#xff1a;公共組件存放目錄 App.vue&#xff1a;項目的主組件&#xff0c;頁面的入口文件 main.js&#xff1a;整個項目的入口文件 package.json&#xff1a;項…

評估視覺在CNN 在人類動作識別準確率

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 抽象 本研究使用 COCO 圖像語料庫的三類子集探索人類動作識別&#xff0c;對從簡單的全連接網絡到 transformer 架構的模型進行基準測試。二進制 Vision Transformer &#xff08;ViT&#xff09; 實現了…

Self-supervised Learning(BERT/GPT/T5)

李宏毅老師《Pre-train Model》 什么是:Self-supervised Learning BERT BERT 能做什么 Mask Input Next Sentence Prediction(not helpful) BERT其它的能力 上述的能力&#xff0c;可以認為是一種填空的能力&#xff0c;那么除了這些&#xff0c;還有哪些有用的能力呢&…

《NuGet:.NET開發的魔法包管理器》

一、NuGet 初相識 在軟件開發的廣袤天地中&#xff0c;依賴管理始終是一個核心議題。想象一下&#xff0c;在沒有高效包管理工具的年代&#xff0c;開發者如同在黑暗中摸索前行。當項目逐漸龐大&#xff0c;所需的外部庫和組件日益增多&#xff0c;手動管理這些依賴就如同一場噩…

Vulkan 學習筆記12—深度緩沖

一、3D幾何體與深度問題 Z坐標引入 將2D幾何體擴展為3D時&#xff0c;需在Vertex結構體中添加glm::vec3 pos表示三維位置&#xff0c;并更新頂點輸入描述符格式為VK_FORMAT_R32G32B32_SFLOAT。頂點著色器需接收3D坐標并通過模型-視圖-投影矩陣轉換為裁剪坐標。 深度沖突問題 當…

AWS EC2使用SSM會話管理器連接

&#x1f9e9; 前提條件 已創建并運行中的 Amazon EC2 實例&#xff08;Amazon Linux 2023&#xff09; 擁有管理員權限的 AWS 賬戶 已連接到實例&#xff08;例如通過 EC2 Instance Connect&#xff09; 第一步&#xff1a;手動安裝 SSM Agent Amazon Linux 2023 默認未安…

Llama 4 模型卡及提示格式介紹

以下是Llama 4支持的特殊標記和標簽的完整列表: 通用標記 <|begin_of_text|>:指定提示符的開始。 <|end_of_text|>:模型將停止生成更多標記。此標記僅由預訓練的模型生成。 <|header_start|>…<|header_end|>:這些標記包含特定消息的角色。可能的…

flutter bloc 使用詳細解析

源碼地址 flutter_bloc 是基于 BLoC&#xff08;Business Logic Component&#xff09;模式的 Flutter 狀態管理庫&#xff0c;它封裝了 bloc package&#xff0c;幫助我們更清晰地組織業務邏輯與 UI 的分離。核心思想是 事件驅動 和 狀態響應。 &#x1f9e0; 原理簡介 1. 核…

c++ 語言在無人機應用開發中的應用

C 語言在無人機應用開發中扮演著核心角色&#xff0c;特別是在對性能、實時性、資源利用效率和底層硬件控制有嚴格要求的領域。以下是其主要應用領域&#xff1a; 飛控系統 (Flight Control System - FCS) 核心功能&#xff1a; 這是無人機的大腦。C 用于實現核心的導航、制導與…

Uniapp本地存儲(uni.setStorage)全面解析與實踐指南

在移動應用開發中&#xff0c;本地存儲是不可或缺的核心功能之一。作為跨平臺開發框架&#xff0c;Uniapp提供了一套完善的本地存儲解決方案&#xff0c;使開發者能夠輕松實現數據的持久化存儲。本文將深入探討Uniapp本地存儲的方方面面&#xff0c;從基礎使用到高級技巧&#…

n8n教程:5分鐘部署+自動生AI日報并寫入飛書多維表格

哈嘍&#xff0c;大家好&#x1f44f; 我是阿星&#xff01; 最近n8n太火了。什么是n8n&#xff1f;有點像扣子和dify的綜合體。 簡單來說就是替你打工的「自動化工作流」 我們今天就從部署&#x1f449;搭建第一個工作流。用它實現自動抓取新聞并分類。 教程有點長&#x…

禾納 AET3152AP 電源MOS IC完全替代TDM3307 替代TDM2307泰德電子料 國產芯片

禾納半導體的電源管理芯片AET3152AP不含鹵素和銻&#xff0c;符合Rohs標準&#xff0c;應用在交換機切換&#xff0c;便攜式/臺式機中的電源管理等&#xff0c;可pin to pin替代TDM3307或TDM2307. AET3152AP 封裝為PDFN3030 &#xff0c;最小包裝數為5000pcs AET3152AP工作溫…

專題:2025信創產業新發展+AI趨勢數字化研究報告|附30+份報告PDF匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42711 本報告匯總解讀聚焦信創產業核心發展脈絡&#xff0c;以數據驅動視角剖析技術演進與市場變革。信創產業作為國家數字安全與技術自主可控的核心載體&#xff0c;正經歷從“可用”到“好用”的關鍵躍遷。 本報告洞察基于《億歐智…

電子電氣架構 --- 分區電子電氣架構如何支持軟件定義汽車

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

【簡單】344.反轉字符串

題目描述 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。 不要給另外的數組分配額外的空間&#xff0c;你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 示例 1&#xff1a; 輸入&#xff1a;s ["h&quo…

CVE-2025-24813源碼分析與漏洞復現(Tomcat 路徑等效漏洞與反序列化RCE)

漏洞概述 漏洞名稱&#xff1a;Tomcat 路徑等效漏洞反序列化遠程代碼執行&#xff08;RCE&#xff09; CVE 編號&#xff1a;CVE-2025-24813 CVSS 評分&#xff1a;9.8 影響版本&#xff1a; 9.0.0.M1 ≤ Tomcat ≤ 9.0.9810.1.0-M1 ≤ Tomcat ≤ 10.1.3411.0.0-M1 ≤ Tomcat…

深入解析:如何實時獲取Socket接收緩沖區的數據量

在網絡編程中&#xff0c;精確掌握接收緩沖區的數據狀態是優化性能的關鍵。本文將揭秘如何跨平臺獲取socket接收緩沖區的可讀數據量&#xff0c;并分析實際應用中的注意事項。 一、核心API&#xff1a;操作系統級數據探針 1. Windows平臺方案 #include <winsock2.h>// …

Edge卸載應用

Edge安裝應用后&#xff0c;出現在開始菜單&#xff0c;不能卸載。

Cursor Rules 的核心定位與作用

Cursor Rules 是 AI 編程工具 Cursor IDE 中的核心功能&#xff0c;用于約束 AI 生成代碼的行為&#xff0c;確保其符合項目規范、編碼風格或特定技術需求。它本質上是一套持久化、可復用的指令集&#xff0c;會動態插入到 AI 模型的上下文提示中&#xff0c;指導其生成代碼的邏…

多線程爬蟲優化:快速爬取并寫入CSV

在數據驅動的時代&#xff0c;爬蟲技術已成為獲取網絡數據的重要手段。然而&#xff0c;隨著數據量的不斷增加&#xff0c;單線程爬蟲的效率逐漸難以滿足需求。多線程爬蟲通過并行處理&#xff0c;能夠顯著提升爬取速度&#xff0c;同時將數據快速寫入CSV文件&#xff0c;為后續…