Skip to content

Fast and efficient sensitive word matching, checking and filtering functions based on the Aho-Corasick algorithm

License

Notifications You must be signed in to change notification settings

ErlGameWorld/eAcs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

eAcs

基于ac算法实现的快速高效的敏感词匹配,检查,过滤功能, 另外特殊字符不参与敏感词匹配,检查和替换, 替换是会按照原位置保留

Build

$ rebar3 escriptize   ->   genAcs
$ rebar3 compile

Notice

编译acsTree.erl 时不要加debug_info 选项 减少编译后的大小和加载后内存占用

Uses

敏感词预处理 去除特殊字符和去掉重复的敏感词 (SWordFile 和 OutputDirFile) 可以同名
     脚本生成:./genAcs -f/-F SWordFile OutputDirFile
    函数调用: genAcs:main(["-f"/"-F", SWordFile, OutputDirFile])
创建 acsTree.erl
    脚本生成:./genAcs SWordFile OutputDir
    函数调用: genAcs:main([SWordFile, OutputDir])
匹配 检查 过滤 敏感词
    eAcs:matchSw/1               %% 返回匹配的敏感词列表
    eAcs:isHasSw/1               %% 检查是否包含敏感词
    eAcs:replaceSw/1             %% 替换敏感词
    eAcs:isHasRpSw/1             %% 检测并替换敏感词

性能

实际测试中
    基于在一个2万敏感词构造的ac状态树中测试 匹配耗时为 50-100ns 一个字 算下来1秒可以匹配上千万的文本
测试示例(测试前先注释掉测试代码打印的参数和eAcs matchSw匹配输出的列表构造): 
    下载了一个比较火的动漫小说 吞噬星空.txt  
    查看该小说有多少字
    {ok, DataStr} = file:read_file("吞噬星空.txt"),
    eAcs:strSize(DataStr, 0).           -> 5729268
    测试匹配
    acTest:test4(100, "./src/test/吞噬星空.txt").
    =====================
    execute Fun :matchSw
    execute Mod :eAcs
    execute LoopTime:100
    MaxTime:  450278766(ns)   0.450279(s)
    MinTime:  428782619(ns)   0.428783(s)
    SumTime: 4345761036(ns)   43.45761(s)
    AvgTime: 434576103.(ns)   0.434576(s)
    Grar   :         43(cn)       0.43(%)
    Less   :         57(cn)       0.57(%)
    =====================
    ok
    
    It's really fast!!!

算法说明

算法说明

About

Fast and efficient sensitive word matching, checking and filtering functions based on the Aho-Corasick algorithm

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages