• 公司新项目素材编辑功能需要提供敏感词过滤功能,于是上网查了下,很多都是基于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实现高性能敏感词过滤算法相关推荐

  1. 【C++】实现敏感词过滤算法(含源码)

    敏感词过滤算法(聚合词树查询法) 1.构建词树 2.敏感词判断 3.遍历文本 关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进.大家可以参考一下链接: 敏感词过滤算 ...

  2. 敏感词过滤算法 为内容保驾护航 Java/.Net/C++/c/Python等语言是如何进行敏感词打码限制的 高效防范违规内容

    有人的地方,就有江湖,有输入框的地方,就有注入风险!有输入框的地方,就有敏感词!敏感词就像一个平台杀手,可能直接导致平台被封锁! 敏感词是一个APP.一个网站.一个内容平台的"杀手" ...

  3. trie树之敏感词过滤算法

    之前写过一篇关于Trie树的介绍:Trie树--在一个字符串集合中快速查找某个字符串.今天就用Trie树来实现敏感词过滤算法. 首先简单介绍一下Trie树的数据结构: 1.根节点不存储字符. 2.Tr ...

  4. 浅析过滤敏感词过滤算法(C++)

    本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. 为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个Word ...

  5. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  6. 算法-DFA算法-敏感词过滤算法(OC、Swift、Python)

    前言 前段时间,公司的IM SDK想做敏感词过滤,但是后端的小伙伴<比较忙>,在开产品需求会的时候想把敏感词过滤放到前端,让iOS.安卓自己搞,但是前端小伙伴写了一个方法来检测一段文本,耗 ...

  7. 记录一次敏感词过滤算法DFA的应用案例

    目录 0. DFA是什么? 1.为什么要用DFA 2.DFA工具类实现 3.性能对比效果 3.1 普通关键字过滤 3.2 DFA关键字过滤 0. DFA是什么? 参考文档:敏感词过滤的算法原理之DFA ...

  8. java实现敏感词过滤算法DFA并忽略敏感词中的特殊字符

    参考文章:https://blog.csdn.net/chenssy/article/details/26961957 补充说明: 1.具体的DFA介绍参考原文章,此处只是补充了文章中没有介绍的点以及 ...

  9. 【python 走进NLP】英文敏感词过滤算法改进版本

    中文DFA算法过滤敏感词改进版本 # 中文DFA算法过滤敏感词改进版本 class Chinese_DFAFilter():def __init__(self):self.keyword_chains ...

  10. 敏感词过滤算法:前缀树算法

    背景 平时我们在逛贴吧的时候,我们经常可以看到一些形如 "***"的符号,通过上下文,我们也可以很容易猜到这些词原来是骂人的话,只是被系统和谐了.那么这是如何实现的呢?作为普通人, ...

最新文章

  1. 一个适合于Python 初学者的入门练手项目
  2. Xen之初体验:HA(额外附加)
  3. python graph_python graph什么意思
  4. DNS Tunneling及相关实现——总之,你发起攻击都需要一个DNS server,下载一些工具作为client发起数据,server收集数据并响应...
  5. springboot启动后controller访问404
  6. firefox扩展开发(二):用XUL创建窗口控件
  7. 【arduino】亲测MAC上arduino安装ESP32 SPIFFS插件
  8. 【uni-app】H5中使用videojs播放器播放视频
  9. IOS之Objective-C学习 ARC下的单例模式
  10. Lubuntu 18.10仍有可能支持32位PC
  11. python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径
  12. 树的孩子链表表示法可执行代码(创建,层次遍历)
  13. html图书借阅源码,图书借阅管理系统代码图书管理系统源代码
  14. 山东大学——国际结算方式
  15. 【TouchDesigner】用Replicator制作选择器
  16. Linux系统开启wifi热点的方法
  17. java 线程 中断标志位
  18. 关于linux UART驱动和tty架构的理解
  19. 22位压缩版UUID
  20. causalml 因果推断

热门文章

  1. 全球尺度遥感云计算平台:Google Earth Engine
  2. 004-集成maven和Spring boot的profile功能打包
  3. Java不能做游戏?快来看看这个Java版超级玛丽吧。
  4. vue 用百度地图实现链家找房的效果
  5. win8.1能安装matlab,解决win8.1安装matlab出现无法访问您试图使用的功能...vcredist.msc...等等...
  6. Displaytag的使用四
  7. 锋利jquery第三章案例 总结
  8. 清理注册表 php,cad注册表怎么删干净
  9. 12306 登录验证数据下载(未标定)
  10. tomcat8设置JAVA_HOME路径