最近需要做一个留言过滤敏感词的需求,由于词库有10万个词典,在尝试了各种算法以后,过滤速度均不是特别理想, 于是决定采用php的trie_filter 来进行过滤。
由于原作者的不支持php7,不过在github上找到了支持7.0以后的版本。
一、安装依赖库libdatrie
$ cd /usr/local/src/
$ curl -O ftp://linux.thai.net/pub/ThaiLinux/software/libthai/libdatrie-0.2.4.tar.gz
$ tar zxvf libdatrie-0.2.4.tar.gz
$ cd libdatrie-0.2.4
$ make clean
$ ./configure --prefix=/usr/local/libdatrie
$ make
$ make install
二、安装 trie_filter $ cd /usr/local/src/
$ wget https://github.com/jiopuud/trie_filter/archive/master.zip
$ unzip master.zip
$ cd php-ext-trie-filter-master/
$ phpize
$ ./configure --with-php-config=/usr/bin/php-config --with-trie_filter=/usr/local/libdatrie
$ make
$ make install
php5的版本地址:
https://github.com/wulijun/php-ext-trie-filter/archive/master.zip
在进行 下面这一步的时候 可能会提醒你 需要加上--with-php-config =
如果你不知道php-config的路径 可以用 find / -name php-config 来搜索
三、修改php.ini
修改php.ini,然后增加一行:extension=trie_filter.so,保存配置并重启php
四、检测词语是否有敏感字
参考代码:
<?php
class SensitiveWord
{
public function load_sensitive_word_dict()
{
$dict_path = './admin/source/invalid.txt';
// 判断路径是否存在
if (!is_file ($dict_path)){
return false;
}
$arrWord = file( $dict_path );
// 创建一个空的trie tree
$resTrie = trie_filter_new();
//向trie tree中添加敏感词
foreach ($arrWord as $k => $v) {
trie_filter_store($resTrie, $v);
}
//生成敏感词文件
trie_filter_save($resTrie, './admin/source/invalid.tree');
if (!is_file ('./admin/source/invalid.tree')){
return false;
}
return true;
}
public function filter_sensitive_word($str){
if(!file_exists('./admin/source/invalid.tree'))
{
$this->load_sensitive_word_dict();
}
// 加载敏感词
$resTrie = trie_filter_load('./admin/source/invalid.tree');
//在文本中查找所有的脏字
$arrRet = trie_filter_search($resTrie, $str);
return $arrRet;
}
}