在信息爆炸的時代,網絡上充斥著大量的敏感信息,可能會產生很多的負面影響。為了應對這一挑戰,一直在尋求有效的方式來替換或過濾掉敏感字詞,而Java DFA(Deterministic Finite Automaton)算法正是在這方面發揮著關鍵作用。
DFA即Deterministic Finite Automaton,是一種有窮自動機,通常用于處理字符串匹配問題。在Java中,DFA算法用于搜索和替換文本中的特定模式,如敏感字詞或關鍵詞。DFA算法通過將文本逐字符逐字符地與事先定義好的敏感字列表進行比較,從而快速而高效地檢測和替換敏感字。
DFA算法基于狀態轉移。它首先構建一個狀態轉移圖,其中每個狀態代表算法在處理字符串時的狀態。然后,算法從輸入文本的開頭開始,根據當前字符和當前狀態,查找下一個狀態,并根據狀態的不同采取不同的操作。當輸入文本中的字符被處理完畢時,算法會得到一個已替換敏感字的文本或者是否包含敏感詞的一個狀態。
例如替換文本中的敏感詞:
文本:Java新視界,為你開啟Java世界的大門。實用技巧,深度解析,讓Java更簡單,更強大!一起攀登Java技術高峰,實現編程夢想!敏感詞列表:["新視界", "新視野", "技術", "技術高峰", "編程夢想", "實現夢想"]
基于敏感詞,構建森林:
基于森林,構建JSON對象:
{ "技":{ "isEnd":"0", "術":{ "高":{ "峰":{ "isEnd":"1" }, "isEnd":"0" }, "isEnd":"1" } }, "新":{ "isEnd":"0", "視":{ "界":{ "isEnd":"1" }, "isEnd":"0", "野":{ "isEnd":"1" } } }, "編":{ "isEnd":"0", "程":{ "isEnd":"0", "夢":{ "isEnd":"0", "想":{ "isEnd":"1" } } } }, "實":{ "現":{ "isEnd":"0", "夢":{ "isEnd":"0", "想":{ "isEnd":"1" } } }, "isEnd":"0" }}
mport java.util.*;/** * 敏感詞處理工具 - DFA算法實現 * @author Java新視界 * @modifier Java新視界 * @date 2023/10/25 16:58 */public class SensitiveWordUtil { /** * 敏感詞匹配規則 */ public static final int MIN_MATCH_TYPE = 1; //最小匹配規則,如:敏感詞庫["新視界","視界"],語句:"Java新視界",匹配結果:Java新[視界] public static final int MAX_MATCH_TYPE = 2; //最大匹配規則,如:敏感詞庫["新視界","視界"],語句:"Java新視界",匹配結果:Java[新視界] private static Map<String, Object> initSensitiveWordMap(Set<String> sensitiveWordSet) { Map<String, Object> map = new HashMap(Math.max((int) (sensitiveWordSet.size() / .75f) + 1, 16)); //初始化敏感詞容器,減少擴容操作 for (String aKeyWordSet : sensitiveWordSet) { //迭代keyWordSet Map nowMap = map; for (int i = 0; i < aKeyWordSet.length(); i++) { char keyChar = aKeyWordSet.charAt(i); Object wordMap = nowMap.get(keyChar); if (wordMap != null) { nowMap = (Map) wordMap; //如果存在該key,直接賦值 } else { //不存在則,則構建一個map,同時將isEnd設置為0 Map<String, String> newWorMap = new HashMap<>(3); newWorMap.put("isEnd", "0"); nowMap.put(keyChar, newWorMap); nowMap = newWorMap; } if (i == aKeyWordSet.length() - 1) {//判斷最后一個 nowMap.put("isEnd", "1"); } } } return map; } public static Set<String> getSensitiveWord(Set<String> sensitiveWordSet,String txt, int matchType) { Set<String> sensitiveWordList = new HashSet<>(); Map<String, Object> map = initSensitiveWordMap(sensitiveWordSet); for (int i = 0; i < txt.length(); i++) { //判斷是否包含敏感字符 int length = checkSensitiveWord(map,txt, i, matchType); if (length > 0) { //存在,加入list中 sensitiveWordList.add(txt.substring(i, i + length)); i = i + length - 1; //減1的原因,是因為for會自增 } } return sensitiveWordList; } public static String replaceSensitiveWord(Set<String> sensitiveWordSet, String txt, char replaceChar, int matchType) { String resultTxt = txt; //獲取所有的敏感詞 Set<String> set = getSensitiveWord(sensitiveWordSet,txt, matchType); Iterator<String> iterator = set.iterator(); String word; String replaceString; while (iterator.hasNext()) { word = iterator.next(); replaceString = getReplaceChars(replaceChar, word.length()); resultTxt = resultTxt.replaceAll(word, replaceString); } return resultTxt; } public static String replaceSensitiveWord(Set<String> sensitiveWordSet, String txt, String replaceStr, int matchType) { String resultTxt = txt; //獲取所有的敏感詞 Set<String> set = getSensitiveWord(sensitiveWordSet,txt, matchType); Iterator<String> iterator = set.iterator(); String word; while (iterator.hasNext()) { word = iterator.next(); resultTxt = resultTxt.replaceAll(word, replaceStr); } return resultTxt; } private static String getReplaceChars(char replaceChar, int length) { String resultReplace = String.valueOf(replaceChar); for (int i = 1; i < length; i++) { resultReplace += replaceChar; } return resultReplace; } private static int checkSensitiveWord(Map<String, Object> nowMap, String txt, int beginIndex, int matchType) { boolean flag = false; int matchFlag = 0; char word; for (int i = beginIndex; i < txt.length(); i++) { word = txt.charAt(i); //獲取指定key nowMap = (Map<String, Object>) nowMap.get(word); if (nowMap != null) { //存在,則判斷是否為最后一個 matchFlag++; //找到相應key,匹配標識+1 //如果為最后一個匹配規則,結束循環,返回匹配標識數 if ("1".equals(nowMap.get("isEnd"))) { flag = true; //結束標志位為true //最小規則,直接返回,最大規則還需繼續查找 if (MIN_MATCH_TYPE == matchType) { break; } } } else { //不存在,直接返回 break; } } if (matchFlag < 2 || !flag) { //長度必須大于等于1,為詞 matchFlag = 0; } return matchFlag; }}
public static void main(String[] args) { Set<String> sensitiveWordSet = new HashSet<>(Arrays.asList("新視界", "新視野","技術", "技術高峰", "編程夢想", "實現夢想")); String string = "Java新視界,為你開啟Java世界的大門。實用技巧,深度解析,讓Java更簡單,更強大!一起攀登Java技術高峰,實現編程夢想!"; //獲取語句中的敏感詞 Set<String> set = SensitiveWordUtil.getSensitiveWord(sensitiveWordSet,string, SensitiveWordUtil.MAX_MATCH_TYPE); System.out.println("語句中 包含敏感詞的個數為:" + set.size() + "。包含:" + set); set = SensitiveWordUtil.getSensitiveWord(sensitiveWordSet,string, SensitiveWordUtil.MIN_MATCH_TYPE); System.out.println("語句中 包含敏感詞的個數為:" + set.size() + "。包含:" + set); //替換語句中的敏感詞 String filterStr = SensitiveWordUtil.replaceSensitiveWord(sensitiveWordSet,string, '*', SensitiveWordUtil.MAX_MATCH_TYPE); System.out.println(filterStr); filterStr = SensitiveWordUtil.replaceSensitiveWord(sensitiveWordSet,string, '*', SensitiveWordUtil.MIN_MATCH_TYPE); System.out.println(filterStr);}
運行結果:
優勢:
挑戰:
總的來說,DFA算法在替換敏感字領域具有廣泛的應用,為網絡社區、金融機構、政府和其他領域提供了一種強大工具,用于過濾和替換敏感信息,維護社會秩序,保護用戶的隱私,以及確保互聯網上的安全和和諧。隨著技術的不斷發展,DFA算法將繼續發揮重要作用,以適應不斷變化的需求和挑戰。
本文鏈接:http://www.www897cc.com/showinfo-26-15314-0.htmlDFA算法,高效實現敏感詞檢測與替換!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
下一篇: 微博二面:所有對象都一定被分配在堆中么?