如何在java中使用DFA算法过滤敏感词

  介绍

如何在java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<>强敏感词过滤的做法有很多,我简单描述我现在理解的几种:

①查询数据库当中的敏感词,循环每一个敏感词,然后去输入的文本中从头到尾搜索一遍,看是否存在此敏感词,有则做相

应的处理,这种方式讲白了就是找到一个处理一个。

优点:如此简单。用java代码实现基本没什么难度。

缺点:这效率让我心中奔过十万匹草泥马,而且匹配的是不是有些蛋疼,如果是英文时你会发现一个很无语的事情,比如英文

是敏感词,那我如果是一篇英文文档,那程序它妹的得处理多少次敏感词?谁能告诉我?

②传说中的DFA算法(有穷自动机),也正是我要给大家分享的,毕竟感觉比较通用,算法的原理希望大家能够自己去网上查查

资料,这里就不详细说明了。

优点:至少比上面那某人效率高点。

缺点:对于学过算法的应该不难,对于没学过算法的用起来也不难,就是理解起来有点gg疼,匹配效率也不高,比较耗费内存,

敏感词越多,内存占用的就越大。

③第三种在这里要特别说明一下,那就是你自己去写一个算法吧,或者在现有的算法的基础上去优化,这也是追求的至高境界之一。

第一步:敏感词库初始化(将敏感词用DFA算法的原理封装到敏感词库中,敏感词库采用HashMap保存),代码如下:

包com.cfwx.rox.web.sysmgr.util;
  
  进口java.util.HashMap;
  进口java.util.HashSet;
  进口java.util.Iterator;
  进口并不知道;
  进口java.util.Map;
  进口java.util.Set;
  
  进口com.cfwx.rox.web.common.model.entity.SensitiveWord;/* *
  *敏感词库初始化
  *
  * @author AlanLee
  *
  */公开课SensitiveWordInit
  {/* *
  *敏感词库
  */公共HashMap sensitiveWordMap;/* *
  *初始化敏感词
  *
  * @return
  */公共地图initKeyWord (ListsensitiveWords)
  {
  试一试
  {//从敏感词集合对象中取出敏感词并封装到设置集合中
  SetkeyWordSet=new HashSet ();
  (SensitiveWord s: sensitiveWords)
  {
  .trim keyWordSet.add (s.getContent () ());
  }//将敏感词库加入到HashMap中
  addSensitiveWordToHashMap (keyWordSet);
  }
  捕获(异常e)
  {
  e.printStackTrace ();
  }
  返回sensitiveWordMap;
  }/* *
  *封装敏感词库
  *
  * @param keyWordSet
  */@SuppressWarnings (“rawtypes")
  私人空间addSensitiveWordToHashMap (SetkeyWordSet)
  {//初始化HashMap对象并控制容器的大小
  sensitiveWordMap=new HashMap (keyWordSet.size ());//敏感词
  字符串键=零;//用来按照相应的格式保存敏感词库数据
  地图nowMap=零;//用来辅助构建敏感词库
  String> Map<字符串;newWorMap=零;//使用一个迭代器来循环敏感词集合
  Iterator迭代器=keyWordSet.iterator ();
  而(iterator.hasNext ())
  {
  关键=iterator.next ();//等于敏感词库,HashMap对象在内存中占用的是同一个地址,所以此nowMap对象的变化,sensitiveWordMap对象也会跟着改变
  nowMap=sensitiveWordMap;
  for (int i=0;我& lt;key.length ();我+ +)
  {//截取敏感词当中的字,在敏感词库中字为HashMap对象的键键值
  char keyChar=key.charAt(我);//判断这个字是否存在于敏感词库中
  对象wordMap=nowMap.get (keyChar);
  如果(wordMap !=null)
  {
  wordMap nowMap=(地图);
  }
  其他的
  {
  newWorMap=new HashMap<字符串,String> ();
  newWorMap.put (“isEnd",“0”);
  nowMap。把(keyChar newWorMap);
  nowMap=newWorMap;
  }//如果该字是当前敏感词的最后一个字,则标识为结尾字
  如果(我==key.length () - 1)
  {
  nowMap.put (“isEnd",“1“);
  }
  System.out.println(“封装敏感词库过程:“+ sensitiveWordMap);
  }
  System.out.println(“查看敏感词库数据:“+ sensitiveWordMap);
  }
  }
  }

第二步:写一个敏感词过滤工具类,里面可以写上自己需要的方法,代码如下:

包com.cfwx.rox.web.sysmgr.util;
  
  进口java.util.HashSet;
  进口java.util.Iterator;
  进口java.util.Map;
  进口java.util.Set;/* *
  *敏感词过滤工具类
  *
  * @author AlanLee
  *
  */公开课SensitivewordEngine
  {/* *
  *敏感词库
  */公共静态地图sensitiveWordMap=零;/* *
  *只过滤最小敏感词
  */公共静态int minMatchTYpe=1;/* *
  *过滤所有敏感词
  */公共静态int maxMatchType=2;/* *
  *敏感词库敏感词数量
  *
  * @return
  */公共静态int getWordSize ()
  {
  如果(SensitivewordEngine。sensitiveWordMap==null)
  {
  返回0;
  }
  返回SensitivewordEngine.sensitiveWordMap.size ();
  }/* *
  *是否包含敏感词
  *
  * @param txt
  * @param matchType
  * @return
  */公共静态布尔isContaintSensitiveWord(字符串txt, int matchType)
  {
  布尔标志=false;
  for (int i=0;我& lt;txt.length ();我+ +)
  {
  int matchFlag=checkSensitiveWord (txt,我,matchType);
  如果(matchFlag比;0)
  {
  国旗=true;
  }
  }
  返回国旗;
  }/* *
  *获取敏感词内容
  *
  * @param txt
  * @param matchType
  * @return敏感词内容
  */公共静态Set

如何在java中使用DFA算法过滤敏感词