敏感词的检测与替换,是一个很常见的需求,因此搜了下网上的大致实现方案,这里简单整理下。

  • 简单替换
  • 正则替换
  • DFA
  • 基于朴素贝叶斯分类算法

简单替换

string = "hello world"
string.replace("o wo", "***")

类似于上面的代码,我们会使用一个敏感词列表,来对目标字符串进行检测与替换,比较适合于敏感词列表和待检测目标字符串都比较小的场景。

正则替换

re.sub("|".join(keywords), "***", text)

非要扒开来说,和上面的正则替换是类似的,只不过用了专门的 re 库来做,效率会高一点。本质上没什么大的变化。

DFA

典型范例:Trie树。我去年有幸用python写了一个比较low的版本。不适用于中文场景,然后今日看了hutaishi的代码,觉得不赖,拿过来改了改,以后或许会用得到。

import java.util.HashMap;
import java.util.Map;/***  前缀树实现*  特点:*    1. 根节点不包含字符,除根节点外每一个子节点都包含一个字符*    2. 从根节点到某一个节点,路径即为对应的单词*    3. 每个节点的所有子节点包含的字符各不相同*    4. 从第一字符开始有连续重复的字符只占用一个节点,如to,ten,第一个节点都是t*    *  应用:*    1. 前缀匹配*    2. 字符串检索*    3. 词频统计*    4. 字符串排序?第一次知道还有这么个功能。*/
public class TrieTree {// 根节点private TrieNode rootNode = new TrieNode();// 判断是否为一个符号private boolean isSymbol(char c) {int ic = (int)c;// 0x2e80 - 0x9fff 东亚文字范围 忽略用Apache的CharUtils的工具判断return !(ic>0x2e80 && ic<0x9fff);}private void addWord(String lineText) {TrieNode temNode = rootNode;for(int i=0; i<lineText.length(); i++) {Character c = lineText.charAt(i);if(isSymbol(c)) {continue;}TrieNode node = temNode.getSubNode(c);if (node == null) {node = new TrieNode();temNode.addSubNode(c, node);}temNode = node;if(i == lineText.length()-1) {temNode.setKeywordEnd(true);}}}public String filter(String text) {if("".equals(text)) {return text;}String replacement = "***";StringBuilder result = new StringBuilder();TrieNode temNode = rootNode;int begin = 0; // 开始指针int position = 0; // 位移指针while(position < text.length()) {char c = text.charAt(position);// 空格或者非东亚文字并且不是字母字符直接跳过if(isSymbol(c)) {if (temNode == rootNode) {result.append(c);begin++;}position++;continue;}temNode = temNode.getSubNode(c);if(temNode == null) {// 以begin开始的字符串不会存在敏感字符result.append(text.charAt(begin));// 跳到下一个字符进行测试position = begin + 1;begin = position;// 回到前缀树的根节点temNode = rootNode;} else if(temNode.isKeywordEnd()) {// 发现敏感词,从begin到position的位置进行替换result.append(replacement);position ++;begin = position;temNode = rootNode;} else {++position;}}result.append(text.substring(begin));return result.toString();}public static void main(String[] args) {TrieTree tree = new TrieTree();tree.addWord("赌博");tree.addWord("春天来了");System.out.println(tree.filter("春"));System.out.println(tree.filter("春夏秋冬"));System.out.println(tree.filter("黄赌博"));System.out.println(tree.filter("春天"));System.out.println(tree.filter("冬天来了,春天来了,夏天还会远吗"));}class TrieNode{private boolean end = false;private Map<Character, TrieNode> subNodes = new HashMap<Character, TrieNode>();void addSubNode(Character key, TrieNode node) {subNodes.put(key, node);}TrieNode getSubNode(Character key) {return subNodes.get(key);}boolean isKeywordEnd() {return end;}void setKeywordEnd(boolean end) {this.end = end;}public int getSubNodeCount() {return this.subNodes.size();}}}

运行结果如下:

春
春夏秋冬
黄***
春天
冬天来了,***,夏天还会远吗

这个应该算是一个比较不错的范例了,实操性比较强。

朴素贝叶斯分类算法

写过一个使用朴素贝叶斯分类算法实现的一个敏感词检测的程序,没有应用到线上环境,所以不敢保证准确度。更为关键的是:

先验概率很重要,也就是初识敏感词列表要有很高的准确度才可以。

链接如下:Golang+PHP朴素贝叶斯分类 敏感词检测

小结

忘了是听谁说的了,人不可能学会所有知识,但整理、总结会让智慧得到升华。这里整理了网上常见的敏感词检测相关的内容,肯定还有没写进来的好的方案,到时候遇到了再来补充。


参考链接:
1 https://www.jianshu.com/p/c124b0d6ebb0
2 https://my.oschina.net/hutaishi/blog/885356

整理的敏感词解决思路相关推荐

  1. 【敏感词检测】用DFA构建字典树完成敏感词检测任务

    任务概述 敏感词检测是各类平台对用户发布内容(UGC)进行审核的必做任务. 对于文本内容做敏感词检测,最简单直接的方法就是规则匹配.构建一个敏感词词表,然后与文本内容进行匹配,如发现有敏感词,则提交报 ...

  2. JavaWeb-过滤器Filter学习(四)敏感词过滤实例

    通过Filter来实现留言板的敏感词过滤- 思路很简单,我们这里的敏感词是直接先放进去的,实际项目中,肯定是存在数据库中.在Filter 过滤器中,我们先拿到用户提交的留言,如果出现了敏感词,我们就用 ...

  3. 如何从视频聊天软件源码下手,解决敏感词屏蔽问题

    视频聊天平台鱼龙混杂,用户素质良莠不齐,时常会出现用户名中出现的不雅字符.聊天室内出现不和谐文字的情况,因此在用户每次发言时,视频聊天软件源码都会自动对其文字进行验证,通过匹配"脏字库&qu ...

  4. 汉字转拼音 敏感词过滤 禁用词查找 提高程序效率另外一种思路:反向思维

    汉字转拼音 敏感词过滤 禁用词查找 这些很常用的互联网需求 大家出道时是怎么做的? 大家偷懒时是怎么做的? 常规算法 - 从数据库到用户提交内容去匹配: 把数据库中所有数据压到大数组中(这时数据越多, ...

  5. PHP敏感词过滤【整理实践版】

    2019独角兽企业重金招聘Python工程师标准>>> 由于国内互联网管制政策,强大的敏感词过滤系统成为了每一个网站必须具备的基本功能,尤其是那些涉及UGC内容的站点. 对敏感词过滤 ...

  6. php 对全角字符的过滤,php在做敏感词过滤时怎么解决用特殊符号分割、简繁体、半角全角,来绕开过滤的问题?...

    彻底地过滤敏感词 回复内容: 彻底地过滤敏感词 过滤和谐词其实并不是一个好策略,有一万种说出敏感词的方法,就一定会有第一万零一种,如果你反复设置程序去和谐这些词,最后会发现,你的会员连最基本的一些话都 ...

  7. 游戏敏感词屏蔽词过滤

    游戏和网站,都需要敏感词(屏蔽词)过滤,你懂的.而且敏感词库不断的增长,从十几年前的3000多词,已经增长到14000以上(各渠道获取的词库略有不同). 这1万多词的扫描处理,开销的性能就有点客观了. ...

  8. AC自动机:多模式串匹配实现敏感词过滤

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能.例如将一些淫秽.反动内容过滤 ...

  9. Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的.今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚. 敏感词匹配这种治标不治本的方法,在一 ...

  10. 敏感词过滤程序编写敏感词过滤程序

    敏感词过滤程序编写敏感词过滤程序 前言 Java程序设计语言课程让我们2-3人一个小组,找一个能用集合解决的问题进行介绍.说明,于是我们就找到了这道题目. 一.题目要求 编写敏感词过滤程序编写敏感词过 ...

最新文章

  1. java的rsa作用_java 中RSA的方式实现非对称加密的实例
  2. android RadioGroup设置某一个被选中
  3. UIColor and components
  4. cifar-10 cnn 分类
  5. 34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像
  6. 每天CookBook之JavaScript-072
  7. 【STM32】位带原理分析和应用
  8. Go非阻塞channel的常见写法
  9. 离线配置xml的文档类型定义文件(xml语法规则) dtd
  10. enas 参数共享_CVPR2020 | CARS: 华为提出基于进化算法和权值共享的神经网络结构搜索,CIFAR10上仅需单卡半天...
  11. Linux版本的安装文件jdk,tomcat
  12. OCR文字识别技术总结(三)
  13. HashMap分拣存储示例
  14. 细说PHP(精要版)
  15. M语言中的操作符说明:数字以及时间相关的操作符
  16. 罗斯蒙特8712ESR1A1N0M4流量变送器
  17. 西门子PLCSIM仿真PLC的网口连接与设置
  18. vue3 web项目引入高拍仪
  19. Infer的安装及基本使用
  20. protected使用总结

热门文章

  1. 汇编语言程序设计--基于ARM
  2. SEOBOOK中文电子书-SEO基础教程
  3. 【win】全屏、窗口化、动态修改分辨率和获取屏幕支持的所有分辨率
  4. 动软代码生成器 模板
  5. BXP无盘Windows XP网吧系统好处(转)
  6. 使用easyExcel导出excel数据案例
  7. winrar4.2 破解 注册码
  8. elasticjob接入方式和管理端使用
  9. LitePal的使用
  10. 股票分析软件 php,哪个股票分析软件最好用?