LVPHP

使用php扩展trie_filter,利用词库,过滤敏感词

介绍

trie_filter是一个php关键词过滤扩展,用于检查一段文本中是否出现敏感词,基于Double-Array Trie 树实现。

安装步骤

安装libiconv,这个是libdatrie的依赖项
1
2
3
4
5
6
$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
$ tar zxvf libiconv-1.14.tar.gz
$ cd libiconv-1.14
$ ./configure
$ make
$ make install
安装libdatrie依赖库
1
2
3
4
$ tar zxvf libdatrie-0.2.4.tar.gz
$ cd libdatrie-0.2.4
$ make clean $ ./configure --prefix=$LIB_PATH
$ make $ make install
安装trie_filter扩展
1
2
3
4
$ $INSTALL_PHP_PATH/bin/phpize
$ ./configure --with-php-config=$INSTALL_PHP_PATH/bin/php-config --with-trie_filter=$LIB_PATH
$ make
$ make install

然后修改php.ini,增加一行:extension=trie_filter.so,然后重启PHP。

生成用语检测的词典
1
2
3
4
$ tar zxf trie_filter-2011.03.21.tar.gz
$ cd trie_filter-2011.03.21
$ gcc -o dpp dpp.c -ldatrie // 生成dpp命令用语编译词典
$ ./dpp words.txt words.dic //将words.txt 编译成trie_filter使用的词典 words.txt中每个词占一行

PHP测试实例

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
ini_set('memory_limit', '512M');
// 载入词典,成功返回一个 Trie_Filter 资源句柄,失败返回 NULL
$resTrie = trie_filter_load('./words.dic');
$str1 = '今天利用trie_filter做敏感词过滤示例';
$str2 = '今天利用trie_filter做过滤示例';
// 检测文本中是否含有词典中定义的敏感词(假设敏感词设定为:‘敏感词’)
$res1 = trie_filter_search_all($resTrie, $str1); // 一次把所有的敏感词都检测出来
$res2 = trie_filter_search($resTrie, $str2);// 每次只检测一个敏感词
var_dump($res1);
echo "<br/-->";
var_dump($res2);
trie_filter_free($resTrie); //最后别忘记调用free

注意

  • 一般情况下字典文件会比较大,如果每次都加载字典文件,性能会大打折扣,我们可以结合swool来做敏感词判断服务,避免每次加载字典;