PHP实现的敏感词过滤方法,有好的编码和好的实现方法,可以发出来一起交流一下。以下是一份过滤敏感词的编码 ? 一.敏感词过滤方案一 /** * @todo 敏感词过滤,返回结果 * @param array $list 定义敏感词一维数组 * @param string $string 要过滤的内容 它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测,所以效率比方案一高不少。 假设我们有以下5个敏感词需要检测:傻逼、傻子、傻大个、坏蛋、坏人。 那么我们可以先把敏感词中有相同前缀的词组合成一个树形结构,不同前缀的词分属不同树形分支,在Java中,我们可以用HashMap来存储上述的树形结构,还是以上述敏感词为例,我们把每个敏感词字符串拆散成字符 如果敏感词是英文,则还要考虑大小写的问题。有一个比较简单的解决方案是在初始化敏感词时,将敏感词都以小写形式存储。同时,在检测文本时,也统一将待检测文本转化为小写,这样就能解决大小写的问题了。
前言 如果可以用第三方的话,那么你是幸运的,因为现在这种敏感词过滤,敏感图片,敏感语音过滤的第三方服务还是挺多的 敏感词过滤 核心代码 利用PHP内置的三个函数 array_combine() | array_fill ,count($item),'*')); $content = strtr($content,$replace); array_combine array_fill strtr 完整代码 //过滤敏感词所有匹配的敏感词用一个
最近有一个需求就是需要给一串文字做敏感词校验 需求 根据上传的一串字符里通过校验可以返回里面的敏感词 不同的用户有一个敏感词库 用户可以随时修改需要校验的敏感词库(不会经常修改) 解决方案 存储敏感词库 由于我们用的数据库是MYSQL 我们就将这个敏感词存在数据库,那就是怎么存text一下全部存储还是每个敏感词都分开,最后根据娇艳的规则方式将其存储为一个或一段敏感词存储在一行。
简述: 关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」, ,提示用户输入评论内容,如果用户输入的内容中包含特殊的字符: 敏感词列表 li = ["苍老师","东京热",”武藤兰”,”波多野结衣”] 则将用户输入的内容中的敏感词汇替换成***,并添加到一个列表中 实战案例: 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十亿个标题,存在一个文件中,一行一个标题。有5万个敏感词,存在另一个文件。 写一个程序过滤掉所有标题中的所有敏感词,保存到另一个文件中。 1、DFA过滤敏感词算法 在实现文字过滤的算法中,DFA是比较好的实现算法。 算法核心是建立了以敏感词为基础的许多敏感词树。
序 本文简单介绍下敏感词或者脏词检测算法。 经典AC算法 经典的AC算法由三部分构成,goto表,fail表和output表,共包含四种具体的算法,分别是计算三张查找表的算法以及AC算法本身。 this.value = value; this.isLast = isLast; } //...... } doc 字符串多模式匹配:AC算法 Java实现DFA算法对敏感词 、广告词过滤功能 敏感词过滤的算法原理之 Aho-Corasick 算法 敏感词过滤的算法原理之DFA算法 AC自动机和Fail树 基于双数组的AC匹配算法学习
二、敏感词汇获取 既然是要屏蔽敏感词汇,肯定需要先确定哪些词算是敏感词,再以这些词汇作为标准作为屏蔽。 ? 为了更好地测试,我写了一个刘小爱,将其设定为1级,毕竟总不可能真的写那些敏感词。 好,敏感词汇准备好了,就要创建Filter过滤器以及编写如何屏蔽的业务逻辑代码了。 ③切割字符串 字符串为一行的内容:是以“|”为分隔,前面为敏感词,后面为屏蔽等级。 所以使用split()方法来将其分隔成一个数组,数组里0索引位为敏感词,1索引位为屏蔽等级。 split[0]表示的也就是敏感词内容,将其存入对应集合即可。 三、过滤代码编写 上述是对过滤器中init()方法里的代码编写,用于获取敏感词一共有哪些。 (str):以遍历的敏感词为标准。
来自腾讯课堂笔记:https://ke.qq.com/webcourse/index.html#course_id=152997&term_id=100174752&taid=801037170660773&vid=y1412sc0r8c 知识点: 1: var re = /[我|车|一]+/g; 也可以写成:var re=/我|车|一/g; 即去掉了[]和+,这个案例中,+表示连续多个,可以不用,但是遇到判断类型那种,就必须要了,其实这个也应该加上额,万一“我”字后面还有一个“我”连着呢? 对与中括号
一、什么是敏感词过滤? 敏感词过滤是一种处理网络内容的技术,可以检测和过滤出网络中的敏感/违禁词汇。它通过给定的关键字或字符串,判断网络内容是否包含某些敏感信息,从而防止违反法律法规的信息流通。 通常,可以使用两种方法来过滤敏感词: 黑名单过滤:即定义一个黑名单,将所有敏感词择记录在其中,然后对输入的文本进行对比,如果发现有敏感词,就将其过滤掉。 ToolGood.Words是一款高性能非法词(敏感词)检测组件,附带繁体简体互换,支持全角半角互换,获取拼音首字母,获取拼音字母,拼音模糊搜索等功能。 >返回状态码;为空则表示传入的内容为空;“0”:设置违禁词时发生错误;“1”:敏感内容查询时发生错误;“2”:需要替换的文本内容为空;“3”:原内容中包含敏感/违禁词汇;“4”:原内容中不包含敏感/违禁词汇 , resultStr = "" }); } } 六、前端封装JS方法 /** * 敏感词/违禁词替换 * @param {string} sourctText 需要进行替换的内容 *
敏感词过滤功能在很多地方都会用到,理论上在Web应用中,只要涉及用户输入的地方,都需要进行文本校验,如:XSS校验、SQL注入检验、敏感词过滤等。今天着重讲讲如何优雅高效地实现敏感词过滤。 敏感词过滤方案一 先讲讲笔者在上家公司是如何实现敏感词过滤的。当时毕竟还年轻,所以使用的是最简单的过滤方案。简单来说就是对于要进行检测的文本,遍历所有敏感词,逐个检测输入的文本中是否含有指定的敏感词。 它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测,所以效率比方案一高不少。 假设我们有以下5个敏感词需要检测:傻逼、傻子、傻大个、坏蛋、坏人。 那么我们可以先把敏感词中有相同前缀的词组合成一个树形结构,不同前缀的词分属不同树形分支,以上述5个敏感词为例,可以初始化成如下2棵树: ? ? 把敏感词组成成树形结构有什么好处呢? 可以看到,我们成功地过滤出了敏感词。 敏感词过滤方案三 方案二在性能上已经可以满足需求了,但是却很容易被破解,比如说,我在待检测文本中的敏感词中间加个空格,就可以成功绕过了。
需求分析 系统有千万级的禁词需要去过滤 当中包含人名 特殊符号组成的语句 网址 单字组合成的敏感词 等等 初步设计 1.解决千万级禁词存储及查找问题 2.解决被过滤文本内容过多问题 详细设计 1. 采用ES作为禁词库 千万级数据检索时间在毫秒级满足需求 2.不适用分词器需要完整匹配 分词后很多词都是合法的 组合之后才是敏感词 3.被过滤文本内容分词不完整 利用IK分词器分词结果不适合现在的业务场景
敏感词过滤说白了就是简单的字符串替换,Java本身已经提供了相关函数,但是一旦遇到长文本,或者敏感词数量庞大,效率下降就会非常明显。本文将介绍利用多叉树进行敏感词存储和过滤的方法。 那么多叉树是如何存储敏感词的呢?首先将敏感词分解为一个一个的字符,例如敏感词”CSDN”,第一个字符是C,则在Head下创建子树”C”(如果已经存在则跳过这一步)。 这种算法会出现一个小意外,如果一个敏感词恰好是另一个敏感词的前缀,就会导致较短的敏感词被长的敏感词覆盖,这种情况可以通过添加结束标记来区分。 14596个敏感词(可能有个别重复),在测试代码里生成了一个长度为1000的字符串,总共包含100个相同敏感词,敏感词中间有逗号隔开 重复执行过滤10000次,并打印结果和时间,结果如下 可以看到程序成功地过滤了敏感词 源文件+敏感词列表 在寻找敏感词列表时发现很多人的分享都被取消了,为了防止敏感词列表被检测出敏感词,使用了zip格式并加密。敏感词库存在部分重复,不过不影响使用。
过滤一遍并将敏感词替换之后剩余字符串中新组成了敏感词语,这种情况就要用递归来解决,直到过滤替换之后的结果和过滤之前一样时才算结束 第一步:建立一个敏感词库(.txt文本) 第二步:编写代码在文章中过滤敏感词 # print(sensitive_word_stock_path) class ArticleFilter(object): # 实现文章敏感词过滤 def filter_replace(self, string): # string = string.decode(“gbk”) # 存放敏感词的列表 filtered_words = [] # 打开敏感词库读取敏感字 with open(sensitive_word_stock_path ,替换为* def replace_words(self, filtered_words, string): # 保留新字符串 new_string = string # 从列表中取出敏感词 for words in filtered_words: # 判断敏感词是否在文章中 if words in string: # 如果在则用*替换(几个字替换几个*) new_string = string.replace
敏感词过滤器的实现 导包 敏感词文件 前缀树的实现 敏感词过滤器的实现 导包 本文的敏感词过滤器用在SpringBoot项目中,因此,首先需要在pom.xml文件中导入如下依赖 <dependency> 在resources目录下,创建sensitive-word.txt,里面填入需要过滤的敏感词信息。 ,构建敏感词前缀树 @PostConstruct public void init(){ try( InputStream is -1){ tempNode.setKeywordEnd(true); } } } /** * 过滤敏感词 ,将符号写入结果,如 ☆敏感词 情况二:符号在敏感词中间,则将符号与敏感词一起替换,如敏☆感☆词 */ if(isSymbol(c)){
项目中的需要,对用户的输入进行敏感词的过滤,使用的是DFT算法,敏感词可以从数据库进行读取和配置.
* k=敏感词的第一个字符,v=后续字符�?
* * @return 敏感词列�?
* k=敏感词的第一个字符,v=后续字符。e.g
* 敏感�?=�?假发票�??
* { * "�?":{"�?":{"�?":{"�?" :{}}}} * } * * @param wordLines 敏感词列�?
: DFA确定有限自动机匹配屏蔽,我们将敏感词构造成DFA形式,如敏感词集合 。 需要将敏感词集合构建成Trie树,如AC自动机多模字符串匹配算法。匹配句子时,遍历Trie树,从敏感词集合中找出可匹配的敏感词。 AC自动机多模式 上述敏感词屏蔽算法只能精确屏蔽,如果新增敏感词规则,就需要人工维护敏感词集合,这种迭代更新完全依赖人力,无法自动挖掘敏感词的匹配规则。 例如:“中华”一词多义,如果指香烟,可能算烟草违规的敏感词,但如果指牙膏,那就不算敏感词了。 如果出现主题漂移的情况,上述敏感词屏蔽算法也会出现跨越分词边界匹配,例如:“吃肯德基吧”。 例如“香烟”是敏感词,可能使用者会使用“香yan”来逃脱算法屏蔽。 因此为了解决当前准确率低,敏感词规则词库维护成本高问题,需要一套可自动挖掘,高准确率的算法用于敏感词屏蔽中。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133595.html原文链接:https://javaforall.cn
码说明 1、敏感词库维护更新脚本: reload_dict.php,提供自动更新字典库到trie-tree文件的过程 PHP <? php // 设置内存 ini_set('memory_limit', '128M'); // 读取敏感词字典库 $handle = fopen('dict.txt', 'r'); // 生成空的 handle)) { $item = trim(fgets($handle)); if (empty($item)) { continue; } // 把敏感词逐个加入 \n"; } return self::$_resTrie; } /** * 从原字符串中提取过滤出的敏感词 * * ); // 执行过滤 $arrRet = trie_filter_search_all($resTrie, $content); // 提取过滤出的敏感词
parse()函数就是打开文件,然后从中取各个关键词,然后将其存在关键词集合中。 filter()函数是一个过滤器函数,其中将消息转化为小写,然后将关键词替换成*。 message.replace(self.keywords[index], repl) return message 在上面的实现例子中,对于搜索查找进行了优化,对于英语单词,直接进行了按词索引字典查找 参考 Github:敏感词过滤系统 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137791.html原文链接:https://javaforall.cn
因为网站内容或者评论大都不是原创的,这就有必要防范非法的敏感字。首先在模板页module.php最后面加入<?php $badstring="**|**|**";? >,其中的**代表非法敏感词 然后在按下面的输出方法即可,以模板板子为例 列表页(log_list.php):找到<?php echo $value['log_description']; ? > 这样就可以把网站的非法敏感词过滤掉
连胜老师介绍一种前端处理敏感词的方法:替换相关敏感词为** 把一些基本的敏感词放在前端校验,一些疑似或者有语义的词再去用官方API检测。 hasSensitiveWords(str) { if(str == '' || str == undefined) return false; var words = '台独,藏独'; // 常用敏感词 : var titleStr = util.hasSensitiveWords(this.data.title); if (titleStr) { util.showModelTips('标题包含敏感词 titleStr), titleDefault: util.replaceAll(this.data.title, titleStr), }); return; } 当用户输入了相关敏感词后 ,前端可以做个简单处理,把常用敏感词替换成**。