基于PHP实现高性能敏感词过滤算法
- 公司新项目素材编辑功能需要提供敏感词过滤功能,于是上网查了下,很多都是基于trie算法的,但基于PHP写的却少有,或者部分存在bug。所以,自己在别人的基础上进行了完善。
敏感词过滤算法实现
class TreeMap
{public $data; // 节点字符public $children = []; // 存放子节点引用(因为有任意个子节点,所以靠数组来存储)public $isEndingChar = false; // 是否是字符串结束字符public function __construct($data){$this->data = $data;}
}class TrieTree
{/*** 敏感词数组* * @var array* @author qpf*/public $trieTreeMap = array();public function __construct(){$this->trieTreeMap = new TreeMap('/');}/*** 获取敏感词Map* * @return array* @author qpf*/public function getTreeMap(){return $this->trieTreeMap;}/*** 添加敏感词* * @param array $txtWords* @author qpf*/public function addWords(array $wordsList){foreach ($wordsList as $words) {$trieTreeMap = $this->trieTreeMap;$len = mb_strlen($words);for ($i = 0; $i < $len; $i++) {$word = mb_substr($words, $i, 1);if(!isset($trieTreeMap->children[$word])){$newNode = new TreeMap($word);$trieTreeMap->children[$word] = $newNode;}$trieTreeMap = $trieTreeMap->children[$word];}$trieTreeMap->isEndingChar = true;}}/*** 查找对应敏感词* * @param string $txt* @return array* @author qpf*/public function search($txt){$wordsList = array();$txtLength = mb_strlen($txt);for ($i = 0; $i < $txtLength; $i++) {$wordLength = $this->checkWord($txt, $i, $txtLength);if($wordLength > 0) {echo $wordLength;$words = mb_substr($txt, $i, $wordLength);$wordsList[] = $words;$i += $wordLength - 1;}}return $wordsList;}/*** 敏感词检测* * @param $txt* @param $beginIndex* @param $length* @return int*/private function checkWord($txt, $beginIndex, $length){$flag = false;$wordLength = 0;$trieTree = $this->trieTreeMap; //获取敏感词树for ($i = $beginIndex; $i < $length; $i++) {$word = mb_substr($txt, $i, 1); //检验单个字if (!isset($trieTree->children[$word])) { //如果树中不存在,结束 break;}//如果存在$wordLength++; $trieTree = $trieTree->children[$word];if ($trieTree->isEndingChar === true) { $flag = true;break;}}if($beginIndex > 0) {$flag || $wordLength = 0; //如果$flag == false 赋值$wordLenth为0}return $wordLength;}}$data = ['白粉', '白粉人', '白粉人嫩','不该大'];
$wordObj = new TrieTree();
$wordObj->addWords($data);$txt = "白粉啊,白粉人,我不该大啊";
$words = $wordObj->search($txt);
var_dump($words);die;
基于PHP实现高性能敏感词过滤算法相关推荐
- 【C++】实现敏感词过滤算法(含源码)
敏感词过滤算法(聚合词树查询法) 1.构建词树 2.敏感词判断 3.遍历文本 关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进.大家可以参考一下链接: 敏感词过滤算 ...
- 敏感词过滤算法 为内容保驾护航 Java/.Net/C++/c/Python等语言是如何进行敏感词打码限制的 高效防范违规内容
有人的地方,就有江湖,有输入框的地方,就有注入风险!有输入框的地方,就有敏感词!敏感词就像一个平台杀手,可能直接导致平台被封锁! 敏感词是一个APP.一个网站.一个内容平台的"杀手" ...
- trie树之敏感词过滤算法
之前写过一篇关于Trie树的介绍:Trie树--在一个字符串集合中快速查找某个字符串.今天就用Trie树来实现敏感词过滤算法. 首先简单介绍一下Trie树的数据结构: 1.根节点不存储字符. 2.Tr ...
- 浅析过滤敏感词过滤算法(C++)
本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. 为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个Word ...
- 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...
- 算法-DFA算法-敏感词过滤算法(OC、Swift、Python)
前言 前段时间,公司的IM SDK想做敏感词过滤,但是后端的小伙伴<比较忙>,在开产品需求会的时候想把敏感词过滤放到前端,让iOS.安卓自己搞,但是前端小伙伴写了一个方法来检测一段文本,耗 ...
- 记录一次敏感词过滤算法DFA的应用案例
目录 0. DFA是什么? 1.为什么要用DFA 2.DFA工具类实现 3.性能对比效果 3.1 普通关键字过滤 3.2 DFA关键字过滤 0. DFA是什么? 参考文档:敏感词过滤的算法原理之DFA ...
- java实现敏感词过滤算法DFA并忽略敏感词中的特殊字符
参考文章:https://blog.csdn.net/chenssy/article/details/26961957 补充说明: 1.具体的DFA介绍参考原文章,此处只是补充了文章中没有介绍的点以及 ...
- 【python 走进NLP】英文敏感词过滤算法改进版本
中文DFA算法过滤敏感词改进版本 # 中文DFA算法过滤敏感词改进版本 class Chinese_DFAFilter():def __init__(self):self.keyword_chains ...
- 敏感词过滤算法:前缀树算法
背景 平时我们在逛贴吧的时候,我们经常可以看到一些形如 "***"的符号,通过上下文,我们也可以很容易猜到这些词原来是骂人的话,只是被系统和谐了.那么这是如何实现的呢?作为普通人, ...
最新文章
- 一个适合于Python 初学者的入门练手项目
- Xen之初体验:HA(额外附加)
- python graph_python graph什么意思
- DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
- springboot启动后controller访问404
- firefox扩展开发(二):用XUL创建窗口控件
- 【arduino】亲测MAC上arduino安装ESP32 SPIFFS插件
- 【uni-app】H5中使用videojs播放器播放视频
- IOS之Objective-C学习 ARC下的单例模式
- Lubuntu 18.10仍有可能支持32位PC
- python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径
- 树的孩子链表表示法可执行代码(创建,层次遍历)
- html图书借阅源码,图书借阅管理系统代码图书管理系统源代码
- 山东大学——国际结算方式
- 【TouchDesigner】用Replicator制作选择器
- Linux系统开启wifi热点的方法
- java 线程 中断标志位
- 关于linux UART驱动和tty架构的理解
- 22位压缩版UUID
- causalml 因果推断
热门文章
- 全球尺度遥感云计算平台:Google Earth Engine
- 004-集成maven和Spring boot的profile功能打包
- Java不能做游戏?快来看看这个Java版超级玛丽吧。
- vue 用百度地图实现链家找房的效果
- win8.1能安装matlab,解决win8.1安装matlab出现无法访问您试图使用的功能...vcredist.msc...等等...
- Displaytag的使用四
- 锋利jquery第三章案例 总结
- 清理注册表 php,cad注册表怎么删干净
- 12306 登录验证数据下载(未标定)
- tomcat8设置JAVA_HOME路径