PHP实现敏感词过滤系统

安装说明

  1. 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html

  2. 安装PHP扩展 swoole,安装教程 http://www.swoole.com/

代码说明

1、敏感词库维护更新脚本:

reload_dict.php,提供自动更新字典库到trie-tree文件的过程

PHP
<?php

// 设置内存
ini_set('memory_limit', '128M'); // 读取敏感词字典库
$handle = fopen('dict.txt', 'r'); // 生成空的trie-tree-filter
$resTrie = trie_filter_new(); while(! feof($handle)) {
$item = trim(fgets($handle)); if (empty($item)) {
continue;
} // 把敏感词逐个加入trie-tree
trie_filter_store($resTrie, $item);
} // 生成trie-tree文件
$blackword_tree = 'blackword.tree'; trie_filter_save($resTrie, $blackword_tree);

2、trie树对象获取工具类

FilterHelper.php,提供获取trie-tree对象,避免重复生成trie-tree对象和保证tree文件与敏感词库的同步更新

PHP
<?php
/**
* 过滤器助手
*
* getResTrie 提供trie-tree对象;
* getFilterWords 提取过滤出的字符串
*
* @author W.Y.P (wangyupeng@jiayuan.com)
*/ class FilterHelper
{ // trie-tree对象
private static $_resTrie = null;
// 字典树的更新时间
private static $_mtime = null; /**
* 防止初始化
*/
private function __construct() {} /**
* 防止克隆对象
*/
private function __clone() {} /**
* 提供trie-tree对象
*
* @param $tree_file 字典树文件路径
* @param $new_mtime 当前调用时字典树的更新时间
* @return null
*/
static public function getResTrie($tree_file, $new_mtime) { if (is_null(self::$_mtime)) {
self::$_mtime = $new_mtime;
} if (($new_mtime != self::$_mtime) || is_null(self::$_resTrie)) {
self::$_resTrie = trie_filter_load($tree_file);
self::$_mtime = $new_mtime; // 输出字典文件重载时间
echo date('Y-m-d H:i:s') . "\tdictionary reload success!\n";
} return self::$_resTrie;
} /**
* 从原字符串中提取过滤出的敏感词
*
* @param $str 原字符串
* @param $res 1-3 表示 从位置1开始,3个字符长度
* @return array
*/
static public function getFilterWords($str, $res)
{
$result = array();
foreach ($res as $k => $v) {
$word = substr($str, $v[0], $v[1]); if (!in_array($word, $result)) {
$result[] = $word;
}
} return $result;
}
}

3、对外提供过滤HTTP访问接口

filter.php,使用swool,对外提交过滤接口访问

PHP
<?php

// 设置脚本最大运行内存,根据字典大小调整
ini_set('memory_limit', '512M'); // 设置时区
date_default_timezone_set('Asia/Shanghai'); // 加载助手文件
require_once('FilterHelper.php'); // http服务绑定的ip及端口
$serv = new swoole_http_server("182.92.177.16", 9502); /**
* 处理请求
*/
$serv->on('Request', function($request, $response) { // 接收get请求参数
$content = isset($request->get['content']) ? $request->get['content']: ''; $result = ''; if (!empty($content)) { // 字典树文件路径,默认当时目录下
$tree_file = 'blackword.tree'; // 清除文件状态缓存
clearstatcache(); // 获取请求时,字典树文件的修改时间
$new_mtime = filemtime($tree_file); // 获取最新trie-tree对象
$resTrie = FilterHelper::getResTrie($tree_file, $new_mtime); // 执行过滤
$arrRet = trie_filter_search_all($resTrie, $content); // 提取过滤出的敏感词
$a_data = FilterHelper::getFilterWords($content, $arrRet); $result = json_encode($a_data);
} // 定义http服务信息及响应处理结果
$response->cookie("User", "W.Y.P");
$response->header("X-Server", "W.Y.P WebServer(Unix) (Red-Hat/Linux)");
$response->header('Content-Type', 'Content-Type: text/html; charset=utf-8');
$response->end($result);
}); $serv->start();

测试效果

词库内容:

接口响应过滤结果:

尝试更新敏感词库,接口程序已自动加载最新敏感词库,保证过滤效果

ab测试结果

词库:200W敏感词

服务器配置(CPU:1核;内存:1024 MB;带宽:1Mbps)

http://www.cnblogs.com/paulversion/p/7150391.html

PHP实现敏感词过滤系统的更多相关文章

  1. 5分钟构建无服务器敏感词过滤后端系统(基于FunctionGraph)

    摘要:开发者通过函数工作流,无需配置和管理服务器,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统.托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行,极大地提高了开发和运维效率,减小 ...

  2. 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统

    前言 在上一篇“5分钟Serverless实践”系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例,介绍如何构建一个无 ...

  3. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  4. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类   =========================== ©Copyright 蕃薯耀 2017年9月25日 http://www ...

  5. 基于DFA算法、RegExp对象和vee-validate实现前端敏感词过滤

    面临敏感词过滤的问题,最简单的方案就是对要检测的文本,遍历所有敏感词,逐个检测输入的文本是否包含指定的敏感词. 很明显上面这种实现方法的检测时间会随着敏感词库数量的增加而线性增加.系统会因此面临性能和 ...

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

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  7. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

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

    为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...

  9. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

随机推荐

  1. Linux下tomcat修改成的80端口无法访问

    转自: https://blog.csdn.net/u013252047/article/details/72834415 tomcat放到服务器上访问8080端口还需要输入端口号,造成访问不便,好多 ...

  2. iOS开发-观察者模式

    观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.观察者模式中 ...

  3. STM32 F103 F407 F429 F767对比图

  4. iframe实现Ajax文件上传效果示例

    <!doctype html> <html> <head> <meta charset=utf-8> <head> <title> ...

  5. logback身份证脱敏

    logback身份证脱敏 学习了:https://shift-alt-ctrl.iteye.com/blog/2425469 https://blog.csdn.net/fywfengyanwei/a ...

  6. Andorid源码 4.4 TAG

    Fetching project platform/frameworks/opt/timezonepickerremote: Counting objects: 11169, doneremote: ...

  7. IOS Using UIAlertView to show alerts

    UIAlertView in other words, it's a dialog box. You want to show a message or ask user to confirm an ...

  8. grid - 初识

    Grid有三个参数 目前介绍以下两种:grid.inline-grid <view class="grid"> <view class='grid-row'> ...

  9. settings.xml配置详解

    简单值 一半顶层settings元素是简单值,它们表示的一系列值可以配置Maven的核心行为:settings.xml中的简单顶层元素 < settings xmlns="http:/ ...

  10. void android.graphics.Bitmap.recycle()

    void android.graphics.Bitmap.recycle() Free up the memory associated with this bitmap's pixels, and ...