Android 敏感词过滤实现
今天公司提出来一个在手机端输入文字的时候直接过滤敏感词并替换成“”的需求。想想很简单嘛,不就是把EditText的内容拿到,然后转换成char[],再和敏感词库的一一对比。网上应该有很多才对。所以就直接百度了一下,敏感词过滤,网上果然很多,而且大部分都是提出使用DFA算法,我**,牵扯到算法啊,好高大上的感觉有没有,于是认真的看看简介.
(图是我从别人那抄来的)
看到这张图是不是很熟悉,树形结构。于是开始copy(能抄的时候从来不动脑子去写)别人的代码过来修改修改就能用。
public class SensitiveWordsUtils {
/**
* 敏感词匹配规则
*/
public static final int MinMatchTYpe = 1; //最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人
public static final int MaxMatchType = 2; //最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]
/**
* 敏感词集合
*/
public static HashMap sensitiveWordMap;
/**
* 初始化敏感词库,构建DFA算法模型
*
* @param
*/
public static synchronized void init(Context context) {
try {
initSensitiveWordMap(context);
} catch (Exception e) {
e.printStackTrace();
}
}
//这里直接从asstes读敏感词文件,然后加入到set集合
public static Set<String> readSensitiveWordFile(Context context) throws Exception{
Set<String> set = null;
InputStreamReader read = new InputStreamReader(context.getResources().getAssets().open(“文件名称”),"UTF-8");
try {
set = new HashSet<String>();
BufferedReader bufferedReader = new BufferedReader(read);
String txt = null;
while((txt = bufferedReader.readLine()) != null){
//读取文件,将文件内容放入到set中
set.add(txt);
}
} catch (Exception e) {
throw e;
}finally{
read.close(); //关闭文件流
}
Log.e("ryan","set=="+set.toString());
return set;
}
/**
* 初始化敏感词库,构建DFA算法模型
*
*/
private static void initSensitiveWordMap(Context context) throws Exception {
Set<String> sensitiveWordSet = readSensitiveWordFile(context);
//初始化敏感词容器,减少扩容操作
if (null != sensitiveWordSet && sensitiveWordSet.size() > 0){
sensitiveWordMap = new HashMap(sensitiveWordSet.size());
String key;
Map nowMap;
Map<String, String> newWorMap;
//迭代sensitiveWordSet
Iterator<String> iterator = sensitiveWordSet.iterator();
while (iterator.hasNext()) {