PHP實現DFA演算法

2021-10-10 22:01:02 字數 1100 閱讀 2987

最近專案需要用到敏感詞過濾功能,最開始想的是使用正則匹配和mysql儲存敏感詞來對敏感詞來進行過濾操作,但是這兩種方法都感覺不好。大家都知道正則效能問題一直都是乙個很大的問題,而使用mysql的話雖然可以實現,但是給資料庫增加了額外的壓力。後面經過google了解到dfa(有窮自動機)演算法可以解決我的問題。

dfa全稱為:deterministic finite automaton,即確定有窮自動機。其特徵為:有乙個有限狀態集合和一些從乙個狀態通向另乙個狀態的邊,每條邊上標記有乙個符號,其中乙個狀態是初態,某些狀態是終態。但不同於不確定的有限自動機,dfa中不會有從同一狀態出發的兩條邊標誌有相同的符號。簡單點說就是,它是是通過event和當前的state得到下乙個state,即event+state=nextstate。理解為系統中有多個節點,通過傳遞進入的event,來確定走哪個路由至另乙個節點,而節點是有限的。

說了這麼多是不是還是一臉懵逼?沒關係,下面我們直接來擼**,裡面都有進行注釋。如果還是不懂的話,可以去google搜尋dfa演算法的詳細介紹。

<?php

$obj = new dfa();

$obj->addkeyword('王八蛋');

$obj->addkeyword('王八羔子');

$obj->addkeyword('香菸');

$obj->addkeyword('狗兒子');

$obj->gethashmap();

var_dump($obj->searchkey('王八蛋'));

var_dump($obj->searchkey('王八'));

class dfa

public function addkeyword($strword)

} else else

}// 傳址

$arrhashmap = &$arrhashmap[$word];}}

public function searchkey($strword)

if ($arrhashmap[$word]['end'])

$arrhashmap = $arrhashmap[$word];

}return false;

}}

Python實現模擬DFA演算法

演算法 模擬dfa 輸入 dfa d和輸入字串x,d的初態為s0,終態集為f。輸出 若d接受x,回答 yes 否則回答 no 構造dfa class dfa 初始化dfa def init self,s,s0,f,move self.s s 狀態集 list self.s0 s0 初態 int se...

Java實現DFA演算法實現敏感詞過濾

在實現文字過濾的演算法中,dfa是唯一比較好的實現演算法。dfa即deterministic finite automaton,也就是確定有窮自動機,它是是通過event和當前的state得到下乙個state,即event state nextstate。下圖展示了其狀態的轉換 在這幅圖中大寫字母 ...

DFA 演算法實現關鍵詞匹配

ahocorasick esmre 但是其實包都是基於dfa 實現的 這裡提供原始碼如下 usr bin python2.6 coding utf 8 import time class node object def init self self.children none self.flag f...