敏感词过滤在社区发帖、网站检索、短信发送等场景下是很常见的需求,尤其是在高并发场景下如何实现敏感词过滤,都对过滤算法提出了更高的性能要求,Ahocorasick算法能够实现毫秒级的万字过滤匹配,能够很好的满足各种场景下的敏感词过滤需求。
Aho-Corasick算法通过将模式串预处理为确定有限状态自动机,对待匹配文本扫描一遍就能完成匹配。算法复杂度为O(n),即与模式串的数量和长度无关。AC自动机是多模式匹配的一个经典数据结构,原理是和KMP一样的构造Fail指针,不过AC自动机是在Trie树上构造的,但原理是一样的。
新建一个 word.txt文件存放关键词:
你好
夏天
。。。
新建一个文件夹 test,在test文件中执行:
composer require wikimedia/aho-corasick
在test文件中新建一个index.php文件
<?php
require'vendor/autoload.php';
use AhoCorasick\MultiStringMatcher;
$words = [];
$file = fopen('word.txt', 'r');
if ($file) {
while (($line = fgets($file))!== false) {
// 去除换行符,可选操作,根据实际需求决定是否去除
$line = trim($line);
$words[] = $line;
}
fclose($file);
}
// 输出查看数组内容
// print_r($words);
$keywords = new MultiStringMatcher( $words );
$str = "立法,是法治的“最先一公里”。一年来,市人大常委会聚焦城市安全、改革发展、民生福祉等领域,按照“立得住、行得通、真管用”的原则,加快推进重点立法项目,制定修改地方性";
$res = $keywords->searchIn( $str);
var_dump($res);
echo "ok";
?>
参考网址:
https://packagist.org/packages/wikimedia/aho-corasick#v2.0.0