在实际项目中我们经常将敏感词库保存在某个文件中,或者保存在数据库中,当我们需要判断某个字符串是否属于这些敏感词或者查询某个文本包含哪些敏感词。
我们的方案或许是下面的几种。
1.将数据库或者敏感词库文件中的敏感词拼接成一个字符串,然后使用indexOf方法判断,或者将敏感词放到一个Set中,利用contains方法,判断某个字符串是不在这个敏感词的set集合中。
2.将敏感词入数据库后通过SQL查询这个字符串是不是敏感词。
3.利用Lucene建立分词索引来查询。
本文介绍一种DFA算法(Deterministic Finite Automaton,确定有穷自动机)。
本文参考博文:http://blog.csdn.net/chenssy/article/details/26961957
感谢该博主提供的算法,下面是我小小改下成个工具类在我工作中使用。
package com.wondertek.mobilevideo.portal.clt.webapp.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
*/
public class SensitiveWordUtil {
public static int minMatchTYpe = 1; // 最小匹配规则
public static int maxMatchType = 2; // 最大匹配规则
/**
* @
* @通过敏感词set集合构建敏感词库map
* @这个set集合可以通过数据库查询敏感词添加到set或者敏感词的文本库
* 读进来之后,添加到set,看自己实际项目是啥样的
*/
public static Map<String, String> addSensitiveWordToHashMap(Set<String> keyWordSet) {
Map<String, String> sensitiveWordMap = new HashMap<String, String>(keyWordSet.size());
String key = null;
Map nowMap = null;
Map<String, String> newWorMap = null;
Iterator<String> iterator = keyWordSet.iterator();
while (iterator.hasNext()) {
key = iterator.next(); // 关键字
nowMap = sensitiveWordMap;
for (