最近專案需要用到敏感詞過濾功能,最開始想的是使用正則匹配和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...