成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

什么是DFA算法?

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

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)。

例如替換文本中的敏感詞:

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

敏感詞列表:["新視界", "新視野", "技術(shù)", "技術(shù)高峰", "編程夢(mèng)想", "實(shí)現(xiàn)夢(mèng)想"]

基于敏感詞,構(gòu)建森林:

基于森林,構(gòu)建JSON對(duì)象:

{
    "技":{
        "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世界的大門(mén)。實(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é)果:

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

  • 言論過(guò)濾:社交媒體平臺(tái)和在線(xiàn)論壇經(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)。這有助于確保用戶(hù)的隱私和數(shù)據(jù)安全。
  • 兒童保護(hù):兒童在線(xiàn)安全是一個(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ì):

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

挑戰(zhàn):

  • 敏感字庫(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ù)用戶(hù)的隱私,以及確保互聯(lián)網(wǎng)上的安全和和諧。隨著技術(shù)的不斷發(fā)展,DFA算法將繼續(xù)發(fā)揮重要作用,以適應(yīng)不斷變化的需求和挑戰(zhàn)。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2021-12-06 07:23:12

C# 過(guò)濾算法

2025-03-04 08:40:28

2009-08-07 15:54:51

敏感信息檢測(cè)系統(tǒng)UnisSISS

2023-11-13 22:17:54

YOLO-NAS目標(biāo)檢測(cè)

2025-03-17 08:00:00

2024-01-01 14:19:11

2024-07-16 12:54:40

2012-10-19 15:24:44

2024-06-26 09:13:03

2023-10-07 08:12:05

DAMO-YOLO算法

2023-04-26 08:24:46

DAMO-YOLO算法

2024-06-13 11:53:40

2013-09-12 13:23:06

2023-09-01 07:21:11

2024-07-02 10:04:09

2025-04-28 08:08:14

2021-05-10 11:53:13

頁(yè)面替換算法

2025-01-06 08:10:00

Redis跳表索引

2020-07-13 09:40:17

Linux 系統(tǒng) 數(shù)據(jù)

2017-12-26 15:48:24

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩三区| 国产日韩欧美一区二区 | 精品久久久久久久久亚洲 | 亚洲视频在线观看一区二区三区 | 一区二区三区福利视频 | 亚洲第一天堂无码专区 | 亚州中文| 日韩成人在线播放 | 毛片免费视频 | 日韩中文字幕在线不卡 | 亚洲国产小视频 | 欧美亚洲日本 | 久久男女视频 | 美日韩一区二区 | 九九综合 | 久久精品亚洲精品国产欧美 | 成人一区二区三区 | 国产精品视频久久久 | 夜夜骑综合 | 亚洲欧洲视频 | 天天久久 | 亚洲一区二区三区四区五区午夜 | 久久一区二区av | 久草福利| 日韩毛片免费看 | 欧美在线日韩 | 国产黄色大片 | 亚洲欧美综合 | 日本精品在线一区 | 欧美高清视频一区 | 久久久久午夜 | 91精品在线看| 欧美激情综合网 | 91在线资源| 欧美久久久网站 | 特级a欧美做爰片毛片 | 久久成人av电影 | 成人午夜免费在线视频 | 黄页网址在线观看 | 午夜a√ | 欧美一级电影免费 |