精选30+云产品,助力企业轻松上云!>>>

  • 目录
  • 1.前言
  • 方案1:PHP函数
  • 方案2:正则匹配
  • 方案3:全文搜索OR分词
  • 方案4:API
  • 2.方案实战
  • 2.1创建敏感词存储数据库
  • 2.2方案1:PHP函数
  • 2.3方案2:正则匹配
  • 2.4方案3:全文搜索OR分词
  • 2.4.1案例一:使用PHPAnalysis提取中文分词进行匹配
  • 2.4.2案例二:使用Elasticsearch全文搜索检测敏感词
  • 2.5方案4:API
  • 3.总结

1.前言

最近给公司开发商品评论系统,需求要对评论进行脱敏处理,因为之前没深入接触过,有些想当然的怎么简单怎么来,刚开始想用foreach循环匹配,但是组长一直说再想一想,想不到这里的水真深。先说说思想,我们一般人能够是通过数据库去匹配文本内容、如果敏感词库数据量大,就会出现典型的数据多匹配数据少,这样即增加开销、浪费资源,又可能增加了页面的响应时间;而符合生产环境的做法是将文本内容分词然后匹配数据库敏感词,这样少量的循环就能实现我们需要的效果,如下图所示。

可以看到我们传统思路是由数据库匹配文本,典型的多匹配少;所以思路逆转,少匹配多,采用文本分词手段,将需要的词匹配数据库,总的来说,当前方案一共讨论出四种。

方案1:PHP函数

优点:开发快

缺点:数据大效率低

方案2:正则匹配

优点:开发快,匹配度高

缺点:数据大效率低

方案3:全文搜索OR分词

优点:效率高

缺点:开发较复杂

方案4:API

优点:无需开发,直接调用

缺点:可能需要付费、无法自定义敏感词库

本章代码分享:https://github.com/mtdgclub/sensitiveWord

2.方案实战

2.1创建敏感词存储数据库

CREATE TABLE `t_sensitive_word` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`word` varchar(20) NOT NULL COMMENT '敏感字',`reason` varchar(20) DEFAULT NULL COMMENT '过滤原因',`is_del` tinyint(1) DEFAULT '0' COMMENT '是否删除 0不删除 1删除',`create_time` int(11) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='敏感词库';

2.2方案1:PHP函数

代码实现如下:

/*** PHP函数,处理敏感词接口* 作用:将敏感词变成*号,并返回处理后的文本*/
public function dealByFuncAction()
{$word = $this->$_POST['appraise_msg'];if (!empty($word)) {//将敏感库初始静态化if (empty(self::$save_words_array)) {//从数据库获得敏感词库$m_sensitive_word = Helper::load('sensitive_word');$sensitiveWordArray = $m_sensitive_word->Field('word')->Select();//处理数组,组装$dealArray = [];foreach ($sensitiveWordArray as $k => $v) {$dealArray[] = $v['word'];}self::$save_words_array = $dealArray;}//给敏感词打码$badWords = array_combine(self::$save_words_array, array_fill(0, count(self::$save_words_array), '*'));$res = strtr($word, $badWords);$data = ['code' => 1, 'msg' => '处理成功', 'data' => $res];} else {$data = ['code' => 0, 'msg' => '参数丢失'];}Helper::response($data);
}

2.3方案2:正则匹配

/*** 正则匹配,处理敏感词接口* 作用:检测提示敏感词*/
public function checkByRegularAction()
{$word = $this->$_POST['appraise_msg'];if (!empty($word)) {//去掉文本多余字符$flag_arr = array('•', '?', '!', '¥', '(', ')', ':', '‘', '’', '“', '”', '《', '》', ',', '…', '。', '、', 'nbsp', '】', '【', '~');$content_filter = preg_replace('/\s/', '', preg_replace("/[[:punct:]]/", '', strip_tags(html_entity_decode(str_replace($flag_arr, '', $word), ENT_QUOTES, 'UTF-8'))));//将敏感库初始静态化if (empty(self::$save_words_array)) {//从数据库获得敏感词库$m_sensitive_word = Helper::load('sensitive_word');$sensitiveWordArray = $m_sensitive_word->Field('word')->Select();//处理数组,组装$dealArray = [];foreach ($sensitiveWordArray as $k => $v) {$dealArray[] = $v['word'];}self::$save_words_array = $dealArray;}//正则匹配$blacklist = "/" . implode("|", self::$save_words_array) . "/i";self::$save_words_string = $blacklist;//判断if (preg_match(self::$save_words_string, $content_filter, $matches)) {$data = ['code' => 0, 'msg' => '有敏感词', 'data' => $matches[0]];} else {$data = ['code' => 1, 'msg' => '没有敏感词'];}} else {$data = ['code' => 0, 'msg' => '参数丢失'];}Helper::response($data);
}

另外还有正则匹配将敏感词变成*号并返回处理文本的函数dealByRegular(),详见Sensitive.php文件

2.4方案3:全文搜索OR分词

关于中文分词引擎,现在市面上提供多种方案选择,比如:SCWS、Sphinx、PHPAnalysis等等;更有结合 scws(分词引擎) + xapian(搜索引擎) 构建的开源全文搜索引擎 xunsearch、高伸缩的开源全文搜索和分析引擎Elasticsearch 等成熟的全文搜索引擎插件。更深入的有检测算法->DFA算法(全名:Deterministic Finite Automaton)即有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

下面举两个案例:

2.4.1案例一:使用PHPAnalysis提取中文分词进行匹配

下载地址:https://github.com/mtdgclub/PHPAnalysis

核心代码如下:

/*** Notes:返回文本的所有分词结果(一维数组)* @param string $content* @return array|string*/
public static function getAllParticiple($content = ""){if (empty ( $content )) {return '';}require_once 'phpanalysis.class.php';$pa = new \PhpAnalysis ( 'utf-8', 'utf-8', false );$pa->SetSource($content);$pa->resultType=2;$pa->differMax=true;$pa->StartAnalysis();$arr=$pa->GetFinallyIndex();return $arr;
}

控制器中引用如下:

//1.引入PHPAnalysis分词引擎,提取分词数组
$Analysis = new WordAnalysis();
$result = $Analysis->getAllParticiple($word);

2.4.2案例二:使用Elasticsearch全文搜索检测敏感词

使用composer拉取Elasticsearch

{"require": {"elasticsearch/elasticsearch" : "~5.0"},"repositories": {"packagist": {"type": "composer","url": "https://packagist.phpcomposer.com"}}
}

暂时放放,功力不足,看的吃力,可参考如下文档:

https://www.cnblogs.com/mzhaox/p/11210025.html

https://www.cnblogs.com/subendong/p/7308647.html

2.5方案4:API

这里以阿里云提供的敏感词API为例(点击处理跳转到API)

 /*** 阿里云api* @param $content* @return array|mixed|string*/private function aliyunApi($content){$host = "http://monitoring.market.alicloudapi.com";$path = "/neirongjiance";$method = "POST";$appcode = "150b1369d73e4aa3b3f2b22ed6cceeb4";$headers = array();array_push($headers, "Authorization:APPCODE " . $appcode);//根据API的要求,定义相对应的Content-Typearray_push($headers, "Content-Type" . ":" . "application/x-www-form-urlencoded; charset=UTF-8");$querys = "";$bodys = "in={$content}";$url = $host . $path;$curl = curl_init();//初始化curlcurl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);curl_setopt($curl, CURLOPT_URL, $url);//抓取指定网页curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);curl_setopt($curl, CURLOPT_FAILONERROR, false);curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//要求结果为字符串且输出到屏幕上curl_setopt($curl, CURLOPT_HEADER, true);if (1 == strpos("$" . $host, "https://")) {curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);}curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);$result = curl_exec($curl);$code = curl_getinfo($curl,CURLINFO_HTTP_CODE);//取得响应码$data = '';if($code == 200){$data = strstr($result, '{');$data = json_decode($data);}curl_close($curl);$data = ['code' => 1, 'msg' => '敏感词API测试', 'data' => $data];return $data;}
}

3.总结

通过开发敏感词校测功能,我明白不要小看每个功能,看似简单的东西,其实一点也不简单,每个小功能都能够延伸一定的高度,拿到需求先多想、多思考,把能够想到实现方案列出来,然后让拍板人去选择哪种方案,但是呢,空闲时间也要对其他不采用的方案进行了解和学习,要做到以点盖全,而不是点就是点,加油~

敏感词高效检测从浅到深相关推荐

  1. php 广告法违禁词敏感词高效替换函数

    <?php $badword = array('敏感词汇','www.mgch.ccom' ); $badword1 = array_combine($badword,array_fill(0, ...

  2. 敏感词“智能”检测(代码和完整文档在最后)

    完整文档下载 案例代码下载

  3. vue中检测敏感词,锚点

    当发布文章的时候,标题有敏感词 则检测有敏感词的接口成功的时候,写锚点 eg: _this .$alert("检测到标题有敏感词,请修改后再发布", "提示", ...

  4. java 敏感词检测

    在网上看到好多的敏感词检测,发现都是在推荐某某算法,但是敏感词全是利用文本去存放.在项目中不能很好的进行维护和管理(个人看法). 本文的敏感词的检测方式还是DFA算法检测,不过敏感词存放地址放入了Re ...

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

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

  6. python-DFA算法敏感词检索

    敏感词检索功能 根据 DFA 算法思想进行实现,主要包括两方面的内容: 将收集好的敏感词库生成 Trie 树 按照项目需求,对文本中的敏感词进行检索或者处理 算法复杂度: Trie树: 构建-O(n) ...

  7. python中哪些词是敏感字词_python实现敏感词过滤的几种方法

    1.replace过滤 最简单也是最直接的就是直接循环敏感词,然后使用replace过滤关键词,文章和敏感词少的时候还可以,多的时候效率就真的很一般了. 2.使用正则过滤 有两个技术要点, 1.使用P ...

  8. python骂人的程序_Python实现敏感词过滤的4种方法

    在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去 ...

  9. python敏感词过滤代码简单_大型企业都在用,Python实现敏感词过滤

    在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去 ...

  10. 微信公众号文章存在敏感词被屏蔽

    在写文章的时候,会遇到以下3种情况: 1.你所编辑的图文消息可能含有敏感内容,你可以继续保存或发布该图文消息(发布等待时长约3-4小时),若保存或发布后,经核实含有敏感内容的,将可能被作删除.屏蔽等处 ...

最新文章

  1. a*算法流程图_如何从0开始,搭建A/B test平台产品?
  2. AI繁荣下的隐忧——Google Tensorflow安全风险剖析
  3. Android开发之设置Dialog外部页透明的方法亲测可用
  4. swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift
  5. 小米平板android版本,小米平板2发布:分Android和Wind 10两个版本
  6. JavaScript相关技术学习
  7. 吾爱破解专用虚拟机系统不能安装VMwaretools问题!
  8. 为什么你需要软件运维服务
  9. 各种缩写名词汇总,力求最全面最精确
  10. pandas按照多列排序-ascending
  11. 最新QQ辅助任务平台悬赏接单源码+支持商家等功能
  12. Canvas如何实现樱花雨
  13. linux下emmc自动格式化和自动挂载
  14. 专科入行软件测试可行么
  15. 【摘记】心:稻盛和夫的一生嘱托
  16. 在三星smart TV上开发widget-入门篇
  17. 如何提问,提问技巧,如何有效的获取问题的答案
  18. Python应用与实践-转自(吴秦(Tyler))
  19. 跨境支付反洗钱业务逻辑和相关大数据分析技术实现
  20. android bitmap 色温,色温对比度饱和度 屏幕量化测试_手机Android频道-中关村在线...

热门文章

  1. 微信小程序开发-云数据库添加及获取显示
  2. 文档自动同步云服务器,​文件自动同步网盘能实现吗?
  3. IDEA部署web项目Warning:No artifacts configured.
  4. 二乘二(二阶)魔方教程,看完教程拼不出来我给你钱!
  5. adb操作命令详大全利用adb命令查看apk文件包名
  6. 计算机考试PPT主题背景没换,2013职称计算机考试:搞定PPT背景设置中的问题
  7. nssl 1336.膜拜神牛 {LIS}
  8. R语言-处理缺失值的方法
  9. linux打开word、excel等
  10. 传输层协议、应用层协议