使用PHP扩展trie_filter来做敏感词过滤(支持php7+)

  • A+
所属分类:PHP

最近需要做一个留言过滤敏感词的需求,由于词库有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
/**
 * Created by PhpStorm.
 * User: xjw
 * Date: 2019/5/9
 * Time: 15:49
 */

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;
    }
}


avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: