敏感词过滤算法实现

说到敏感词过滤,我也觉得这里没有必要写这个文章,因为前人已经前前后后有过很多种算法解决该问题。这里我之所以写这个文章,是因为我自己自创了一种算法(真的是自创哦,因为我在写这个算法的时候,完全是自己想出来的方式,没有借鉴任何代码!灵感来自于一篇文章中的一句话“如果能扫描一遍文本就能将所有的词找出来,那速度就是最快的”)。想法不周到或想得不周到,请大家砖头轻拍

 

背景

在网络日益发达的现在,也伴随着有益信息与造成不稳定因素的信息也随之日益泛滥,为了网民的思想健康,也为了社会的和谐,在许多对外公共场合下,有些内容是要经过审查才能显示的。在网络审查初期,都是通过人工审核,这种审核方式虽然准确且智能,但与网络文字产生的速度相比,其效率就显示微不足道了!因此,自动化的系统处理方式的需求越来越强烈……

目前拥有的处理方式

有需求就有市场,因此自动化处理的方式自然而然随之如雨后春笋般地迅速产生了一大批!其处理方式都是基于一点:敏感词库!然后基于该词库对目标文本进行敏感词提取操作,因此各自动化处理方式的唯一差别就在于敏感词提取算法的不同,因为算法不同,效率不同、结果也可能不同。而对于敏感词过滤算法来说,要掌握两个关键点:效率和准确率!效率就是对于大批量敏感词和长段的目标文本处理时要能在很短时间内响应;准确率就是对于一个敏感词要尽量区分语境,不能误将非敏感词判断为敏感词而过滤掉(如我们敏感词库的精确匹配与模糊匹配的定义)!
就我所知,目前较为流行且成熟的算法有:

简单文本搜索与替换

这种方式是最简单的,就是循环把每个敏感词在目标文本中从头到尾搜索一遍,如果有文本高亮或替换的话,那就找到一个就处理一个。这种方式的优缺点如下:

优点:
  1. 算法简单。对于开发人员来说,简单的算法会使代码实现上简单,开发难度最小!
    缺点:
  2. 效率太低。因为循环每个敏感词,所以当敏感词很多、目标文本很长时,其效率可以说是该算法的致命问题!
  3. 匹配准备率太低。比如,有一个敏感词为as,那它边hash、class等中的as都会被匹配甚至被处理。
    所以这个算法绝对不能使用!

传说中的DFA算法(亦称自动机算法)

上面的算法是以敏感词库为主体,对目标文本进行匹配,而这个算法是以目标文本为主体,其算法大概为:将所有敏感词构建为词图(即是将所有敏感词组织为一个图状关系,即,以任意一个字都可以查出以该字为开头的词),然后对文本进行逐一搜索并看每个字是否在图中存在,如果存在看是否有对应的词存在,如果存在,则匹配成功,记录下来,继续往下搜索直到搜索完整个文本!其详细的算法原理参见:http://wenku.baidu.com/view/2e9dad18a8114431b90dd896.html。

优点:
  1. 效率高于上面的算法;
缺点:
  1. 理论算法太过复杂,开发成本很大,而且网上没有该算法的源码或相应的包!而且该算法匹配率也比较低。再者就是该算法巨耗内存,而且启动很慢。

网友自创的TTMP算法(自称 字符串多模式精确匹配)

其算法主要原理为:
1、首先扫描文章里面的每一个字符,只有当某一个字符是脏字表中任意一个脏词的第一个字符(称为“起始符”),我们才试图看看接下来是否是脏字(触发检索)。
2、但是我们也不是毫无头绪的就开始循环脏字表的每一个词条:
2.1、我们往后检索一个字符,先看一下这个字符是否是脏字表里面的任意一个字符,如果不是,就表明不可能是脏字表中的任何一个条目,就可以退出了。
2.2、如果是,我们就取从第一个被检出字符到目前扫描到的字符之间的字符串,求哈希值,看看能否从哈希表中检出一个脏词。
如果检出了,那就大功告成,否则继续检索后面一个字符(重复2.1、2.2),直至找不到,或者超出脏字表条目最大的长度。
2.3、如果都找不到,或者超长,那么接下来就回到刚才的那个“起始符”后一个字符继续扫描(重复1、2),直至整个文章结束。
详细的算法说明参考:http://www.cnblogs.com/sumtec/archive/2008/02/01/1061742.html。

其它可查算法

其它查到的算法还有:KMP算法是单模匹配算法,BM据说也是单模式的算法,WM算法是多模匹配……好吧,我承认,到最后的时候,我没有耐心再看下去了,因为这些算法都说自己很厉害,可是却都没有放出具体完整的可用的算法程序出来!开发难度还是存在的,这些方法都不是我的菜

我设想的一个算法——基于分词组件结合向量相似运算

在无尽的苦海探寻的过程中,我的大学数学知识不断滴从的我意识深处涌了出来!我突然想起一个可能可行的办法:因为网络上有许多性能很不错的分词工具(jar包形式的也大有存在),而且大学时有一种向量算法可以计算两个向量间的相似度的能力,于是就想到是否可以使用向量算法来解决该问题。该算法的主体思想为:将所有敏感词构建为一个向量,再将目标文本用分词工具分成若干个词并构建成另一个向量,然后将这两个向量进行相似值计算,得出哪些向量元素相同,并最终得知该目标文本中存在哪些敏感词!
呃……看来我还是对不起祖国对不起党!我已经不记得相应的向量算法了,而且也没有找到一个计算两个向量元素之间相同的算法(因为向量的高级算法太多、太复杂了)!看来从我意识深处涌出来的只是一些影子~
所以,这只是一个设想,而非真正实现方案!

敏感词过滤算法(自命名:聚合词树查询法)

该算法基于DFA并结合许多算法并进行相应的简化,最终其算法基本原理为:将所有敏感词库按模块聚合构建成一个词树(所谓聚合,就是将相同字开头的部分进行聚合,以减少对词的查询范围,相当于建立敏感词索引,如:他奶奶的、他妈的、他娘的,这三个词,聚合构建成词树时,“他”字就是这三个词的索引,同时每个词的结尾都有一个结束标志和该词的一些描述,如敏感级别等),然后从头到尾扫描一遍目标文本,当遇到以敏感词树中的索引的字时,查看后面的文本是否构成敏感词(如果这里有以这个敏感词开头的更长的敏感词时,以更长的为匹配结果,并判断该词在文本中前后是否有分隔符来区别其匹配方式),如果是则记录,一遍扫描完之后所有敏感词即被扫描出来了!

结语

我的这个算法不一定是最好的,但相比较上面几种算法,从成本、效果等整体上来说是很合适的!另外网上还有许多一些未公开算法的过滤方式,这些算法因为无法获知其算法,而无法为我所借鉴,因此平添几许遗憾!另外还有著名的算法有:KMP算法是单模匹配算法,BM据说也是单模式的算法,WM算法是多模匹配(WM算法详细描述:http://blog.chinaunix.net/space.php?uid=20435679&do=blog&cuid=228430)的等等。
该方法还有许多可优化的空间,如可增加多线程、可优化判断已记录的词直接跳过不匹配等方式。
算法的效率要注意尽量满足两点:尽量少的扫描目标文本(包括尽量少的回扫目标文本),尽快能从敏感词库中找到指定的词!不断做到这两点,则效率就越高!

效率上还有提升空间

目前只是单线程的一种操作,而且算法实现的代码上可能还有一些小小的改进余地,如变量定义与数据结构的定义等方面的实现。

匹配能力较弱

不能对处理的关键词匹配,比如,“鸦 片”是一个敏感词的话,那如果用户刻意把它们分开,如写成“鸦$片”,那就无法匹配上了!

还可以运用于很多场景

运用的场景很多,如高亮指定的词、分词(可以指定以最长或最短模式匹配)、拼音与汉字间的转换等等字符串匹配功能!

注:附件中有两个文件,一个ppt,用于演示该算法的过程(用office2007打开效果最佳);一个是源代码;请大家自己浏览,谢谢!

 

现在想来,这个名称更贴切的应该叫“关键词快速查找算法”!——2013-04-17注

Java实现DFA算法对敏感词、广告词过滤功能 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图。完成了对敏感词、广告词的过滤,而且效率较好,所以分享一下。 具体实现: 1、匹配大小写过滤 2、匹配全角半角过滤 3、匹配过滤停顿词过滤。 4、敏感词重复词过滤。 阅读详情

相关推荐

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

一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 DFA,网上常译为确定有限自动机,俗话就是新数据在已有的数据基础上去有限次查找,比如:新数据为苹果公司年会,旧数据为苹果公司,这样就可以直接旧数据后面添加"年会"两个字. DFA算法思想是将敏感词组通过建立嵌套字典的方式去构建敏感词链表(以一个特定字符’\x00’作为结束),然后遍历新词的每个字是否出现在敏感词

qq_38796548的博客 5904

敏感词过滤及反垃圾文本的相关知识(欢迎收藏)

需求要求:社交平台文本敏感词过滤 先介绍一下敏感词词库 :1.funNLP 敏感词库: 2.chat-censorship 与聊天客户端审查调查相关的数据,此存储库包含关键字黑名单以及其他内容的列表,例如用于触发在中国使用的应用程序中的审查制度的URL或图像(应用包括:微博,微信,Line,skype) 3.网上整理的敏感词库及Java实现的代码 链接:https://pan.baidu.com/s/16HjeZUgmX-jRzutvfULXwA添加链接描述 提取码:9hme 如果失效请留言,谢谢。 敏

sexy19910923的博客 5077

Java实现敏感词过滤 - DFA算法

Java实现DFA算法进行敏感词过滤封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet); package cn.swfilter.util;import java.util.*;/** * 敏感词处理工具 - DFA算法实现 * * @author sam * @since 2017/9/4 */ publ

神奇Sam的博客 3670

敏感词过滤算法对比,顺便开源了个工具库

敏感词算法的对比 现在社区内敏感词算法大致实现有两种:DFA(Deterministic Finite Automaton 确定有穷自动机)算法和AC(Aho-Corasick自动机)算法,在掘金社区找到比较有代表性的两篇文章:《js实现敏感词过滤算法》和《开源了一个 JavaScript 版敏感词过滤库》 二者代码我都看了一下,从我角度上来做一个简单对比(其中DFA算法是在原作者基础上的一些改动...

weixin_45189747的博客 2159

iOS敏感词过滤,DFA算法的OC实现

最近给项目加个屏蔽敏感词的功能,在网上搜了一遍基本都是使用DFA算法由敏感词构造树,然后按照遍历输入文本,每次从树的根节点往下匹配,匹配成功则替换成*之类的即可,搜了一圈没有发现OC版的算法,故按着算法用OC写了一遍,分享一波。   类定义如下: #import "WordFilter.h" #define EXIST @"isExists" @interface WordFilter

Jali_li的博客 5634

敏感词检测理论算法过程

准备工作 环境和技术栈 Java、多线程广度优先算法、正则表达式、页面抓取等等​ 确认需要实现的功能 加载词库数据到Tire字典树中,用字典树存储词库,速度比较快 利用广度优先遍历抓取整站的数据 去除标签,获取每个页面的实际数据 对实际数据进行分词,得到分词-偏移量列表 将分词列表与Tire字典树进行对比,得到敏感词列表 再根据偏移量和词组情况,回归确定是否确认是敏感词,并根据结果判断是否报警 对敏感句子的识别 对敏感词拼音的识别 确认功能所需的解决方案 利用playwrite抓取页面 利用广.

xxx 3641

DFA算法实现 敏感词过滤

SensitiveWordInit 初始化敏感词库,将敏感词加入到HashMap中,构建DFA算法模型 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.HashMap; ...

xinyuan的专栏 1281

Java实现敏感词过滤算法源代码解析

敏感词通常指的是在特定语境中具有特殊含义或可能引发争议的词汇。它们可能包括政治性术语、粗俗语言、侮辱性表达、版权问题内容等。敏感词的分类依据应用场景的不同而有所区别,例如,在法律领域可能关注诽谤、版权侵犯等,而在企业环境中,则可能关注品牌声誉或内部保密协议的遵守。确定有限自动机(DFA)是一种数学模型,它能够识别正则语言。DFA由一系列状态(State)构成,并在输入字符的基础上进行状态转换。每个DFA具有以下特性:有限状态集。

weixin_35835018的博客 789

c语言敏感词检测算法,基于文本内容的敏感词决策树信息过滤算法

摘要:With the development of Internet,many negative effects come out as the exponential growth of various information resources,which means that a more secure and healthy network environment should be c...

weixin_39840635的博客 527

PD虚拟机安装CentOS7后必做的Parallels Tools配置指南(附常见错误解决)

本文详细指导在Mac的Parallels Desktop虚拟机中安装CentOS 7后如何高效配置Parallels Tools,包括环境准备、镜像挂载、依赖问题解决及性能优化。特别针对常见错误如挂载失败、依赖缺失等提供实用解决方案,帮助用户实现主机与虚拟机间的无缝交互和显示优化。

weixin_29288313的博客 302

带你一分钟了解电感与磁珠的区别

在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。

攻城狮鹏哥 1410

【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?

版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...

帅地 2万+

基于STM32的智能工业机器人臂控制系统

工业机器人臂是智能制造的核心组件,广泛应用于装配、焊接、搬运等任务。基于STM32微控制器的机器人臂控制系统,通过集成伺服电机驱动、运动规划算法和实时通信功能,实现对多轴机械臂的精确控制与路径规划。本设计通过STM32实现了一套智能工业机器人臂控制系统,集成了高效的运动规划算法和实时控制功能。机器人臂系统根据输入的目标位置(如工件坐标),通过运动学计算生成动作轨迹,利用伺服电机驱动器控制关节运动。该系统广泛应用于工业自动化场景,如汽车制造中的零件装配、电子产品生产中的元件焊接以及物流系统中的物料搬运。

stm32d1219的博客 2569

Java实现DFA算法实现敏感词过滤

DFA简介 在实现文字过滤的算法中,DFA是唯一比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。下图展示了其状态的转换 在这幅图中大写字母(S、U、V、Q)都是状态,小写字母a、b为动作。...

NewxCJY的博客 1150

24年电赛H题 | 想要小车走直线,正在调角度环,但不知道怎么把角度偏航角偏差转化成电机速度输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1316

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 179

DFA算法实现敏感词过滤

dfa、敏感词过滤

m0_73866527的博客 1111

基于Playwright与异步技术的公司评价智能爬取实战:以Glassdoor为例

本文将介绍一套基于最新Python技术的智能爬虫解决方案,使用Playwright实现浏览器自动化,结合异步编程和智能解析技术,高效抓取Glassdoor等平台的公司评价数据。我们不仅关注数据获取,更注重数据的结构化处理和反反爬虫策略的实现。

2201_76125261的博客 223

敏感词过滤算法的实现

最近一直在做项目,突然想起来好久没有写过博客了,于是就有了这篇博客。这篇博客的目的就是为了在自己忘记的时候可以快速捡起来。好了,废话不多说了,以下就是正文。 要从哪里讲起呢,先讲讲打算怎么做吧 这个算法是采用字典树(也就是多叉树)来存储敏感词,然后通过三个指针来对文本进行筛选,算了,我文字描述太差了,上图花的时间太多,直接上代码吧! 首先,需要定义一个字典树结构 private class TrieNode{ /** * 用来存储子节点 */

留下不学无术的眼泪 678

1位2路选择器设计

1位2路选择器设计

好好学习,天天向上 3579

Python 爬虫进阶:淘宝热卖商品价格走势抓取、反爬与分析全流程

在大数据时代,数据是商业决策的重要依据。电商平台上的商品价格走势,对于商家调整经营策略、消费者选择购买时机都有着关键的参考价值。本篇文章将深入解析如何利用 Python 爬虫抓取淘宝热卖商品的价格走势数据,并应对其中的反爬机制,最后对数据进行分析,带领大家领略 Python 爬虫在电商领域的强大应用。

yansideyucsdn的博客 1059

java实现敏感词过滤(DFA算法)

java实现敏感词过滤(DFA算法) </h1> <div class="clear"></div> <div class="postBody"> 小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过...

qq_21304127的博客 391

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

js实现提交评论等行为是过滤敏感词汇DFA算法

前言 近期在写一些评论功能的时候想到了为了防止某些用户恶意评论以及政治敏感,涉及法律等问题,需要对用户提交的评论进行过滤操作,查询了一些资料,在此记录下自己的解决方案。 阐述 DFA是一种计算模型(Deterministic Finite Automaton)也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。由此逐步构建...

xjl271314的博客 2692

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于DFA算法实现过滤敏感词

该篇文章主要是记录我在实现铭感词过滤的实现, 通常我们如果对于敏感词过滤的话,首先想到的肯定是,把敏感词库制成一个数组或List,然后循环查询该list或数组,然后判断该次循环的敏感词是否在传入的字符串中,这种方法我们一看就知道很浪费时间与内存。 那么我们看看DFA算法(执行速度很快不需要我们异步判断处理):

落尘 4338

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

敏感词过滤(DFA算法)PHP实现

前言 最近项目需要用到敏感词过滤功能,最开始想的是使用正则匹配和mysql存储敏感词来对敏感词来进行过滤操作,但是这两种方法都感觉不好。大家都知道正则性能问题一直都是一个很大的问题,而使用mysql的话虽然可以实现,但是给数据库增加了额外的压力。后面经过Google了解到DFA(有穷自动机)算法可以解决我的问题。 什么是DFA算法? DFA全称为:Deterministic Fini...

SmallYard的博客 5062

java Map实现敏感词过滤 DFA算法

java Map实现敏感词过滤 DFA算法 首先,DFA算法是啥 我的理解是,我们现在所接触的网络空间,难免鱼龙混杂,一些特殊意义,或满是芬芳气息的词汇在大多数地方都会屏蔽掉,或者用无意义的符号替换。 举个例子就是王者荣耀聊天系统,你如果打字出现芬芳气息的词汇,就会给你的词汇替换成*,今天要实现的就是这样的功能。 一、你可以自己去网上找找敏感词的词库,把它拿来作为测试的对象。这里我是直接自己加多个敏感词作为测试使用,当然了下面我也提供一个词库。 ...

云先生呀 574
上一篇: Maven插件运行机制与编写
下一篇: 高亮显示与拼音汉字互转及文本相似度匹配
hellohank
博客等级 码龄19年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值