springboot集成sensitive-word实现敏感词过滤的两种方案

 更新时间:2024年08月16日 15:24:40   作者:Mr朱墨  
敏感词过滤通常是指从文本中检测并移除或替换掉被认为是不适当、冒犯性或违反特定社区准则的词汇,这篇文章主要介绍了springboot集成sensitive-word实现敏感词过滤,需要的朋友可以参考下

敏感词过滤

敏感词过滤通常是指从文本中检测并移除或替换掉被认为是不适当、冒犯性或违反特定社区准则的词汇。这个过程常用于在线平台、论坛、社交媒体和聊天系统等,以确保交流环境的健康和积极.

方案一:正则表达式

实现敏感词过滤.只适合于敏感词较少、文本量较少的场合,并且无法处理同音字、错别字等,案例:

public static void main(String[] args) {
        String text = "这是一个包含敏感词汇的文本,例如色情、赌博等。";
        String[] sensitiveWords = {"色情", "赌博"};
        for (String word : sensitiveWords) {
            text = filterSensitiveWords(text, word);
        }
        System.out.println("过滤后的文本: " + text);
        testSensitiveWordFrame();
    }
    /**
     * 方案一:正则表达式实现敏感词过滤.只适合于敏感词较少、文本量较少的场合,并且无法处理同音字、错别字等.
     *
     * @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+ 词库,且不断优化更新
 * 基于 DFA 算法,性能较好
 * 基于 fluent-api 实现,使用优雅简洁
 * 支持敏感词的判断、返回、脱敏等常见操作
 * 支持全角半角互换
 * 支持英文大小写互换
 * 支持数字常见形式的互换
 * 支持中文繁简体互换
 * 支持英文常见形式的互换
 * 支持用户自定义敏感词和白名单
 * 支持数据的数据动态更新,实时生效

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;
    /**
     * 初始化引导类
     *
     * @return 初始化引导类
     * @since 1.0.0
     */
    @Bean
    public SensitiveWordBs sensitiveWordBs() {
        SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
//                .wordAllow(WordAllows.chains(WordAllows.defaults(), myWordAllow)) // 设置多个敏感词,系统默认和自定义
//                .wordDeny(WordDenys.chains(WordDenys.defaults(), myWordDeny))     // 设置多个敏感词,系统默认和自定义
                .wordAllow(WordAllows.chains(myWordAllow))  // 自定义
                .wordDeny(WordDenys.chains(myWordDeny))     // 自定义
                .wordReplace(myWordReplace)                                        // 自定义替换规则
                .ignoreCase(true)           // 忽略大小写
                .ignoreWidth(true)          // 忽略半角圆角
                .ignoreNumStyle(true)       // 忽略数字的写法
                .ignoreChineseStyle(true)   // 忽略中文的书写格式
                .ignoreEnglishStyle(true)   // 忽略英文的书写格式
                .ignoreRepeat(true)         // 忽略重复词
                .enableNumCheck(true)       // 是否启用数字检测。默认连续 8 位数字认为是敏感词
                .enableEmailCheck(true)     // 是有启用邮箱检测
                .enableUrlCheck(true)       // 是否启用链接检测
                .init();
        return sensitiveWordBs;
    }
}

步骤三:自定义敏感词+白名单

/**
 * 自定义非敏感词
 * 注意每一行为一个非敏感词,单行不能只包括空格,否则,也会把空格识别为非敏感词
 */
@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("读取非敏感词文件错误:{}", 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("读取敏感词文件错误:{}", ioException);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
        return denyWords;
    }
}
/**
 * 自定义敏感词对应的替换值.
 * 场景说明:有时候我们希望不同的敏感词有不同的替换结果。比如【游戏】替换为【电子竞技】,【失业】替换为【灵活就业】。
 */
@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 {
            // 其他默认使用 * 代替
            int wordLength = wordResult.endIndex() - wordResult.startIndex();
            for (int i = 0; i < wordLength; i++) {
                stringBuilder.append('-');
            }
        }
    }
}

步骤四:核心方法测试

public class SensitiveWordController {
    @Autowired
    private MyWordReplace myWordReplace;
    @Autowired
    private SensitiveWordBs sensitiveWordBs;
    private static final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前,zhuzhuhzu";
    @GetMapping("/pattern")
    public void testSensitiveWord2() {
        String text = "这是一个包含敏感词汇的文本,例如色情、赌博等。";
        String[] sensitiveWords = {"色情", "赌博"};
        for (String word : sensitiveWords) {
            text = filterSensitiveWords(text, word);
        }
        System.out.println("过滤后的文本: " + text);
    }
    /**
     * 方案二:基于DFA算法的敏感词过滤工具框架-sensitive-word:https://github.com/houbb/sensitive-word
     * 6W+ 词库,且不断优化更新
     * 基于 DFA 算法,性能较好
     * 基于 fluent-api 实现,使用优雅简洁
     * 支持敏感词的判断、返回、脱敏等常见操作
     * 支持全角半角互换
     * 支持英文大小写互换
     * 支持数字常见形式的互换
     * 支持中文繁简体互换
     * 支持英文常见形式的互换
     * 支持用户自定义敏感词和白名单
     * 支持数据的数据动态更新,实时生效
     */
    @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));
    }
}

到此这篇关于springboot集成sensitive-word实现敏感词过滤的文章就介绍到这了,更多相关springboot敏感词过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot获取session的值为null问题及解决方法

    spring boot获取session的值为null问题及解决方法

    我在登陆的时候,登陆成功后将name存进了session,然后在获取个人信息时取出session里的name的值为null,接下来通过本文给大家分享springboot获取session的值为null问题,需要的朋友可以参考下
    2023-05-05
  • Java实现验证文件名有效性的方法详解

    Java实现验证文件名有效性的方法详解

    在本文中,我们将讨论使用 Java 验证一个给定的字符串是否具有操作系统的有效文件名的不同方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • Java @Scheduled定时器用法解析

    Java @Scheduled定时器用法解析

    这篇文章主要介绍了Java @Scheduled定时器用法解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • java处理字节的常用工具类

    java处理字节的常用工具类

    这篇文章主要为大家详细介绍了java处理字节的常用工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Maven打包没有指定主类问题(xxx.jar中没有主清单属性)

    Maven打包没有指定主类问题(xxx.jar中没有主清单属性)

    这篇文章主要介绍了Maven打包没有指定主类问题(xxx.jar中没有主清单属性),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 自定义log4j2中的Appender来获取日志内容的示例代码

    自定义log4j2中的Appender来获取日志内容的示例代码

    在 Log4j2 中,Appender 是负责将日志事件输出到目标地点的组件,本文讲述的是通过 log4j 中自定义的 Appender 来获取需要打印的日志信息,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-02-02
  • Spring中容器创建的四种方式示例

    Spring中容器创建的四种方式示例

    这篇文章主要介绍了Spring中容器创建的四种方式示例,Spring容器是Spring框架的核心部分,它负责管理和组织应用程序中的对象,它提供了一种轻量级的、非侵入式的方式来实现对象的创建、依赖注入和生命周期管理,需要的朋友可以参考下
    2023-10-10
  • Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    下面小编就为大家分享一篇Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Spring动态注册多数据源的实现方法

    Spring动态注册多数据源的实现方法

    这篇文章主要介绍了Spring动态注册多数据源的实现方法,小编觉的挺不错的,现分享到脚本之家平台,需要的朋友可以参考下
    2018-01-01
  • IDEA的maven设置代理方式

    IDEA的maven设置代理方式

    文章介绍了如何设置IntelliJ IDEA系统代理,并在Maven的Importing和Runner中添加代理配置,包括设置代理主机和端口
    2025-01-01

最新评论