本文简单介绍下敏感词或者脏词检测算法。html
经典的AC算法由三部分构成,goto表,fail表和output表,共包含四种具体的算法,分别是计算三张查找表的算法以及AC算法自己。正则表达式
goto表是由模式集合P中的全部模式构成的状态转移自动机。(goto表就是一棵trie树
)算法
failure表做用是在goto表中匹配失败后状态跳转的依据,这点与KMP中next表的做用类似。(这个表是trie树没有的,加了这个表,AC自动机就看起来不像一棵树,而像一个图
)数组
output表示输出,又称:emits,即表明到达某个状态后某个模式串匹配成功数据结构
AC自动机本质上来讲是一种基于trie树的kmp算法,AC算法须要三个函数来进行字符串匹配,并且这三个函数的求解都和一个肯定的DFA(有限状态自动机)有关。函数
肯定性有穷自动机,用于正则表达式的匹配,最长左子式匹配学习
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; } //...... }