在当前的网络环境下,敏感词过滤已经是各大网站的“标准配置”,如果不想被大量的垃圾信息充斥,除了使用机器人识别、验证码等验证工具,还需要阻止含有敏感词内容的发布,否则可能面临关站等风险,可谓是国内互联网的红线。

布隆过滤器

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

敏感词的过滤,在编程中最常见的方法是敏感词库数组遍历匹配,如果敏感词在文本中出现,则视为违规。本文将介绍基于分词技术和布隆过滤器实现的敏感词检测。相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数(O(k))。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。除了敏感词过滤,布隆过滤器还有以下应用场景:

  1. 字处理软件中,需要检查一个英语单词是否拼写正确
  2. 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上
  3. 在网络爬虫里,一个网址是否被访问过
  4. yahoo, gmail等邮箱垃圾邮件过滤功能

布隆过滤器的原理

布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k

以上图为例,具体的操作流程:假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。

基于Java的编程实现

Google提供的guava核心库中,提供了布隆过滤器的实现。其中的敏感词库文件,可以参考:https://github.com/tenstone/textfilter

@Service
public class BloomFilterService {private BloomFilter<String> configuredFilter;private final BloomFilter<String> filter = BloomFilter.create(new Funnel<String>() {private static final long serialVersionUID = 1L;@Overridepublic void funnel(String arg0, PrimitiveSink arg1) {arg1.putString(arg0, Charsets.UTF_8);}}, 1024*1024*32);/*** 读取带敏感词的布隆过滤器** @return* @throws IOException*/public BloomFilter<String> getSensitiveWordsFilter() throws IOException {InputStreamReader read = null;BufferedReader bufferedReader = null;read = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("SensitiveWords.txt"), StandardCharsets.UTF_8);bufferedReader = new BufferedReader(read);for (String txt = null; (txt = bufferedReader.readLine()) != null; ) {filter.put(txt);}this.configuredFilter = filter;return filter;}/*** 判断一段文字中,是否包含敏感词** @param segments* @return*/public Boolean segmentSensitiveFilterPassed(String[] segments) {if(configuredFilter == null){try {getSensitiveWordsFilter();}catch (IOException e){e.printStackTrace();}}Segment shortestSegment = new DijkstraSegment().enableCustomDictionary(false).enablePlaceRecognize(true).enableOrganizationRecognize(true);for(String segment :segments){List<Term> termList =  shortestSegment.seg(segment);for (Term term :termList){// 如果布隆过滤器中找到了对应的词,则认为敏感检测不通过if(configuredFilter.mightContain(term.word)){log.info("检测到敏感词:"+term.word);throw new RuntimeException("检测到敏感词");}}}return true;}

基于布隆过滤器实现敏感词识别和过滤 1相关推荐

  1. 基于布隆过滤器实现敏感词识别和过滤

    在当前的网络环境下,敏感词过滤已经是各大网站的"标准配置",如果不想被大量的垃圾信息充斥,除了使用机器人识别.验证码等验证工具,还需要阻止含有敏感词内容的发布,否则可能面临关站等风 ...

  2. 基于ik分词器和布隆过滤器实现敏感词过滤

    文章目录 准备阶段 为何选用IK Analyzer 什么是布隆过滤器 开发过程 整合Ik 总结 <基于ik分词器和布隆过滤器实现敏感词过滤>首发 牧马人博客转发请加此提示 最近公司业务有个 ...

  3. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  4. 贴吧评论敏感词识别及情感分析初级实现之评论获取

    贴吧评论敏感词识别及情感分析初级实现之评论获取 分三个模块实现贴吧评论敏感词识别及情感分析研究:"评论爬虫抓取"."评论敏感词识别"."评论情感分析( ...

  5. dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例

    一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...

  6. 敏感词或关键词过滤,DFA算法详解及python代码实现

    一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...

  7. REDIS13_缓存雪崩、缓存穿透、基于布隆过滤器解决缓存穿透的问题、缓存击穿、基于缓存击穿工作实际案例

    文章目录 ①. 缓存雪崩 ②. 缓存穿透 ③. 在centos7下布隆过滤器2种安装方式 ④. 缓存击穿 ⑤. 高并发的淘宝聚划算案例落地 ①. 缓存雪崩 ①. 问题的产生:缓存雪崩是指缓存数据大批量 ...

  8. php mysql敏感词_php查找/过滤一段文字中的违禁词敏感词

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); $words=array('我','你','他'); $content="测 ...

  9. 基于PaddleOCR和ToolGood.Words测试从图片中检测敏感词

      <测试.net开源敏感词检测库ToolGood.Words>介绍了基于ToolGood.Words实现敏感词检测的基本用法,而之前学习过使用PaddleOCR测试图片文字识别,于是想结 ...

  10. 敏感词过滤器 filter

    敏感词过滤器 filter /*** 敏感词过滤器*/ public class SensitiveWordsFilter implements Filter {// 敏感词列表private Str ...

最新文章

  1. T-SQL查询进阶--详解公用表表达式(CTE)
  2. linux6用户t密码,linux系统 用户和组管理类命令的使用方法
  3. 新站SEO优化如何吸引搜索引擎蜘蛛的爬行?
  4. dataframe在groupby之后,选其中的某列作为画图的新index
  5. C# 空合并运算符 ??
  6. Go语言 命令行解析(二)
  7. 怎样在CentOS 7.0上安装和配置VNC服务器
  8. Java学习 第三章 数组(一)一维数组
  9. c语言 画函数,c语言绘制函数曲线
  10. 为什么要在网站上主动放置沃通全球可信网站认证标志
  11. 2020全球开源基础设施技术峰会分享 | 自研软硬一体化加速方案
  12. 2021年专接本计算机院校,2021年专接本各类招生院校汇总
  13. EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS的删除创建
  14. 虚拟机服务器被攻击,Linux服务器被攻击用来挖矿了
  15. 用python画的基本知识_Opencv-python画图基础知识
  16. ASIHTTPRequest報錯解決辦法
  17. java jacob api_jacob使用入门 | 学步园
  18. 如何自动生成论文目录
  19. 老调重弹:JDBC系列 之 存储过程 CallableStatement(创建和使用)
  20. STM32物联网通信WIFI

热门文章

  1. 机器学习应用——导学part
  2. ubuntu内存不足时,扩展内存方法(亲测有效)
  3. vnc远程连接,5步实现vnc远程连接
  4. (知乎)男生 25 岁了,应该明白哪些道理?
  5. 离散数学---循环群,左陪集,子群
  6. ERP实施技巧:用正确的方法做正确的事
  7. qpython3.7.4版本下载_QPython3app下载
  8. d盘不见了 计算机打不开,D盘不见了怎么找回 电脑D盘没了解决方法
  9. 让你一目了然的商业计划书
  10. 线性方程组(四)- 矩阵方程