AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

DFA算法,高效實(shí)現(xiàn)敏感詞檢測(cè)與替換!

來(lái)源: 責(zé)編: 時(shí)間:2023-10-27 09:14:41 244觀看
導(dǎo)讀在信息爆炸的時(shí)代,網(wǎng)絡(luò)上充斥著大量的敏感信息,可能會(huì)產(chǎn)生很多的負(fù)面影響。為了應(yīng)對(duì)這一挑戰(zhàn),一直在尋求有效的方式來(lái)替換或過(guò)濾掉敏感字詞,而Java DFA(Deterministic Finite Automaton)算法正是在這方面發(fā)揮著關(guān)鍵作用。什

ty228資訊網(wǎng)——每日最新資訊28at.com

在信息爆炸的時(shí)代,網(wǎng)絡(luò)上充斥著大量的敏感信息,可能會(huì)產(chǎn)生很多的負(fù)面影響。為了應(yīng)對(duì)這一挑戰(zhàn),一直在尋求有效的方式來(lái)替換或過(guò)濾掉敏感字詞,而Java DFA(Deterministic Finite Automaton)算法正是在這方面發(fā)揮著關(guān)鍵作用。ty228資訊網(wǎng)——每日最新資訊28at.com

什么是DFA算法?

DFA即Deterministic Finite Automaton,是一種有窮自動(dòng)機(jī),通常用于處理字符串匹配問(wèn)題。在Java中,DFA算法用于搜索和替換文本中的特定模式,如敏感字詞或關(guān)鍵詞。DFA算法通過(guò)將文本逐字符逐字符地與事先定義好的敏感字列表進(jìn)行比較,從而快速而高效地檢測(cè)和替換敏感字。ty228資訊網(wǎng)——每日最新資訊28at.com

Java DFA算法的工作原理

DFA算法基于狀態(tài)轉(zhuǎn)移。它首先構(gòu)建一個(gè)狀態(tài)轉(zhuǎn)移圖,其中每個(gè)狀態(tài)代表算法在處理字符串時(shí)的狀態(tài)。然后,算法從輸入文本的開(kāi)頭開(kāi)始,根據(jù)當(dāng)前字符和當(dāng)前狀態(tài),查找下一個(gè)狀態(tài),并根據(jù)狀態(tài)的不同采取不同的操作。當(dāng)輸入文本中的字符被處理完畢時(shí),算法會(huì)得到一個(gè)已替換敏感字的文本或者是否包含敏感詞的一個(gè)狀態(tài)。ty228資訊網(wǎng)——每日最新資訊28at.com

例如替換文本中的敏感詞:ty228資訊網(wǎng)——每日最新資訊28at.com

文本:Java新視界,為你開(kāi)啟Java世界的大門。實(shí)用技巧,深度解析,讓Java更簡(jiǎn)單,更強(qiáng)大!一起攀登Java技術(shù)高峰,實(shí)現(xiàn)編程夢(mèng)想!敏感詞列表:["新視界", "新視野", "技術(shù)", "技術(shù)高峰", "編程夢(mèng)想", "實(shí)現(xiàn)夢(mèng)想"]

基于敏感詞,構(gòu)建森林:ty228資訊網(wǎng)——每日最新資訊28at.com

ty228資訊網(wǎng)——每日最新資訊28at.com

基于森林,構(gòu)建JSON對(duì)象:ty228資訊網(wǎng)——每日最新資訊28at.com

{    "技":{        "isEnd":"0",        "術(shù)":{            "高":{                "峰":{                    "isEnd":"1"                },                "isEnd":"0"            },            "isEnd":"1"        }    },    "新":{        "isEnd":"0",        "視":{            "界":{                "isEnd":"1"            },            "isEnd":"0",            "野":{                "isEnd":"1"            }        }    },    "編":{        "isEnd":"0",        "程":{            "isEnd":"0",            "夢(mèng)":{                "isEnd":"0",                "想":{                    "isEnd":"1"                }            }        }    },    "實(shí)":{        "現(xiàn)":{            "isEnd":"0",            "夢(mèng)":{                "isEnd":"0",                "想":{                    "isEnd":"1"                }            }        },        "isEnd":"0"    }}

DFA算法實(shí)現(xiàn)

mport java.util.*;/** * 敏感詞處理工具 - DFA算法實(shí)現(xiàn) * @author Java新視界 * @modifier Java新視界 * @date 2023/10/25 16:58 */public class SensitiveWordUtil {    /**     * 敏感詞匹配規(guī)則     */    public static final int MIN_MATCH_TYPE = 1;      //最小匹配規(guī)則,如:敏感詞庫(kù)["新視界","視界"],語(yǔ)句:"Java新視界",匹配結(jié)果:Java新[視界]    public static final int MAX_MATCH_TYPE = 2;      //最大匹配規(guī)則,如:敏感詞庫(kù)["新視界","視界"],語(yǔ)句:"Java新視界",匹配結(jié)果:Java[新視界]     private static Map<String, Object> initSensitiveWordMap(Set<String> sensitiveWordSet) {        Map<String, Object> map = new HashMap(Math.max((int) (sensitiveWordSet.size() / .75f) + 1, 16));    //初始化敏感詞容器,減少擴(kuò)容操作        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 {                            //不存在則,則構(gòu)建一個(gè)map,同時(shí)將isEnd設(shè)置為0                    Map<String, String> newWorMap = new HashMap<>(3);                    newWorMap.put("isEnd", "0");                    nowMap.put(keyChar, newWorMap);                    nowMap = newWorMap;                }                if (i == aKeyWordSet.length() - 1) {//判斷最后一個(gè)                    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的原因,是因?yàn)閒or會(huì)自增            }        }         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) {               //存在,則判斷是否為最后一個(gè)                matchFlag++;                    //找到相應(yīng)key,匹配標(biāo)識(shí)+1                //如果為最后一個(gè)匹配規(guī)則,結(jié)束循環(huán),返回匹配標(biāo)識(shí)數(shù)                if ("1".equals(nowMap.get("isEnd"))) {                    flag = true;                //結(jié)束標(biāo)志位為true                    //最小規(guī)則,直接返回,最大規(guī)則還需繼續(xù)查找                    if (MIN_MATCH_TYPE == matchType) {                        break;                    }                }            } else {                            //不存在,直接返回                break;            }        }        if (matchFlag < 2 || !flag) {           //長(zhǎng)度必須大于等于1,為詞            matchFlag = 0;        }        return matchFlag;    }}

DFA算法測(cè)試

public static void main(String[] args) {    Set<String> sensitiveWordSet = new HashSet<>(Arrays.asList("新視界", "新視野","技術(shù)", "技術(shù)高峰", "編程夢(mèng)想", "實(shí)現(xiàn)夢(mèng)想"));    String string = "Java新視界,為你開(kāi)啟Java世界的大門。實(shí)用技巧,深度解析,讓Java更簡(jiǎn)單,更強(qiáng)大!一起攀登Java技術(shù)高峰,實(shí)現(xiàn)編程夢(mèng)想!";    //獲取語(yǔ)句中的敏感詞    Set<String> set = SensitiveWordUtil.getSensitiveWord(sensitiveWordSet,string, SensitiveWordUtil.MAX_MATCH_TYPE);    System.out.println("語(yǔ)句中 包含敏感詞的個(gè)數(shù)為:" + set.size() + "。包含:" + set);    set = SensitiveWordUtil.getSensitiveWord(sensitiveWordSet,string, SensitiveWordUtil.MIN_MATCH_TYPE);    System.out.println("語(yǔ)句中 包含敏感詞的個(gè)數(shù)為:" + set.size() + "。包含:" + set);    //替換語(yǔ)句中的敏感詞    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);}

運(yùn)行結(jié)果:ty228資訊網(wǎng)——每日最新資訊28at.com

ty228資訊網(wǎng)——每日最新資訊28at.com

DFA算法在替換敏感字領(lǐng)域的應(yīng)用

  • 言論過(guò)濾:社交媒體平臺(tái)和在線論壇經(jīng)常使用Java DFA算法來(lái)檢測(cè)和替換敏感字。這有助于維護(hù)社區(qū)的友好環(huán)境,減少網(wǎng)絡(luò)欺凌和不當(dāng)言論。
  • 敏感信息過(guò)濾:在金融領(lǐng)域,DFA算法可以用于檢測(cè)和替換敏感信息,如銀行賬號(hào)、信用卡號(hào)和社保號(hào)。這有助于確保用戶的隱私和數(shù)據(jù)安全。
  • 兒童保護(hù):兒童在線安全是一個(gè)重要問(wèn)題。DFA算法可以用于過(guò)濾兒童不適宜的內(nèi)容,確保他們?cè)诨ヂ?lián)網(wǎng)上的安全體驗(yàn)。
  • 政治和宗教領(lǐng)域:政府和宗教組織也使用DFA算法來(lái)檢測(cè)和替換具有沖突性的言論,以維護(hù)社會(huì)和諧。

優(yōu)勢(shì)與挑戰(zhàn)

優(yōu)勢(shì):ty228資訊網(wǎng)——每日最新資訊28at.com

  • 高效性:DFA算法能夠快速處理大量的文本數(shù)據(jù),使其在實(shí)時(shí)應(yīng)用中具有優(yōu)勢(shì)。
  • 可擴(kuò)展性:可以根據(jù)需要輕松擴(kuò)展敏感字詞列表。
  • 精確性:算法的確定性保證了替換的準(zhǔn)確性。

挑戰(zhàn):ty228資訊網(wǎng)——每日最新資訊28at.com

  • 敏感字庫(kù)維護(hù):需要不斷更新和維護(hù)敏感字庫(kù),以適應(yīng)新出現(xiàn)的敏感詞匯。
  • 多語(yǔ)言支持:不同語(yǔ)言的敏感字替換需要額外的處理。
  • 性能優(yōu)化:隨著輸入文本長(zhǎng)度的增加,算法的性能可能會(huì)下降。

總的來(lái)說(shuō),DFA算法在替換敏感字領(lǐng)域具有廣泛的應(yīng)用,為網(wǎng)絡(luò)社區(qū)、金融機(jī)構(gòu)、政府和其他領(lǐng)域提供了一種強(qiáng)大工具,用于過(guò)濾和替換敏感信息,維護(hù)社會(huì)秩序,保護(hù)用戶的隱私,以及確保互聯(lián)網(wǎng)上的安全和和諧。隨著技術(shù)的不斷發(fā)展,DFA算法將繼續(xù)發(fā)揮重要作用,以適應(yīng)不斷變化的需求和挑戰(zhàn)。ty228資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-15314-0.htmlDFA算法,高效實(shí)現(xiàn)敏感詞檢測(cè)與替換!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: OpenJDK JCov-測(cè)試你的代碼覆蓋率

下一篇: 微博二面:所有對(duì)象都一定被分配在堆中么?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Redmi Buds 4開(kāi)箱簡(jiǎn)評(píng):才199還有降噪 可以無(wú)腦入

    在上個(gè)月舉辦的Redmi Note11T Pro系列新機(jī)發(fā)布會(huì)上,除了兩款手機(jī)新品之外,Redmi還帶來(lái)了兩款TWS真無(wú)線藍(lán)牙耳機(jī)產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們?cè)赗edmi Note11T
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開(kāi)發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來(lái)看看 Node.js 最新的生
  • 微信語(yǔ)音大揭秘:為什么禁止轉(zhuǎn)發(fā)?

    大家好,我是你們的小米。今天,我要和大家聊一個(gè)有趣的話題:為什么微信語(yǔ)音不可以轉(zhuǎn)發(fā)?這是一個(gè)我們經(jīng)常在日常使用中遇到的問(wèn)題,也是一個(gè)讓很多人好奇的問(wèn)題。讓我們一起來(lái)揭開(kāi)這
  • JavaScript學(xué)習(xí) -AES加密算法

    引言在當(dāng)今數(shù)字化時(shí)代,前端應(yīng)用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經(jīng)常在前端進(jìn)行加密和解密操作。然而,這樣的操作在網(wǎng)絡(luò)傳輸和存儲(chǔ)中可能會(huì)受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開(kāi)https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項(xiàng)目,添加 Spring Web 依賴項(xiàng),并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請(qǐng)?jiān)谶M(jìn)入步驟2之前進(jìn)行解壓。圖
  • 雅柏威士忌多款單品價(jià)格大跌,泥煤頂流也不香了?

    來(lái)源 | 烈酒商業(yè)觀察編 | 肖海林今年以來(lái),威士忌市場(chǎng)開(kāi)始出現(xiàn)了降溫跡象,越來(lái)越多不斷暴漲的網(wǎng)紅威士忌也開(kāi)始悄然回歸市場(chǎng)理性。近日,LVMH集團(tuán)旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰(shuí)能笑到最后?

    作者:無(wú)銹缽來(lái)源:財(cái)經(jīng)無(wú)忌7月16日晚,上海1862時(shí)尚藝術(shù)中心。伴隨著幻象的精準(zhǔn)命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊(duì)以絕對(duì)的優(yōu)勢(shì)戰(zhàn)勝了BLG戰(zhàn)隊(duì),拿下了總決
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
  • iQOO Neo8 Pro真機(jī)諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價(jià)位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時(shí)隔半年后,
Top