牛骨文教育服务平台(让学习变的简单)
博文笔记

利用PHP扩展trie_filter做敏感词过滤

创建时间:2013-11-22 投稿人: 浏览次数:1852

使用说明

1. 安装 libdatrie
tar zxf libdatrie-0.2.4.tar.gz
cd libdatrie-0.2.4
./configure --prefix=/usr/local
make
make install

2. 安装 trie_filter 扩展
tar zxf trie_filter-1.0.0.tar.gz
cd trie_filter-1.0.0
/usr/local/php/bin/phpize

./configure  --with-php-config=/usr/local/php/bin/php-config
make
make install
记得修改你的 php.ini 文件,启用 trie_filter 扩展。extension=trie_filter.so

 

3. 生成词典预处理工具(dpp.c 在 trie_filter-1.0.0 里面)
gcc -o dpp dpp.c -ldatrie

4. 生成敏感词词典
首先你需要把需要检测的敏感词写入到一个文本文件中(如:minganci.txt),每行一个敏感词,然后使用上一步生成的 dpp 程序处理这个文本文件来生成词典
./dpp txt_file_path dict_file_path     

 (例:./dpp  /home/like/software/minganci.txt  minganci.dic

出现如下错误:

./dpp: error while loading shared libraries: libdatrie.so.1: cannot open shared object file: No such file or directory

解决方法:

#vi /etc/ld.so.conf  在里面加入:/usr/local/lib
然后运行:#/sbin/ldconfig,即解决

最后再:./dpp  /home/like/software/minganci.txt  minganci  )

 

5. 使用扩展
扩展接口很简单,只有两个函数:
1) trie_filter_load($path_to_dict)
用来载入词典,成功返回一个 Trie_Filter 资源句柄,失败返回 NULL
2) trie_filter_search($trie, $text)
用来检测一段文本中是否含有词典中定义的敏感词,$trie 是上一个函数返回的 Trie Filter 句柄,$text 是欲检测的文本
如果检测到敏感词则返回一个数组,数组第一个元素指出检测到的敏感词在 $text 中的偏移量,第二个元素指出该敏感词的长度(bytes)
如果没有检测到敏感词,则返回一个空数组

扩展的速度怎么样

一个字,很快!扩展的检测算法基于 Double Array Trie Tree,查找单一关键字的时间复杂度为 O(1),查找整段文本的时间复杂度为 O(n),n 为文本的长度,而且检测的速度不会因为敏感词的增加而降低。

注意事项

1. 扩展把词典和要检测的文本都当做平凡的字节流处理,因此可以无视字符集的问题。但需要注意的是词典的编码需要和检测文本的编码一致(我曾经犯过这样的错误:词典编码和文本编码不一样,生成的词典用不了),例如词典为 UTF-8 编码而你需要检测的文本为 GBK 编码,这就要求你在调用 trie_filter_search() 函数之前通过 iconv 或者 mb_xxx 函数转换一下编码
2. 目前只在 linux + php-5.2 环境下测试通过,不支持 windows,也没有支持的计划

<?php  
/** 
 * trie_filter 敏感词过滤示例 
 *  
 * @author flyer0126 
 * @since  2013/08/26 
 **/  
  
// 载入词典,成功返回一个 Trie_Filter 资源句柄,失败返回 NULL  
$file = trie_filter_load("/usr/local/src/trie_filter/mgc.dic");  
var_dump($file);  
$str1 = "今天利用trie_filter做敏感词过滤示例";  
$str2 = "今天利用trie_filter做过滤示例";  
// 检测文本中是否含有词典中定义的敏感词(假设敏感词设定为:‘敏感词’)  
$res1 = trie_filter_search($file, $str1);  
$res2 = trie_filter_search($file, $str2);  
echo $res1 ? "存在敏感词" : "不存在敏感词";  
echo "<br/>";  
echo $res2 ? "存在敏感词" : "不存在敏感词";  
/** 
resource(1) of type (Trie tree filter) 
存在敏感词 
不存在敏感词 
**/  


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。