一、DFA算法介绍
在实现字符滤波的算法中,DFA是唯一比较好的实现算法。
DFA全部称为“Deterministic Finite Automaton”,确定有贫困机器人。 特征在于有限状态的集合和从一个状态通向另一个状态的若干边,每一边都被标记着符号,其中一个状态是初始状态,一个状态是终结状态。 但是,与不确定的有限自动机不同,DFA中从相同状态出发的两个边缘标记不会具有相同的符号。
简而言之,事件和当前状态提供了以下状态: 也就是说,事件状态=下一个状态。 理解为系统中有多个节点,通过传递输入的事件,决定向另一个节点发送哪个根,节点很有限。
二、DEA算法实践敏感单词过滤
1 .敏感词典结构
用王八蛋和王八羔子这样敏感的词记述,首先构筑敏感的词典。 该词典名叫敏感地图,这两个词的二叉树结构如下。
hash表中的结构如下。
{
'王' :{
' isEnd':'0',
'八' :{
“小”:{
“子”:{
' isEnd':'1'
(,
' isEnd':'0'
(,
' isEnd':'0',
“鸡蛋”:{
' isEnd':'1'
}
}
}
}
如何用代码实现这个数据结构?
//*
*读取敏感词典,将敏感词放入HashSet,建立DFA算法模型
*
* @param keyWordSet敏感词典
*/
publicmapaddsensitivewordtohashmap (setkeywordset )。
//初始化敏感的字容器,减少扩展操作
map map=new hashmap (math.max ((int ) ) keyWordSet.size )/.75f ) 1,16 );
重复keyWordSet
for (stringakeywordset : keywords et ) {
映射新映射=映射;
for(intI=0; i aKeyWordSet.length (; I ) {
转换为char类型
char keychar=akeyword set.charat (I;
//获取
objectwordmap=now map.get (keychar );
//如果该key存在,则直接分配值
世界地图!=空) {
新地图=(地图) wordMap;
} else { //不存在时,构建map,同时将isEnd设置为0
mapnewwormap=newHashmap(3;
newwormap.put('isend ','0' );
nowmap.put(keychar,newWorMap );
nowMap=newWorMap;
}
//判断最后
if(I==akeywordset.length ()- 1 ) {
nowmap.put('isend ','1' );
}
}
}
返回图;
}
2 .敏感词过滤
将上面的例子中制作的敏感映射表示为敏感词典,假设在此输入的关键字是“王八不好”,则流程图如下。
如何用代码实现这个流程图逻辑?
//*
*检查字符串是否包含敏感字符
*
* @param txt输入的字符串
* @如果* @return存在,则返回机密字符串; 如果不存在,则返回空字符串
*/
publicstaticstringfindsensitiveword {
sensitivewordinitsensitivewordinit=springcontextholder.get bean (sensitivewordinit.class );
mapsensitivewordmap=sensitivewordinit.getsensitivewordmap (;
stringbuildersensitiveword=new stringbuilder (;
//敏感词结束标志比特表示匹配了最后一个比特
布尔标志=假;
for(intI=0; i txt.length (; I ) {
charword=txt.Charat(I;
//获取指定密钥
sensitivewordmap=(map ) sensitivewordmap.get ) word;
//不存在,直接回去没有敏感的语言
敏感视点映射==null (if ) {
布雷克;
}
//存在,保存其敏感词语,判断是否是最后
敏感word.append (word;
//如果是最后的匹配规则,则结束循环
if(1).equals (敏感工具wordmap.get ) (isend ) ) )
标志=true;
布雷克;
}
}
//表示完全匹配了敏感的词语
if(flag==true ) {
return sensitiveWord.toString (;
}
返回' ';
}
三、优化思路
“文艺的兔蛋”这样的词,中间填着无意义的文字混淆在一起。 我们在搜索敏感词语时,也应该同样进行无意义的词语过滤,循环到这样无意义的文字时跳过,避免干扰。