<?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 涵盖多方面敏感词
golang 敏感词过滤
基于某 1w 词敏感词库,用 Python 实现几种不同的过滤方式。用于过滤敏感词的实用模块
php敏感词过滤案例,很简单很实用,现在网站好多关键词都是国家禁止的词,收集网络许多资料都不太好,为天下网自己写了一个,
建立数据库说明每类词库,建立敏感词词库。 网页舆情监测:监测是否出现了一定影响的舆论,即回帖的回帖或支持、顶等 达到一个预先设定的阈值; 舆情分析子系统: 汇总网站舆情:汇总整个网站的舆情监控信息,自动...
提供了重新选择敏感词库以及添加单个敏感词的功能 提供了查询字符串是否存在敏感词的功能(不进行屏蔽) 文件说明 dfa.py为源码 TestDFA.py为使用pytest进行运行性能测试 sensitive_words.txt为默认敏感词库 DfaApi...
附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,用得好的话,记得有那么一个人提供就够了。 如遇问题,欢迎交流。 QQ 463550192 普通PC测试结果...
PHP 过滤敏感词 工具。 过滤敏感词工具 敏感词 过滤 过滤敏感词
PHP扩展,专门用于敏感词检测。速度快,能返回敏感词的偏移量和内存空间。只支持linux系统,PHP5.2测试通过。但是需要注意字符集。详细使用过程可参考:...
PHP关键词过滤扩展trie_filter, 修复原版返回length错误。用法可以参考原版说明。
findcode是一个用来将敏感词与句子中排序后的单词先按字母顺序排序然后进行逐一比较的函数;如果两者相同,则return1;用数组下标0-25分别表示a-z字母,对应的每个下标对应的数组元素的值就是该字母在该词中出现的...
附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,用得好的话,记得有那么一个人提供就够了。 如遇问题,欢迎交流。 QQ 463550192 普通PC测试结果...
本类库的敏感词替换算法,效率比str_replace高4倍(附6仟个敏感词),这个类库是没有学习过Trie树的时候写的,之后我接触了AC算法,我的算法和AC是类似的结构和逻辑,都是利用树,空间换时间,对搜索/替换海量数据...
C# 繁体转中文,中文转繁体,数字转中文(人民币),中文转数字(人民币)支持敏感词过滤,最强大最全面
php扩展:trie_filter 过滤敏感词。1.生成敏感词文件,2.加载使用敏感词库,3.查找敏感词。可以循环查找替换,最后输出替换后的文本
Java敏感词源码 ,内涵大多数敏感词词库。
敏感词过滤.zip
介绍一个php实现敏感词过滤类,过滤得到禁词,对禁词分批过滤,分批得到禁词树。
该算法不依赖词典与分词, 通过构建敏感词决策树,将网页文本内容以数据流形式检索决策树,记录敏感词词频、区域信息以及敏感词级别, 计算文本整体敏感度,过滤敏感文本。 实验结果表明,SWDT-IFA 算法具有较高的查准率...
敏感词过滤,敏感词转化为字符串数组,敏感词库路径,将敏感词全部替换为等长度的"*"号,返回是否有敏感词,读入TXT文件