敏感词过滤在网站开发必不可少。一般用DFA,这种比较好的算法实现的.
参考链接:http://cmsblogs.com/?p=1031
一个比较好的代码实现:
1 import java.io.IOException; 2 import java.util.ArrayList; 3 import java.util.HashMap; 4 import java.util.List; 5 6 /** 7 * @title KeywordFilter 8 * @description TODO 9 * @author 10 * @date 2014-4-17 11 * @version 1.0 12 */ 13 public class KeywordFilter { 14 /** 敏感词集合 15 * {法={isEnd=0, 轮={isEnd=1}}, 中={isEnd=0, 国={isEnd=0, 人={isEnd=1}, 男={isEnd=0, 人={isEnd=1}}}}} 16 * */ 17 private HashMap keysMap = new HashMap(); 18 19 /** 20 * 添加敏感词 21 * @param keywords 22 */ 23 public void addKeywords(List<String> keywords) { 24 for (int i = 0; i < keywords.size(); i++) { 25 String key = keywords.get(i).trim(); 26 HashMap nowhash = keysMap;//初始从最外层遍历 27 for (int j = 0; j < key.length(); j++) { 28 char word = key.charAt(j); 29 Object wordMap = nowhash.get(word); 30 if (wordMap != null) { 31 nowhash = (HashMap) wordMap; 32 } else { 33 HashMap<String, String> newWordHash = new HashMap<String, String>(); 34 newWordHash.put("isEnd", "0"); 35 nowhash.put(word, newWordHash); 36 nowhash = newWordHash; 37 } 38 if (j == key.length() - 1) { 39 nowhash.put("isEnd", "1"); 40 } 41 } 42 } 43 } 44 45 /** 46 * 检查一个字符串从begin位置起开始是否有keyword符合, 47 * 如果没有,则返回0 48 * 如果有符合的keyword值,继续遍历,直至遇到isEnd = 1,返回匹配的keyword的长度, 49 */ 50 private int checkKeyWords(String txt, int begin) { 51 HashMap nowhash = keysMap; 52 int res = 0; 53 for (int i = begin; i < txt.length(); i++) { 54 char word = txt.charAt(i); 55 Object wordMap = nowhash.get(word);//得到该字符对应的HashMap 56 if (wordMap == null) { 57 return 0;//如果该字符没有对应的HashMap,return 0 58 } 59 60 res++;//如果该字符对应的HashMap不为null,说明匹配到了一个字符,+1 61 nowhash = (HashMap) wordMap;//将遍历的HashMap指向该字符对应的HashMap 62 if (((String) nowhash.get("isEnd")).equals("1")) {//如果该字符为敏感词的结束字符,直接返回 63 return res; 64 } else { 65 continue; 66 } 67 } 68 return res; 69 } 70 71 /** 72 * 判断txt中是否有关键字 73 */ 74 public boolean isContentKeyWords(String txt) { 75 for (int i = 0; i < txt.length(); i++) { 76 int len = checkKeyWords(txt, i); 77 if (len > 0) { 78 return true; 79 } 80 } 81 return false; 82 } 83 84 /** 85 * 返回txt中关键字的列表 86 */ 87 public List<String> getTxtKeyWords(String txt) { 88 List<String> list = new ArrayList<String>(); 89 int l = txt.length(); 90 for (int i = 0; i < l;) { 91 int len = checkKeyWords(txt, i); 92 if (len > 0) { 93 String tt = txt.substring(i, i + len); 94 list.add(tt); 95 i += len; 96 } else { 97 i++; 98 } 99 } 100 return list; 101 } 102 103 /** 104 * 初始化敏感词列表 105 * */ 106 public void initfiltercode() { 107 List<String> keywords = new ArrayList<String>(); 108 keywords.add("中国人"); 109 keywords.add("中国男人"); 110 keywords.add("法轮"); 111 this.addKeywords(keywords); 112 } 113 114 public static void main(String[] args) throws IOException { 115 KeywordFilter filter = new KeywordFilter(); 116 filter.initfiltercode(); 117 String txt = "哈哈,反倒是 法轮热舞功,中国人,"; 118 boolean boo = filter.isContentKeyWords(txt); 119 System.out.println(boo); 120 List<String> set = filter.getTxtKeyWords(txt); 121 System.out.println("包含的敏感词如下:" + set); 122 } 123 124 125 126 127 }
时间: 2024-10-08 21:23:37