PHP實現敏感詞過濾系統


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM