介绍
如何在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) { 试一试 {//从敏感词集合对象中取出敏感词并封装到设置集合中 Set keyWordSet=new HashSet (); (SensitiveWord s: sensitiveWords) { .trim keyWordSet.add (s.getContent () ()); }//将敏感词库加入到HashMap中 addSensitiveWordToHashMap (keyWordSet); } 捕获(异常e) { e.printStackTrace (); } 返回sensitiveWordMap; }/* * *封装敏感词库 * * @param keyWordSet */@SuppressWarnings (“rawtypes") 私人空间addSensitiveWordToHashMap (Set keyWordSet) {//初始化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算法过滤敏感词