文章目录
敏感词过滤
敏感词过滤通常是指从文本中检测并移除或替换掉被认为是不适当、冒犯性或违反特定社区准则的词汇。这个过程常用于在线平台、论坛、社交媒体和聊天系统等,以确保交流环境的健康和积极.
方案一:正则表达式
实现敏感词过滤.只适合于敏感词较少、文本量较少的场合,并且无法处理同音字、错别字等,案例:
publicstaticvoidmain(String[] args){String text ="这是一个包含敏感词汇的文本,例如色情、赌博等。";String[] sensitiveWords ={"色情","赌博"};for(String word : sensitiveWords){
text =filterSensitiveWords(text, word);}System.out.println("过滤后的文本: "+ text);testSensitiveWordFrame();}/**
* 方案一:正则表达式实现敏感词过滤.只适合于敏感词较少、文本量较少的场合,并且无法处理同音字、错别字等.
*
* @param text
* @param sensitiveWord
* @return
*/publicstaticStringfilterSensitiveWords(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>
步骤二:自定义配置
@ConfigurationpublicclassMySensitiveWordBs{@AutowiredprivateMyWordAllow myWordAllow;@AutowiredprivateMyWordDeny myWordDeny;@AutowiredprivateMyWordReplace myWordReplace;/**
* 初始化引导类
*
* @return 初始化引导类
* @since 1.0.0
*/@BeanpublicSensitiveWordBssensitiveWordBs(){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@Slf4jpublicclassMyWordAllowimplementsIWordAllow{@OverridepublicList<String>allow(){List<String> allowWords =newArrayList<>();try{ClassPathResource resource =newClassPathResource("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){thrownewRuntimeException(e);}return allowWords;}}
@Component@Slf4jpublicclassMyWordDenyimplementsIWordDeny{@OverridepublicList<String>deny(){List<String> denyWords =newArrayList<>();try{ClassPathResource resource =newClassPathResource("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){thrownewRuntimeException(e);}return denyWords;}}
/**
* 自定义敏感词对应的替换值.
* 场景说明:有时候我们希望不同的敏感词有不同的替换结果。比如【游戏】替换为【电子竞技】,【失业】替换为【灵活就业】。
*/@ConfigurationpublicclassMyWordReplaceimplementsIWordReplace{@Overridepublicvoidreplace(StringBuilder stringBuilder,finalchar[] 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('-');}}}}
步骤四:核心方法测试
publicclassSensitiveWordController{@AutowiredprivateMyWordReplace myWordReplace;@AutowiredprivateSensitiveWordBs sensitiveWordBs;privatestaticfinalString text ="五星红旗迎风飘扬,毛主席的画像屹立在天安门前,zhuzhuhzu";@GetMapping("/pattern")publicvoidtestSensitiveWord2(){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")publicvoidtestSensitiveWord(){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的方法,要使用SensitiveWordBsSystem.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));}}
本文转载自: https://blog.csdn.net/qq_21880261/article/details/141169987
版权归原作者 Mr朱墨 所有, 如有侵权,请联系我们删除。
版权归原作者 Mr朱墨 所有, 如有侵权,请联系我们删除。