php实现基于DFA算法的违禁词过滤的类

分类:PHP相关 时间:2023-03-28 22:42 浏览:0 评论:0
0

在实现文字过滤的算法中,DFA是唯一比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。下图展示了其状态的转换

 在这幅图中大写字母(S、U、V、Q)都是状态,小写字母a、b为动作。通过上图我们可以看到如下关系

1545386497544186

在实现敏感词过滤的算法中,我们必须要减少运算,而DFA在DFA算法中几乎没有什么计算,有的只是状态的转换。

<?php
header("Content-type:text/html; charset=utf-8");
class MyMap
{
    public $isEnd = 0;
    private $keySpace = [];
 public function get($key)
 {
  return isset($this->keySpace[$key]) ? $this->keySpace[$key] : null;
 }
 public function put($key, $value)
 {
        $this->keySpace[$key] = $value;
 }
 public function hasNext()
    {
        return !empty($this->keySpace);
    }
}
class MyFilter
{
 public $map = null;
 public function addWordToMap($word)
 {
  $len = mb_strlen($word);
  if (is_null($this->map)) {
   $map = new MyMap();
  } else {
   $map = $this->map;
  }
  $tmp = $map;
  for ($i = 0; $i < $len; $i++) {
   $nowWord = mb_substr($word, $i, 1);
   $nowMap = $map->get($nowWord);
   if (!is_null($nowMap)) {
    $map = $nowMap;
   } else {
    $newMap = new MyMap();
    $map->put($nowWord, $newMap);
    $map = $newMap;
   }
   if ($i == ($len - 1)) {
    $map->isEnd = 1;
   }
  }
  $this->map = $tmp;
 }
 //最大匹配(有问题)
 public function searchFromMap($string)
 {
  $len = mb_strlen($string);
  $tmp = $this->map;
  $map = $this->map;
  $str = '';
  $result = [];
  for ($i = 0; $i < $len; $i++) {
   $nowWord = mb_substr($string, $i, 1);
   $nowMap = $map->get($nowWord);
   if (!is_null($nowMap)) {
    $str .= $nowWord;
    if ($nowMap->isEnd) {
                    if (!in_array($str, $result)) {
                        array_push($result, $str);
                    }
     $str = '';
     $map = $tmp;
    } else {
     $map = $nowMap;
    }
   } else {
    if (!empty($str)) {
     $i--;
    }
    $str = '';
    $map = $tmp;
   }
  }
  return $result;
 }
 //左侧全量匹配
    public function leftFullSearch($string)
    {
        $len = mb_strlen($string);
        $tmp = $this->map;
        $map = $this->map;
        $str = '';
        $result = [];
        for ($i = 0; $i < $len; $i++) {
            $nowWord = mb_substr($string, $i, 1);
            $nowMap = $map->get($nowWord);
            if (!is_null($nowMap)) {
                $str .= $nowWord;
                if ($nowMap->isEnd) {
                    if (!in_array($str, $result)) {
                        array_push($result, $str);
                    }
                    if ($nowMap->hasNext()) {
                        $map = $nowMap;
                    } else {
                        $str = '';
                        $map = $tmp;
                    }
                } else {
                    $map = $nowMap;
                }
            } else {
                if (!empty($str)) {
                    $i--;
                }
                $str = '';
                $map = $tmp;
            }
        }
        return $result;
    }
    public function matchSearch($string)
    {
    }
}
$example = new MyFilter();
$example->addWordToMap('中国人');
$example->addWordToMap('中国男人');
$example->addWordToMap('中国女人');
$example->addWordToMap('中国男');
$example->addWordToMap('中国女');
$example->addWordToMap('中国');
$example->addWordToMap('男人');
$example->addWordToMap('女人');
$example->addWordToMap('男');
$example->addWordToMap('女');
$example->addWordToMap('人');
$str = '我是中国人,我爱中国,中国男人发送中国女人男到中国男人发送';
var_dump($example->searchFromMap($str));
//var_dump($example->map);
//var_dump($result);
var_dump($example->leftFullSearch($str));
1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. PHP相关 > php实现基于DFA算法的违禁词过滤的类

用户评论