Giter Site home page Giter Site logo

abelzhou / php-trietree Goto Github PK

View Code? Open in Web Editor NEW
224.0 15.0 59.0 2.04 MB

Make a trie tree with php language.使用场景为中文|英文 敏感词过滤/关键词过滤字典树,前缀树,内链建设,搜索提示。

License: MIT License

PHP 100.00%
wordfilter textfilter text-filter string-matching filter trietree

php-trietree's Introduction

PHP-TrieTree

composer安装

composer require abelzhou/php-trie-tree

这是一个PHP的字典树

  • v1.0
    • 命中一个后返回
  • v2.0
    • 支持命中多个返回
    • 支持在树梢增加自定义数组 [替换内容]
    • 性能提升10倍
  • v3.0
    • 增加删除特性
      • 删除整棵关键词树
    • 解决命中不全BUG
    • 3.1
      • 增加词库数量统计
    • 3.5
      • 清除词库数量统计 [没有什么意义]
      • 增加Suggestion特性 根据某个word提取相关的词语
        • 所有检索依据字典
        • 提取关联词均为从左至右原则
        • 因为个人更倾向其为一个“组件服务”,所以增加拼音索引需要主动增加
    • 3.6
      • 修正一个关联词的小bug
      • 增加demo httpserver

使用场景

  • 敏感词过滤
  • 内链建设
  • 搜索框提示

DEMO

image

  • 需要swoole扩展,直接运行swoole_server.php
  • 测试内容为5000个人名

性能

test目录下有个1.5w左右的敏感词。
mac下检索耗时2~5毫秒左右
这些敏感词来自网络,不是很全。
感知提取50个词以内1ms以内,500个词在3ms左右
最近再尝试改成AC自动机,但中英文差异性比较大。英文单节点变化度可控(26+10)所以比较合适AC自动机,中文会带来额外的性能开销,所以该算法暂时不采用。

注意

  • 在即时场景中(即时更新关键词),如果关键词数量较大,到十万甚至百万级别,尽量不要使用CGI模式,首次加载需要较大的性能开销,多个进程同时使用会造成一定的内存浪费,整体性能会下降,会拖垮web服务。这种情况下建议使用swoole单独封装服务,目前十万级别的关键词,已经在生产环境中验证过并运行良好。
  • 要严格控制关键词深度,关键词不宜过长,汉字的话最好10个汉字以内。
  • 在非即时场景中可以使用计划任务、常驻脚本等方式对内容进行处理。

计划

  • 重新修订命名
  • 协承版本

代码示例

<?php
require "../src/TrieTree.php";


$testArr = array("张三","张四","王五","张大宝","张三四","张氏家族","王二麻子");

$tree = new \AbelZhou\Tree\TrieTree();

foreach ($testArr as $str){
    $tree->append($str);
}

$res = $tree->getTree();

var_dump($res);

$res = $tree->search("有一个叫张三的哥们");
var_dump($res);

$res = $tree->search("我叫李四喜");
var_dump($res);

//删除
$res = $tree->delete("张三");
//删除整棵树 连带“张三”和张三下的“张三四”一并删除
$tree->delete("张三",true);



//拼音检测
$tree->append("zhangsan","",true,"张三");
$tree->append("zhangsan","",true,"张伞");

$t1 = microtime(true);
var_dump($tree->getTreeWord("zh"));
$t2 = microtime(true);
echo 'getTreeWordPinyin{' . ($t2 - $t1) . '}s'.PHP_EOL;


//replace & delete
$tree->append("z","",true,"");
$tree->append("z","",true,"");
$tree->append("z","",true,"");
var_dump($tree->getTreeWord("z",4));
//覆盖
$tree->append("z",array("1"=>1),true,"");
var_dump($tree->getTreeWord("z",4));
//删除
$tree->delete("z",false,true,"");
var_dump($tree->getTreeWord("z",4));
$tree->delete("z",false,true,"");
$tree->delete("z",false,true,"");
var_dump($tree->getTreeWord("z", 4));

php-trietree's People

Contributors

abelzhou avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

php-trietree's Issues

求指教,Fatal error: Uncaught Error: Class 'swoole_http_server' not found in /opt/lampp/htdocs/vendor/abelzhou/php-trie-tree/demo/swoole_server.php:13 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/vendor/abelzhou/php-trie-tree/demo/swoole_server.php on line 13

Fatal error: Uncaught Error: Class 'swoole_http_server' not found in /opt/lampp/htdocs/vendor/abelzhou/php-trie-tree/demo/swoole_server.php:13 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/vendor/abelzhou/php-trie-tree/demo/swoole_server.php on line 13

不是很懂append方法中ascii处理那段的意图,能解释一下吗

                       if (($ascii_code >> 7) == 0) {
				$code = dechex(ord($str[$i]));
				$word = $str[$i];

			} else if (($ascii_code >> 4) == 15) {    //1111 xxxx, 四字节
				if ($i < $len - 3) {
					$code = dechex(ord($str[$i])) . dechex(ord($str[$i + 1])) . dechex(ord($str[$i + 2])) . dechex(
							ord($str[$i + 3])
						);
					$word = $str[$i] . $str[$i + 1] . $str[$i + 2] . $str[$i + 3];
					$i += 3;
				}
			} else if (($ascii_code >> 5) == 7) {    //111x xxxx, 三字节
				if ($i < $len - 2) {
					$code = dechex(ord($str[$i])) . dechex(ord($str[$i + 1])) . dechex(ord($str[$i + 2]));
					$word = $str[$i] . $str[$i + 1] . $str[$i + 2];
					$i += 2;
				}
			} else if (($ascii_code >> 6) == 3) {    //11xx xxxx, 2字节
				if ($i < $len - 1) {
					$code = dechex(ord($str[$i])) . dechex(ord($str[$i + 1]));
					$word = $str[$i] . $str[$i + 1];
					$i++;
				}
			}
			if ($i == ($len - 1)) {
				$is_end = true;
			}

Hi!

您好,看了您的代码感觉受益匪浅,现在想把代码稍微改造一下,当做我们开源项目的一个组件来使用,完成后会注明来源,保证不以盈利为目的,想征求一下您的同意。

有的字符串调search直接挂掉了

require "../src/TrieTree.php";

$str = file_get_contents("./dict.txt");
$words_arr = explode("\n", $str);


$tree = new \AbelZhou\Tree\TrieTree();

foreach ($words_arr as $str) {
    $tree->append($str);
}

var_dump($tree->search('法伦功'));
var_dump($tree->search("据警方调查和“善心汇”部分骨干成员介绍,“张天师”的形象是张天明对自己极力包装的结果。pp点点通法伦功切七哲民护士小穴空姐小穴QQ堂昏药saohuao操**好爽meinv主持26小时全天激情热舞公务员的工资奸夫淫妇淫糜妹妹的阴户喷"));

关键词用的你的

有些词会命中不了

比如 "爱他妈的你好你好" 他妈的 命中不了, 敏感词是三个字的情况下, 有时候命中不了, 有时候敏感词在英文标点之后命中不了,

php8 支持

Required parameter $is_py follows optional parameter $end

TrieTree.php:192

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.