功能简介
DFA算法模型是解决针对一段文本,过滤出其他文本。比如我们定义了三段文本a、b和c为“张三”、“程序员”、“开发”,而在文本d“我的名字叫张三,我是一名刚工作一年的程序员”的内容中,可以发现文本d是包含a和b文本的,这个过程就是DFA算法模型实现的功能。DFA算法的核心是构建出一个模型。
抛出疑问
- java中有contain方法进行判断a文本是否包含b文本,为什么不直接用contain进行比较呢?
- DFA算法用Java如何构建?
- DFA算法性能如何?
算法思想
举个例子,假如我们认为以下是敏感词。
1. 我是张三
2. 我是李四
3. 大王八
4. 大王来了
然后我们根据上面的敏感词构建出一个模型,该模型实际上是一颗树,或者说是森林。在java代码中实际上是多个map,为了方便观察,我转换成了json。(不完整版本)
{
"我": {
"是": {
"张": {
"三": {
}
},
"李": {
"四": {
}
}
}
},
"大": {
"王": {
"来": {
"了": {
}
},
"八": {
}
}
}
}
我们通过上面构建的模型对目标文本“我是张三,我是大王”进行敏感词过滤,大致过程如下:
1. 遍历目标文本,获取到第一个字符‘我’,在我们构建的模型的第一层比较,发现第一层的字符串是‘我’和‘大’。
2. 字符‘我’能够在模型中匹配到,继续获取目标文本的下一个字符‘是’,发现第二层也是‘是’,也是匹配上了,依次是‘张’、‘三’。
3. 通过步骤2我们可以断定目标文本中“我是张三”是敏感词,记录下来。
4. 继续获取下一个字符,这里节省时间直接跳到‘大’的字符,发现可以和第一层的‘大’匹配上,然后获取目标文本中的下一个字符‘王’,也能够在模型中匹配上。
5. 这样整个匹配过程完成了,大家可能有疑问,那到底“大王”算不算敏感词呢?如果算,但是我们在定义敏感词的时候并没有“大王”;如果不算,但确实是匹配上了。
为了解决这个问题,我们在构建好的模型中加一个字段就可以解决这种摸棱两可的问题。
{
"我": {
"isEnd": false,