PHP:基于DFA算法的敏感词过滤的实现

DFA算法(全名:Deterministic Finite Automaton)即有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

DFA算法原理图

DFA算法原理图

通过上图我们可以很清晰的了解到DFA算法在数据检索中能够大大的提升检索效率,所以这种算法也被经常用于敏感词的过滤。下面我们了解下如何通过DFA算法过滤敏感词。

我们假设某用户输入了发布了一条信息。“XXX你个王八羔子,有好事也不说。”那么系统要做到对“王八羔子”的过滤二不是对“王八”的匹配,首先我们要把敏感词的合集,一般是一个TXT文件生成SensitiveMap如下图所示:

DFA算法原理图

DFA算法原理图

PHP版DFA算法下载

类库使用方法:(以TP5为例)

1、将压缩包中src文件夹下DfaFilter放入thinkphp5根目录下的extend目录。

2、在Controller中引入三方类库。

  1. use DfaFilter\SensitiveHelper;

3、检查并将敏感词替换为“***”。

  1. public function CFilter($content){
  2.     $path = "./static/upload/sensitive/sensitive_1.txt"//敏感词文件
  3. //  $handle = SensitiveHelper::init()->setTreeByFile($path);
  4.     $filterContent = SensitiveHelper::init()->setTreeByFile($path)->replace($content, '***');
  5.     return $filterContent;
  6. }

在上述代码中,我们看到有一行注释$handle,在实际应用开发中我们可以将生成的SensitiveMapTree放入到Redis缓存中,而不用每次去读txt文件。毕竟敏感词过滤一般应用的场景都是聊天、信息发布等,所以使用频率还是比较高的。如果使用频率不高的场景直接读文件也是没问题的。

4、检查是否含有敏感词。

  1. function guolv($content){
  2.     $path = "./static/upload/sensitive/sensitive_1.txt";
  3.     $data = SensitiveHelper::init()->setTreeByFile($path)->islegal($content);
  4.     if($data){
  5.                //含有敏感词
  6.         return true;
  7.     }else{
  8.                 //不含敏感词
  9.         return false;
  10.     }
  11. }

以上内容经过实测没有任何问题,如果您在开发过程中遇到任何疑问也欢迎在评论区留言。

文件下载

广告也精彩
波波

发表评论

您必须 登录 才能发表留言!