DFA算法(全名:Deterministic Finite Automaton)即有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
通过上图我们可以很清晰的了解到DFA算法在数据检索中能够大大的提升检索效率,所以这种算法也被经常用于敏感词的过滤。下面我们了解下如何通过DFA算法过滤敏感词。
我们假设某用户输入了发布了一条信息。“XXX你个王八羔子,有好事也不说。”那么系统要做到对“王八羔子”的过滤二不是对“王八”的匹配,首先我们要把敏感词的合集,一般是一个TXT文件生成SensitiveMap如下图所示:
PHP版DFA算法下载:
类库使用方法:(以TP5为例)
1、将压缩包中src文件夹下DfaFilter放入thinkphp5根目录下的extend目录。
2、在Controller中引入三方类库。
- use DfaFilter\SensitiveHelper;
3、检查并将敏感词替换为“***”。
- public function CFilter($content){
- $path = "./static/upload/sensitive/sensitive_1.txt"; //敏感词文件
- // $handle = SensitiveHelper::init()->setTreeByFile($path);
- $filterContent = SensitiveHelper::init()->setTreeByFile($path)->replace($content, '***');
- return $filterContent;
- }
在上述代码中,我们看到有一行注释$handle,在实际应用开发中我们可以将生成的SensitiveMapTree放入到Redis缓存中,而不用每次去读txt文件。毕竟敏感词过滤一般应用的场景都是聊天、信息发布等,所以使用频率还是比较高的。如果使用频率不高的场景直接读文件也是没问题的。
4、检查是否含有敏感词。
- function guolv($content){
- $path = "./static/upload/sensitive/sensitive_1.txt";
- $data = SensitiveHelper::init()->setTreeByFile($path)->islegal($content);
- if($data){
- //含有敏感词
- return true;
- }else{
- //不含敏感词
- return false;
- }
- }
以上内容经过实测没有任何问题,如果您在开发过程中遇到任何疑问也欢迎在评论区留言。