Skip to content

imaben/php-akm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ahocorasick keyword match

    ____  __  ______  ___    __ __ __  ___
   / __ \/ / / / __ \/   |  / //_//  |/  /
  / /_/ / /_/ / /_/ / /| | / ,<  / /|_/ /
 / ____/ __  / ____/ ___ |/ /| |/ /  / /
/_/   /_/ /_/_/   /_/  |_/_/ |_/_/  /_/

关键字快速查找匹配

编译安装

$ git clone https://github.com/imaben/php-akm.git
$ cd php-akm
$ phpize
$ ./configure
$ make 
$ sudo make install

php.ini配置

[akm]
extension=akm.so
akm.enable=On|Off
akm.dict_dir=/home/dict

说明:

  • akm.enable表示扩展启用或关闭
  • akm.dict_dir用来指定关键词词典所在的文件夹

函数说明

akm_match

关键词匹配

array akm_match(string $dict_name, string $text)

参数说明

  • dict_name:字典名称,即akm.dict_dir配置所在文件夹下的字典库名称(文件名)
  • text:待匹配的文本

返回值

返回匹配含有keywordoffsetextension字段数组列表的二维数组,如:

[
	{
		"keyword" : "敏感词",
		"offset": 123,
		"extension": "扩展文本"
	},
	{
		"keyword" : "敏感词2",
		"offset": 1231,
		"extension": "扩展文本"
	}
]

说明:

  • keyword:敏感词
  • offset:敏感词所在文本中的位置
  • extension:扩展文本

akm_replace

关键词替换

int akm_replace(string $dict_name, string &$text, callable $callback)

参数说明

  • dict_name: 字典名称,即akm.dict_dir配置所在文件夹下的字典库名称(文件名)

  • text:待替换文本

  • callback:处理匹配字符串的回调,接受三个参数

    • string keyword:匹配出的关键词
    • int index:关键词在文本中的位置
    • string extension:扩展文本

    如回调中返回一个字符串,则把匹配到的关键词替换成返回值。如无返回值,则不做任何处理

返回值

返回成功匹配的关键词个数

akm_get_dict_list

获取词典列表

array akm_get_dict_list()

返回值

返回已索引的词典名称列表

字典数据结构

关键词|扩展文本
keyword1|extension_text1
keyword2|extension_text2
keyword3|extension_text3

说明:

  • “|”为关键词和扩展文本之间的分割符
  • “|”只对首行第一个有效,例“发票|政治|敏感”,则认定发票为关键词,政治|敏感为扩展文本
  • 如无“|”符,则整行被认为一个关键词,返回时无扩展文本
  • 每行定义一个关键词,空行自动跳过

性能测试

PC配置:

CPU:Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
内存:4GB*3 1600MHz
硬盘:东芝Q300
操作系统:Linux 4.6.4-1-ARCH

测试代码:

<?php

$dict_name = 'dict';
$text = file_get_contents("text.txt");

$start = microtime(true);;
$result = akm_match($dict_name, $text);
$end = microtime(true);;
echo '耗时' . ($end - $start) . "毫秒\n";
echo '内存占用:' . memory_get_usage() / 1024 / 1024 . "MB\n";

关键词数量:45423

测试文本大小:8KB

测试结果:

第一次:

耗时0.488毫秒
内存占用:0.365MB

第二次:

耗时0.491毫秒
内存占用:0.365MB

第三次:

耗时0.462毫秒
内存占用:0.365MB