`
strayly
  • 浏览: 97937 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)PHP词库树,用来判断敏感词

    博客分类:
  • php
 
阅读更多
<?php
class TrieTree
{

    public $tree = array();

    /**
     * 增加关键词到字典树
     *
     * @param string $utf8_str            
     */
    public function add($utf8_str)
    {
        $chars = &UTF8Util::getChars($utf8_str);
        // 串结尾字符
        $chars[] = null;
        $count = count($chars);
        $T = &$this->tree;
        for ($i = 0; $i < $count; $i ++) {
            $c = $chars[$i];
            if (! array_key_exists($c, $T)) {
                // 插入新字符,关联数组
                $T[$c] = array();
            }
            $T = &$T[$c];
        }
        return $this;
    }
    /**
     * 从字典树移除关键词
     *
     * @param string $utf8_str            
     */
    public function remove($utf8_str)
    {
        $chars = &UTF8Util::getChars($utf8_str);
        $chars[] = null;
        // 先保证此串在树中
        if ($this->_find($chars)) {
            $chars[] = null;
            $count = count($chars);
            $T = &$this->tree;
            for ($i = 0; $i < $count; $i ++) {
                $c = $chars[$i];
                // 表明仅有此串
                if (count($T[$c]) == 1) {
                    unset($T[$c]);
                    return;
                }
                $T = &$T[$c];
            }
        }
        return $this;
    }

    /**
     * 从字典树查找关键词
     *
     * @param string $utf8_str            
     * @return boolean
     */
    public function exists($utf8_str)
    {
        $chars = &UTF8Util::getChars($utf8_str);
        $chars[] = null;
        return $this->_find($chars);
    }

    private function _find(&$chars)
    {
        $count = count($chars);
        $T = &$this->tree;
        for ($i = 0; $i < $count; $i ++) {
            $c = $chars[$i];
            if (! array_key_exists($c, $T)) {
                return false;
            }
            $T = &$T[$c];
        }
        return true;
    }

    /**
     * 是否含有关键词
     *
     * @param string $utf8_str            
     * @param boolean $do_count            
     * @return boolean|number
     */
    public function contain($utf8_str, $do_count = false)
    {
        $chars = &UTF8Util::getChars($utf8_str);
        $chars[] = null;
        $len = count($chars);
        $Tree = &$this->tree;
        $count = 0;
        for ($i = 0; $i < $len; $i ++) {
            $c = $chars[$i];
            // 起始字符匹配
            if (array_key_exists($c, $Tree)) {
                $T = &$Tree[$c];
                for ($j = $i + 1; $j < $len; $j ++) {
                    $c = $chars[$j];
                    if (array_key_exists(null, $T)) {
                        if ($do_count) {
                            $count ++;
                        } else {
                            return true;
                        }
                    }
                    if (! array_key_exists($c, $T)) {
                        break;
                    }
                    $T = &$T[$c];
                }
            }
        }
        return $do_count ? $count : false;
    }

    /**
     * 批量检查是否包含关键词
     *
     * @param array $str_array            
     * @return boolean
     */
    public function containMulti($str_array)
    {
        if (\is_array($str_array)) {
            foreach ($str_array as $str) {
                if ($this->contain($str)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 导出序列化后的字典树
     *
     * @return string
     */
    public function export()
    {
        return serialize($this->tree);
    }

    /**
     * 导入序列化后的字典树
     *
     * @param string $str            
     */
    public function import($str)
    {
        $this->tree = unserialize($str);
    }
}

class UTF8Util
{

    public static function getChars($utf8_str)
    {
        $s = $utf8_str;
        $len = strlen($s);
        if ($len == 0)
            return array();
        $chars = array();
        for ($i = 0; $i < $len; $i ++) {
            $c = $s[$i];
            $n = ord($c);
            // 0xxx xxxx, asci, single
            if (($n >> 7) == 0) {
                $chars[] = $c;
            } else 
                // 1111 xxxx, first in four char
                if (($n >> 4) == 15) {
                    if ($i < $len - 3) {
                        $chars[] = $c . $s[$i + 1] . $s[$i + 2] . $s[$i + 3];
                        $i += 3;
                    }
                } else 
                    // 111x xxxx, first in three char
                    if (($n >> 5) == 7) {
                        if ($i < $len - 2) {
                            $chars[] = $c . $s[$i + 1] . $s[$i + 2];
                            $i += 2;
                        }
                    } else 
                        // 11xx xxxx, first in two char
                        if (($n >> 6) == 3) {
                            if ($i < $len - 1) {
                                $chars[] = $c . $s[$i + 1];
                                $i ++;
                            }
                        }
        }
        return $chars;
    }
}
?>
分享到:
评论

相关推荐

    敏感词,敏感词库.sql,涵盖表结构,数据写入 直接导入即可

    敏感词库sql 涵盖多方面敏感词

    Python-敏感词过滤的几种实现某1w词敏感词库

    将敏感词库构建为Trie树后,查找敏感词的速度会显著提高,特别是在大量文本中。 6. **模糊匹配**:除了精确匹配,还可以实现模糊匹配,允许部分匹配或者同义词匹配。这可能需要使用到如Jieba分词库,先对文本进行...

    java四种网站敏感词检测.zip

    - **前缀匹配**: 只要词的开头部分匹配到敏感词库中的词,就认为是敏感词。 - **后缀匹配**: 如果词的结尾部分匹配,也视为敏感。 - **全词匹配**: 必须完全匹配才能被认为是敏感词,这是最严格的方式。 - **部分...

    Go-golang敏感词过滤

    可以考虑使用字典树(Trie树)结构来存储敏感词,以减少内存占用并提高查找效率。 6. **并发处理**:Go语言的并发模型基于goroutine和channel,对于大规模文本处理,可以利用这些特性进行多线程或多goroutine处理,...

    用于检测敏感词的 PHP 扩展

    在IT行业中,PHP是一种广泛应用的服务器端脚本语言,尤其在网页开发...在实际应用中,根据具体的需求,你可能还需要考虑如何更新和维护敏感词库,以及如何处理包含敏感词的用户输入,比如替换、屏蔽或者提示用户修改。

    敏感词过滤.zip

    在IT行业中,敏感词过滤是一项重要的技术应用,主要用于网络内容审查、社交媒体监控、以及各种在线交互平台的安全管理。这项技术的目的是防止用户发布或传播含有特定敏感词汇的信息,以维护网络安全和社会秩序。以下...

    2024最新敏感词库大全

    2024最新敏感词库大全

    design-documents.zip_敏感词_敏感词词库_舆情分析_舆情监控_舆论监测

    建立数据库说明每类词库,建立敏感词词库。 网页舆情监测:监测是否出现了一定影响的舆论,即回帖的回帖或支持、顶等 达到一个预先设定的阈值; 舆情分析子系统: 汇总网站舆情:汇总整个网站的舆情监控信息,自动...

    php实现敏感词过滤类

    这样,在查找敏感词时,只需遍历一次文本,通过Trie树的节点转移即可快速判断是否存在敏感词。 三、类设计与实现 1. 类属性: - 敏感词库:存储敏感词的Trie树。 - 替换字符:设置替换敏感词时使用的字符,如星...

    Go-go-wordsfilter是一个高性能的Go敏感词过滤器

    Go-go-wordsfilter的核心原理是通过预先读取敏感词库,将敏感词构建成为一种特殊的树状结构数据,通常称为Trie树(字典树)或Patricia树。这种数据结构能够极大地优化搜索效率,使得在大量文本中查找敏感词的速度...

    thinkphp5敏感词过滤类

    在ThinkPHP5的敏感词过滤类中,DFA被用来快速地遍历和比对用户输入,判断是否存在敏感词汇。DFA的优势在于其高效的查找速度,尤其对于大量敏感词的情况,性能表现优于其他如正则表达式的方法。 在使用ThinkPHP5的...

    .net 过滤敏感词

    首先,敏感词过滤的基本原理是通过比较用户输入或文本内容与预定义的敏感词库进行匹配。词库通常包含了社会、政治、法律等领域的禁止词汇。在C#中,我们可以创建一个包含敏感词的列表或数组作为数据结构来存储这些...

    php扩展过滤敏感词

    php扩展:trie_filter 过滤敏感词。1.生成敏感词文件,2.加载使用敏感词库,3.查找敏感词。可以循环查找替换,最后输出替换后的文本

    基于DFA算法实现的敏感词屏蔽

    提供了重新选择敏感词库以及添加单个敏感词的功能 提供了查询字符串是否存在敏感词的功能(不进行屏蔽) 文件说明 dfa.py为源码 TestDFA.py为使用pytest进行运行性能测试 sensitive_words.txt为默认敏感词库 DfaApi...

    php实现敏感词过滤类.zip

    PHP实现的敏感词过滤类通常会利用数据结构如字典树(Trie树)来高效地进行匹配和过滤。 在这个"php实现敏感词过滤类.zip"压缩包中,我们有一个PHP类,用于处理敏感词过滤任务。这个类可能会包含以下核心功能: 1. ...

    php敏感词过滤案例

    php敏感词过滤案例,很简单很实用,现在网站好多关键词都是国家禁止的词,收集网络许多资料都不太好,为天下网自己写了一个,

    PHP 过滤敏感词 工具

    1. **数组存储敏感词库**:通常,敏感词会被存储在一个数组中,这个数组包含了所有需要过滤的词汇。你可以创建一个包含所有敏感词的PHP数组,然后在处理用户输入时对比这个数组。 2. **字符串匹配算法**:为了检测...

    C#高性能敏感词检测过滤组件

    - **哈希表或字典树**:利用数据结构的特性,快速定位敏感词,如Trie树(字典树)能够高效地进行前缀匹配,而哈希表则可以实现O(1)的查找速度。 - **多线程并行处理**:对于大量文本的检测,多线程技术可以充分利用...

    java敏感词过滤功能

    通常,敏感词过滤器会使用字典树(如Trie树)或者关键词列表来存储敏感词,并提供方法来判断一个字符串是否包含敏感词,或者将敏感词替换为星号等其他字符。 `List.java`:这个文件可能是用于存储敏感词列表的数据...

    敏感词检测api接口源码

    总的来说,这个敏感词检测API是一个简单但实用的工具,它利用PHP和一个庞大的敏感词库来快速有效地检测文本中的敏感内容。通过将这些组件组合起来,开发者能够轻松地在自己的项目中实现敏感词过滤功能。

Global site tag (gtag.js) - Google Analytics