一、前言
在工作中需要做敏感词过滤,如何高效的过滤敏感词,然后通过科普知道了DFA算法。
二、DFA概述
在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA
)是一个能实现状态转移的自动机。与之类似还有非确定有限自动机(NFA)
。
简单的说就是:DFA消耗输入符号的字符串。对每个输入符号它变换到一个新状态直到所有输入符号到被耗尽。下一个状态是唯一确定的。
简单的理解:就像树的结构,从根开始到枝叶子结束。
个人粗俗的理解
本篇不讲它的函数公式这些,直接代码走起!!!
三、Java代码实现
我们知道敏感词都是一个词语,我们把词语拆成一个字然后再关联组合,这样是不是就像DFA的状态转移。在Java中可以使用HashMap来实现这样的结构。
// 比如,现在的敏感词有:代开发票、代购、代购商 |
1、构建DFA 模型结构
我们要知道什么时候结束,所以在代码里加一个结束标识(isEnd
)。
/** |
上面已经构建好了DFA 词库模型。长如下:
{ |
发现 购
和 商
的标识都是 1
也就是结束,这是正常的。
2、如何查找
我们查找是否包含敏感词的时候也是一个一个去找,代码如下:
/** |
其实代码不一定非得和我上面写得一样,我只是拆得比较细,后面再组装,只要看懂思路之后随便改成你想要的方法。
完整版的:
import lombok.extern.slf4j.Slf4j; |
不需要的方法自行去掉,判空地方:StrUtil.isNotBlank(str)
可能会报错,自己改一些就行。