欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot集成sensitive-word實(shí)現(xiàn)敏感詞過濾的兩種方案

 更新時(shí)間:2024年08月16日 15:24:40   作者:Mr朱墨  
敏感詞過濾通常是指從文本中檢測(cè)并移除或替換掉被認(rèn)為是不適當(dāng)、冒犯性或違反特定社區(qū)準(zhǔn)則的詞匯,這篇文章主要介紹了springboot集成sensitive-word實(shí)現(xiàn)敏感詞過濾,需要的朋友可以參考下

敏感詞過濾

敏感詞過濾通常是指從文本中檢測(cè)并移除或替換掉被認(rèn)為是不適當(dāng)、冒犯性或違反特定社區(qū)準(zhǔn)則的詞匯。這個(gè)過程常用于在線平臺(tái)、論壇、社交媒體和聊天系統(tǒng)等,以確保交流環(huán)境的健康和積極.

方案一:正則表達(dá)式

實(shí)現(xiàn)敏感詞過濾.只適合于敏感詞較少、文本量較少的場(chǎng)合,并且無法處理同音字、錯(cuò)別字等,案例:

public static void main(String[] args) {
        String text = "這是一個(gè)包含敏感詞匯的文本,例如色情、賭博等。";
        String[] sensitiveWords = {"色情", "賭博"};
        for (String word : sensitiveWords) {
            text = filterSensitiveWords(text, word);
        }
        System.out.println("過濾后的文本: " + text);
        testSensitiveWordFrame();
    }
    /**
     * 方案一:正則表達(dá)式實(shí)現(xiàn)敏感詞過濾.只適合于敏感詞較少、文本量較少的場(chǎng)合,并且無法處理同音字、錯(cuò)別字等.
     *
     * @param text
     * @param sensitiveWord
     * @return
     */
    public static String filterSensitiveWords(String text, String sensitiveWord) {
        Pattern pattern = Pattern.compile(sensitiveWord);
        Matcher matcher = pattern.matcher(text);
        return matcher.replaceAll("***");
    }

方案二:基于DFA算法的敏感詞過濾工具框架-sensitive-word

 * 6W+ 詞庫,且不斷優(yōu)化更新
 * 基于 DFA 算法,性能較好
 * 基于 fluent-api 實(shí)現(xiàn),使用優(yōu)雅簡(jiǎn)潔
 * 支持敏感詞的判斷、返回、脫敏等常見操作
 * 支持全角半角互換
 * 支持英文大小寫互換
 * 支持?jǐn)?shù)字常見形式的互換
 * 支持中文繁簡(jiǎn)體互換
 * 支持英文常見形式的互換
 * 支持用戶自定義敏感詞和白名單
 * 支持?jǐn)?shù)據(jù)的數(shù)據(jù)動(dòng)態(tài)更新,實(shí)時(shí)生效

springboot集成sensitive-word

步驟一:引入pom

<dependency>
	<groupId>com.github.houbb</groupId>
	<artifactId>sensitive-word</artifactId>
	<version>0.2.0</version>
</dependency>

步驟二:自定義配置

@Configuration
public class MySensitiveWordBs {
    @Autowired
    private MyWordAllow myWordAllow;
    @Autowired
    private MyWordDeny myWordDeny;
    @Autowired
    private MyWordReplace myWordReplace;
    /**
     * 初始化引導(dǎo)類
     *
     * @return 初始化引導(dǎo)類
     * @since 1.0.0
     */
    @Bean
    public SensitiveWordBs sensitiveWordBs() {
        SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
//                .wordAllow(WordAllows.chains(WordAllows.defaults(), myWordAllow)) // 設(shè)置多個(gè)敏感詞,系統(tǒng)默認(rèn)和自定義
//                .wordDeny(WordDenys.chains(WordDenys.defaults(), myWordDeny))     // 設(shè)置多個(gè)敏感詞,系統(tǒng)默認(rèn)和自定義
                .wordAllow(WordAllows.chains(myWordAllow))  // 自定義
                .wordDeny(WordDenys.chains(myWordDeny))     // 自定義
                .wordReplace(myWordReplace)                                        // 自定義替換規(guī)則
                .ignoreCase(true)           // 忽略大小寫
                .ignoreWidth(true)          // 忽略半角圓角
                .ignoreNumStyle(true)       // 忽略數(shù)字的寫法
                .ignoreChineseStyle(true)   // 忽略中文的書寫格式
                .ignoreEnglishStyle(true)   // 忽略英文的書寫格式
                .ignoreRepeat(true)         // 忽略重復(fù)詞
                .enableNumCheck(true)       // 是否啟用數(shù)字檢測(cè)。默認(rèn)連續(xù) 8 位數(shù)字認(rèn)為是敏感詞
                .enableEmailCheck(true)     // 是有啟用郵箱檢測(cè)
                .enableUrlCheck(true)       // 是否啟用鏈接檢測(cè)
                .init();
        return sensitiveWordBs;
    }
}

步驟三:自定義敏感詞+白名單

/**
 * 自定義非敏感詞
 * 注意每一行為一個(gè)非敏感詞,單行不能只包括空格,否則,也會(huì)把空格識(shí)別為非敏感詞
 */
@Component
@Slf4j
public class MyWordAllow implements IWordAllow {
    @Override
    public List<String> allow() {
        List<String> allowWords = new ArrayList<>();
        try {
            ClassPathResource resource = new ClassPathResource("myAllowWords.txt");
            Path myAllowWordsPath = Paths.get(resource.getUrl().toURI());
            allowWords = Files.readAllLines(myAllowWordsPath, StandardCharsets.UTF_8);
        } catch (IOException ioException) {
            log.error("讀取非敏感詞文件錯(cuò)誤:{}", ioException);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
        return allowWords;
    }
}
@Component
@Slf4j
public class MyWordDeny implements IWordDeny {
    @Override
    public List<String> deny() {
        List<String> denyWords = new ArrayList<>();
        try {
            ClassPathResource resource = new ClassPathResource("myDenyWords.txt");
            Path myAllowWordsPath = Paths.get(resource.getUrl().toURI());
            denyWords = Files.readAllLines(myAllowWordsPath, StandardCharsets.UTF_8);
        } catch (
                IOException ioException) {
            log.error("讀取敏感詞文件錯(cuò)誤:{}", ioException);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
        return denyWords;
    }
}
/**
 * 自定義敏感詞對(duì)應(yīng)的替換值.
 * 場(chǎng)景說明:有時(shí)候我們希望不同的敏感詞有不同的替換結(jié)果。比如【游戲】替換為【電子競(jìng)技】,【失業(yè)】替換為【靈活就業(yè)】。
 */
@Configuration
public class MyWordReplace implements IWordReplace {
    @Override
    public void replace(StringBuilder stringBuilder, final char[] rawChars, IWordResult wordResult, IWordContext wordContext) {
        String sensitiveWord = InnerWordCharUtils.getString(rawChars, wordResult);
        if ("zhupeng".equals(sensitiveWord)) {
            stringBuilder.append("朱鵬");
        } else {
            // 其他默認(rèn)使用 * 代替
            int wordLength = wordResult.endIndex() - wordResult.startIndex();
            for (int i = 0; i < wordLength; i++) {
                stringBuilder.append('-');
            }
        }
    }
}

步驟四:核心方法測(cè)試

public class SensitiveWordController {
    @Autowired
    private MyWordReplace myWordReplace;
    @Autowired
    private SensitiveWordBs sensitiveWordBs;
    private static final String text = "五星紅旗迎風(fēng)飄揚(yáng),毛主席的畫像屹立在天安門前,zhuzhuhzu";
    @GetMapping("/pattern")
    public void testSensitiveWord2() {
        String text = "這是一個(gè)包含敏感詞匯的文本,例如色情、賭博等。";
        String[] sensitiveWords = {"色情", "賭博"};
        for (String word : sensitiveWords) {
            text = filterSensitiveWords(text, word);
        }
        System.out.println("過濾后的文本: " + text);
    }
    /**
     * 方案二:基于DFA算法的敏感詞過濾工具框架-sensitive-word:https://github.com/houbb/sensitive-word
     * 6W+ 詞庫,且不斷優(yōu)化更新
     * 基于 DFA 算法,性能較好
     * 基于 fluent-api 實(shí)現(xiàn),使用優(yōu)雅簡(jiǎn)潔
     * 支持敏感詞的判斷、返回、脫敏等常見操作
     * 支持全角半角互換
     * 支持英文大小寫互換
     * 支持?jǐn)?shù)字常見形式的互換
     * 支持中文繁簡(jiǎn)體互換
     * 支持英文常見形式的互換
     * 支持用戶自定義敏感詞和白名單
     * 支持?jǐn)?shù)據(jù)的數(shù)據(jù)動(dòng)態(tài)更新,實(shí)時(shí)生效
     */
    @GetMapping("/filter")
    public void testSensitiveWord() {
        System.out.println("SensitiveWordHelper.contains(text) = " + SensitiveWordHelper.contains(text));
        System.out.println("SensitiveWordHelper.findAll(text) = " + SensitiveWordHelper.findAll(text));
        System.out.println("SensitiveWordHelper.replace(text,myWordReplace) = " + SensitiveWordHelper.replace(text, myWordReplace));
        // 如果自定義敏感詞,不要使用SensitiveWordHelper的方法,要使用SensitiveWordBs
        System.out.println("sensitiveWordBs.contains(text) = " + sensitiveWordBs.contains(text));
        System.out.println("sensitiveWordBs.findAll(text) = " + sensitiveWordBs.findAll(text));
        System.out.println("sensitiveWordBs.replace(text) = " + sensitiveWordBs.replace(text));
    }
}

到此這篇關(guān)于springboot集成sensitive-word實(shí)現(xiàn)敏感詞過濾的文章就介紹到這了,更多相關(guān)springboot敏感詞過濾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作

    java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作

    這篇文章主要介紹了java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    這篇文章主要為大家介紹了Java開啟JMX遠(yuǎn)程監(jiān)控的服務(wù)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式

    關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式

    這篇文章主要介紹了關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 一篇文章搞定數(shù)據(jù)庫連接池

    一篇文章搞定數(shù)據(jù)庫連接池

    數(shù)據(jù)庫連接池在編寫應(yīng)用服務(wù)是經(jīng)常需要用到的模塊,太過頻繁的連接數(shù)據(jù)庫對(duì)服務(wù)性能來講是一個(gè)瓶頸,使用緩沖池技術(shù)可以來消除這個(gè)瓶頸,本文就來介紹Java常見的幾種,感興趣的可以了解一下
    2021-07-07
  • IntelliJ IDEA中新建Java class的解決方案

    IntelliJ IDEA中新建Java class的解決方案

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中新建Java class的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • jvm中指定時(shí)區(qū)信息user.timezone問題及解決方式

    jvm中指定時(shí)區(qū)信息user.timezone問題及解決方式

    同一份程序使用時(shí)間LocalDateTime類型,在國(guó)內(nèi)和國(guó)外部署后,返回的時(shí)間信息前端使用出問題,這篇文章主要介紹了jvm中指定時(shí)區(qū)信息user.timezone問題及解決方法,需要的朋友可以參考下
    2023-02-02
  • IDEA中添加xml配置文件時(shí),顯示file問題

    IDEA中添加xml配置文件時(shí),顯示file問題

    這篇文章主要介紹了IDEA中添加xml配置文件時(shí),顯示file問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 在idea中設(shè)置項(xiàng)目編碼格式為UTF-8的操作方法

    在idea中設(shè)置項(xiàng)目編碼格式為UTF-8的操作方法

    idea中的默認(rèn)編碼為GBK,在開發(fā)過程中一般將編碼格式改為UTF-8,所以本文給大家介紹了在idea中設(shè)置項(xiàng)目編碼為UTF-8的操作方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • java如何用遞歸生成樹形結(jié)構(gòu)

    java如何用遞歸生成樹形結(jié)構(gòu)

    作者分享了自己在使用腳本之家資源進(jìn)行編程時(shí)的經(jīng)驗(yàn),包括準(zhǔn)備實(shí)體對(duì)象、測(cè)試數(shù)據(jù)、構(gòu)造樹形結(jié)構(gòu)遞歸函數(shù)、測(cè)試以及輸出結(jié)果等步驟,作者希望這些經(jīng)驗(yàn)?zāi)軐?duì)大家有所幫助,并鼓勵(lì)大家支持腳本之家
    2025-03-03
  • 關(guān)于SSM框架下各層的解釋說明(Controller等)

    關(guān)于SSM框架下各層的解釋說明(Controller等)

    這篇文章主要介紹了關(guān)于SSM框架下各層的解釋說明(Controller等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論