基于布隆过滤器实现敏感词识别和过滤 1
在当前的网络环境下,敏感词过滤已经是各大网站的“标准配置”,如果不想被大量的垃圾信息充斥,除了使用机器人识别、验证码等验证工具,还需要阻止含有敏感词内容的发布,否则可能面临关站等风险,可谓是国内互联网的红线。
布隆过滤器
布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
敏感词的过滤,在编程中最常见的方法是敏感词库数组遍历匹配,如果敏感词在文本中出现,则视为违规。本文将介绍基于分词技术和布隆过滤器实现的敏感词检测。相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数(O(k))。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。除了敏感词过滤,布隆过滤器还有以下应用场景:
- 字处理软件中,需要检查一个英语单词是否拼写正确
- 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上
- 在网络爬虫里,一个网址是否被访问过
- 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相关推荐
- 基于布隆过滤器实现敏感词识别和过滤
在当前的网络环境下,敏感词过滤已经是各大网站的"标准配置",如果不想被大量的垃圾信息充斥,除了使用机器人识别.验证码等验证工具,还需要阻止含有敏感词内容的发布,否则可能面临关站等风 ...
- 基于ik分词器和布隆过滤器实现敏感词过滤
文章目录 准备阶段 为何选用IK Analyzer 什么是布隆过滤器 开发过程 整合Ik 总结 <基于ik分词器和布隆过滤器实现敏感词过滤>首发 牧马人博客转发请加此提示 最近公司业务有个 ...
- 一种基于DFA算法的敏感词检测JAVA程序片段
本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...
- 贴吧评论敏感词识别及情感分析初级实现之评论获取
贴吧评论敏感词识别及情感分析初级实现之评论获取 分三个模块实现贴吧评论敏感词识别及情感分析研究:"评论爬虫抓取"."评论敏感词识别"."评论情感分析( ...
- dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例
一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...
- 敏感词或关键词过滤,DFA算法详解及python代码实现
一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...
- REDIS13_缓存雪崩、缓存穿透、基于布隆过滤器解决缓存穿透的问题、缓存击穿、基于缓存击穿工作实际案例
文章目录 ①. 缓存雪崩 ②. 缓存穿透 ③. 在centos7下布隆过滤器2种安装方式 ④. 缓存击穿 ⑤. 高并发的淘宝聚划算案例落地 ①. 缓存雪崩 ①. 问题的产生:缓存雪崩是指缓存数据大批量 ...
- php mysql敏感词_php查找/过滤一段文字中的违禁词敏感词
//定义编码 header( 'Content-Type:text/html;charset=utf-8 '); $words=array('我','你','他'); $content="测 ...
- 基于PaddleOCR和ToolGood.Words测试从图片中检测敏感词
<测试.net开源敏感词检测库ToolGood.Words>介绍了基于ToolGood.Words实现敏感词检测的基本用法,而之前学习过使用PaddleOCR测试图片文字识别,于是想结 ...
- 敏感词过滤器 filter
敏感词过滤器 filter /*** 敏感词过滤器*/ public class SensitiveWordsFilter implements Filter {// 敏感词列表private Str ...
最新文章
- T-SQL查询进阶--详解公用表表达式(CTE)
- linux6用户t密码,linux系统 用户和组管理类命令的使用方法
- 新站SEO优化如何吸引搜索引擎蜘蛛的爬行?
- dataframe在groupby之后,选其中的某列作为画图的新index
- C# 空合并运算符 ??
- Go语言 命令行解析(二)
- 怎样在CentOS 7.0上安装和配置VNC服务器
- Java学习 第三章 数组(一)一维数组
- c语言 画函数,c语言绘制函数曲线
- 为什么要在网站上主动放置沃通全球可信网站认证标志
- 2020全球开源基础设施技术峰会分享 | 自研软硬一体化加速方案
- 2021年专接本计算机院校,2021年专接本各类招生院校汇总
- EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS的删除创建
- 虚拟机服务器被攻击,Linux服务器被攻击用来挖矿了
- 用python画的基本知识_Opencv-python画图基础知识
- ASIHTTPRequest報錯解決辦法
- java jacob api_jacob使用入门 | 学步园
- 如何自动生成论文目录
- 老调重弹:JDBC系列 之 存储过程 CallableStatement(创建和使用)
- STM32物联网通信WIFI