package com.fpx.pcs.prealert.process.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class KeywordFilter {

@SuppressWarnings("rawtypes")
public static int minMatchTYpe = 1; // 最小匹配规则
public static int maxMatchType = 2; // 最大匹配规则

private Map keywordsMap = new HashMap<>();

@SuppressWarnings({ "rawtypes", "unchecked" })
public void addKeywords(Set<String> keywordSet) {
String key = null;
Map nowMap = null;
Map<String, String> newWorMap = null;
// 迭代keyWordSet
Iterator<String> iterator = keywordSet.iterator();
while (iterator.hasNext()) {
key = iterator.next(); // 关键字
nowMap = keywordsMap;
for (int i = 0; i < key.length(); i++) {
char keyChar = key.charAt(i); // 转换成char型
Object wordMap = nowMap.get(keyChar); // 获取

if (wordMap != null) { // 如果存在该key,直接赋值
nowMap = (Map) wordMap;
} else { // 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
newWorMap = new HashMap<String, String>();
newWorMap.put("isEnd", "0"); // 不是最后一个
nowMap.put(keyChar, newWorMap);
nowMap = newWorMap;
}

if (i == key.length() - 1) {
nowMap.put("isEnd", "1"); // 最后一个
}
}
}
}

/**
* 判断文字是否包含敏感字符
*
* @author chenming
* @date 2014年4月20日 下午4:28:30
* @param txt
* 文字
* @param matchType
* 匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
* @return 若包含返回true,否则返回false
* @version 1.0
*/
public boolean isContaintKeyword(String content, int matchType) {
boolean flag = false;
for (int i = 0; i < content.length(); i++) {
int matchFlag = this.checkKeyword(content, i, matchType); // 判断是否包含敏感字符
if (matchFlag > 0) { // 大于0存在,返回true
flag = true;
}
}
return flag;
}

/**
* 获取文字中的敏感词
*
* @author chenming
* @date 2014年4月20日 下午5:10:52
* @param txt
* 文字
* @param matchType
* 匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
* @return
* @version 1.0
*/
public Set<String> getKeyword(String content, int matchType) {
Set<String> sensitiveWordList = new HashSet<String>();

for (int i = 0; i < content.length(); i++) {
int length = checkKeyword(content, i, matchType); // 判断是否包含敏感字符
if (length > 0) { // 存在,加入list中
sensitiveWordList.add(content.substring(i, i + length));
i = i + length - 1; // 减1的原因,是因为for会自增
}
}

return sensitiveWordList;
}

/**
* 替换敏感字字符
*
* @author chenming
* @date 2014年4月20日 下午5:12:07
* @param txt
* @param matchType
* @param replaceChar
* 替换字符,默认*
* @version 1.0
*/
public String replaceKeyword(String content, int matchType, String replaceChar) {
String resultTxt = content;
Set<String> set = getKeyword(content, matchType); // 获取所有的敏感词
Iterator<String> iterator = set.iterator();
String word = null;
String replaceString = null;
while (iterator.hasNext()) {
word = iterator.next();
replaceString = getReplaceChars(replaceChar, word.length());
resultTxt = resultTxt.replaceAll(word, replaceString);
}

return resultTxt;
}

/**
* 获取替换字符串
*
* @author chenming
* @date 2014年4月20日 下午5:21:19
* @param replaceChar
* @param length
* @return
* @version 1.0
*/
private String getReplaceChars(String replaceChar, int length) {
String resultReplace = replaceChar;
for (int i = 1; i < length; i++) {
resultReplace += replaceChar;
}

return resultReplace;
}

/**
* 检查文字中是否包含敏感字符,检查规则如下:<br>
*
* @author chenming
* @date 2014年4月20日 下午4:31:03
* @param txt
* @param beginIndex
* @param matchType
* @return,如果存在,则返回敏感词字符的长度,不存在返回0
* @version 1.0
*/
@SuppressWarnings({ "rawtypes" })
public int checkKeyword(String content, int beginIndex, int matchType) {
boolean flag = false; // 敏感词结束标识位:用于敏感词只有1位的情况
int matchFlag = 0; // 匹配标识数默认为0
char word = 0;
Map nowMap = keywordsMap;
for (int i = beginIndex; i < content.length(); i++) {
word = content.charAt(i);
nowMap = (Map) nowMap.get(word); // 获取指定key
if (nowMap != null) { // 存在,则判断是否为最后一个
matchFlag++; // 找到相应key,匹配标识+1
if ("1".equals(nowMap.get("isEnd"))) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
flag = true; // 结束标志位为true
if (KeywordFilter.minMatchTYpe == matchType) { // 最小规则,直接返回,最大规则还需继续查找
break;
}
}
} else { // 不存在,直接返回
break;
}
}
if (matchFlag < 2 || !flag) { // 长度必须大于等于1,为词
matchFlag = 0;
}
return matchFlag;
}

public static void main(String[] args) {
KeywordFilter filter = new KeywordFilter();
Set<String> keywords = new HashSet<String>();
keywords.add("主人公");
keywords.add("红酒");
keywords.add("中国人民");
filter.addKeywords(keywords);
System.out.println("关键字的数量:" + filter.keywordsMap.size());
String string = "太多的伤感情怀也许只局限于饲养基地 荧幕中的情节,主人公尝试着去用某种方式渐渐的很潇洒地释自杀指南怀那些自己经历的伤感。"
+ "然后 我们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把自己的情感也附加于银幕情节中,然后感动就流泪,"
+ "难过就躺在某一个人的怀里尽情的阐述心扉或者手机卡复制器一个人一杯红酒一部电影在夜三级片 深人静的晚上,关上电话静静的发呆着。";
System.out.println("待检测语句字数:" + string.length());
long beginTime = System.currentTimeMillis();
Set<String> set = filter.getKeyword(string, 1);
System.out.println("是否包含关键字:" + filter.isContaintKeyword(string, 1));
long endTime = System.currentTimeMillis();
System.out.println("语句中包含关键字的个数为:" + set.size() + "。包含:" + set);
System.out.println("总共消耗时间为:" + (endTime - beginTime));
}

}

java类敏感词过滤类的更多相关文章

  1. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  2. Java实现敏感词过滤(转)

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  3. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  4. Java实现敏感词过滤 - DFA算法

    Java实现DFA算法进行敏感词过滤 封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet); package cn.swf ...

  5. 转:Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  6. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  7. Java实现敏感词过滤代码

    原文:http://www.open-open.com/code/view/1445762764148 import java.io.BufferedReader; import java.io.Fi ...

  8. 敏感词过滤的算法原理之DFA算法

    参考文档 http://blog.csdn.net/chenssy/article/details/26961957 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有 ...

  9. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类   =========================== ©Copyright 蕃薯耀 2017年9月25日 http://www ...

随机推荐

  1. Xcode删除Project上层group

    本来想在Project下New Group,结果点了New group from selection, 结果在Project上级新建了一个group,邮件菜单中无删除项…… 解决方法: 1,关闭Xco ...

  2. python中,有关正则表达式re函数:compile、match、search、findall

    1.全局匹配函数 re.compile(pattern=pattern,re.S).findall(text)函数: compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对 ...

  3. 第4章 x86反汇编速成班

    4.1 抽象层次 硬件<微指令<机器码<低级语言<高级语言<解释型语言 4.2 逆向工程 4.3 x86体系结构 冯-诺依曼体系结构 中央处理器(CPU): 负责执行代码 ...

  4. IO流入门-第三章-FileInputStream_FileOutputStream复制

    利用FileInputStream和FileOutputStreamj进行复制粘贴 /* 文件复制粘贴 */ import java.io.*; public class FileInput_Outp ...

  5. Python高级教程-列表生成式

    List Comprehensions(列表生成式) 列表生成式,是Python内置的非常简单却强大的可以用来创建list的生成式. 例如,要生成list:[1,2,3,4,5,6,7,8,9,10] ...

  6. PHP使用Mongodb

    一.安装Mongodb的PHP扩展 wget http://pecl.php.net/get/mongo-1.2.7.tgz //下载扩展包tar zxvf mongo-1.2.7.tgzcd mon ...

  7. 解决127.0.0.1 localhost 劫持问题

    在一个安装iis的过程中,把网站部署上去之后就发现127.0.0.1或者localhost都会跳转到一个莫名的网站,发现断网之后就是会跳转到一个Http://www.76636.com 类似这种的网站 ...

  8. CRM项目问答总结

    1. 通过ChangeList封装好多数据 DA: 在stark组件中,有五个封装的大类: class FilterOption(object): ----用于封装组合搜索的配置信息(数据库字段,是否 ...

  9. C#字段属性设置

    键?指的是主键吗?,默认会有主键吗? 因为实体框架要求必须要有一个键属性.您可以使用键注释来指定要将哪一个属性用作 EntityKey. publicclass Blog { [Key] public ...

  10. 腾讯天猫经常出现这些低级的bug!

    对于程序员来说,bug很讨厌.每天重复着写代码.找bug.修改bug的动作.按理说互联网巨头的产品,bug应该比较少.但是实际上,无论是用百度.天猫.谷歌等产品,经常都会出现这些低级的bug,让人很火 ...