敏感詞檢測算法小結

本文簡單介紹下敏感詞或者髒詞檢測算法。html

經典AC算法

經典的AC算法由三部分構成,goto表,fail表和output表,共包含四種具體的算法,分別是計算三張查找表的算法以及AC算法自己。正則表達式

  • goto表是由模式集合P中的全部模式構成的狀態轉移自動機。(goto表就是一棵trie樹)算法

  • failure表做用是在goto表中匹配失敗後狀態跳轉的依據,這點與KMP中next表的做用類似。(這個表是trie樹沒有的,加了這個表,AC自動機就看起來不像一棵樹,而像一個圖)數組

  • output表示輸出,又稱:emits,即表明到達某個狀態後某個模式串匹配成功數據結構

AC自動機本質上來講是一種基於trie樹的kmp算法,AC算法須要三個函數來進行字符串匹配,並且這三個函數的求解都和一個肯定的DFA(有限狀態自動機)有關。函數

普通DFA算法

肯定性有窮自動機,用於正則表達式的匹配,最長左子式匹配學習

使用hashmap

public void createKeyWord(String keyWord) {
        Map nowMap = sensitiveWordMap;
        for (Character c : keyWord.toCharArray()) {
            Object obj = nowMap.get(c);
            if (obj == null) {
                Map<String, Object> childMap = new HashMap<>();
                childMap.put("isEnd", "false");
                nowMap.put(c, childMap);
                nowMap = childMap;
            } else {
                nowMap = (Map) obj;
            }
        }
        nowMap.put("isEnd", "true");
    }

使用自定義數據結構

public class WordNode {
    private int value; // 節點名稱
    private List<WordNode> subNodes; // 子節點
    private boolean isLast;// 默認false

    public WordNode(int value) {
        this.value = value;
    }
    public WordNode(int value, boolean isLast) {
        this.value = value;
        this.isLast = isLast;
    }
    //......
}

doc

相關文章
相關標籤/搜索