转载:http://blog.shilimin.com/298.htm
package arrayDemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@SuppressWarnings( { "rawtypes", "unchecked" })
public class KeywordFilter {
/** 直接禁止的 */
private HashMap keysMap = new HashMap();
private int matchType = 1; // 1:最小长度匹配 2:最大长度匹配
public void addKeywords(List<String> keywords) {
for (int i = 0; i < keywords.size(); i++) {
String key = keywords.get(i).trim();
HashMap nowhash = null;
nowhash = keysMap;
for (int j = 0; j < key.length(); j++) {
char word = key.charAt(j);
Object wordMap = nowhash.get(word);
if (wordMap != null) {
nowhash = (HashMap) wordMap;
} else {
HashMap<String, String> newWordHash = new HashMap<String, String>();
newWordHash.put("isEnd", "0");
nowhash.put(word, newWordHash);
nowhash = newWordHash;
}
if (j == key.length() - 1) {
nowhash.put("isEnd", "1");
}
}
}
}
/**
* 重置关键词
*/
public void clearKeywords() {
keysMap.clear();
}
/**
* 检查一个字符串从begin位置起开始是否有keyword符合, 如果有符合的keyword值,返回值为匹配keyword的长度,否则返回零
* flag 1:最小长度匹配 2:最大长度匹配
*/
private int checkKeyWords(String txt, int begin, int flag) {
HashMap nowhash = null;
nowhash = keysMap;
int maxMatchRes = 0;
int res = 0;
int l = txt.length();
char word = 0;
for (int i = begin; i < l; i++) {
word = txt.charAt(i);
Object wordMap = nowhash.get(word);
if (wordMap != null) {
res++;
nowhash = (HashMap) wordMap;
if (((String) nowhash.get("isEnd")).equals("1")) {
if (flag == 1) {
wordMap = null;
nowhash = null;
txt = null;
return res;
} else {
maxMatchRes = res;
}
}
} else {
txt = null;
nowhash = null;
return maxMatchRes;
}
}
txt = null;
nowhash = null;
return maxMatchRes;
}
/**
* 返回txt中关键字的列表
*/
public Set<String> getTxtKeyWords(String txt) {
Set set = new HashSet();
int l = txt.length();
for (int i = 0; i < l;) {
int len = checkKeyWords(txt, i, matchType);
if (len > 0) {
set.add(txt.substring(i, i + len));
i += len;
} else {
i++;
}
}
txt = null;
return set;
}
/**
* 返回过滤违禁词后的列表,并且被替换为“*”
*/
public String getFilerWords(String txt) {
int l = txt.length();
String filterWords=txt;
for (int i = 0; i < l;) {
int len = checkKeyWords(txt, i, matchType);
if (len > 0) {
filterWords=filterWords.replaceAll(txt.substring(i, i + len),"*");
i += len;
} else {
i++;
}
}
return filterWords;
}
/**
* 仅判断txt中是否有关键字
*/
public boolean isContentKeyWords(String txt) {
for (int i = 0; i < txt.length(); i++) {
int len = checkKeyWords(txt, i, 1);
if (len > 0) {
return true;
}
}
txt = null;
return false;
}
public int getMatchType() {
return matchType;
}
public void setMatchType(int matchType) {
this.matchType = matchType;
}
public static void main(String[] args) {
KeywordFilter filter = new KeywordFilter();
List<String> keywords = new ArrayList<String>();//可以把这个列表变成word.properties文件(包含所有违禁词)
keywords.add("中国人");
keywords.add("黄色");
filter.addKeywords(keywords);
String txt = "中国人民站起来了,黄色";
boolean boo = filter.isContentKeyWords(txt);
System.out.println(boo);
Set set = filter.getTxtKeyWords(txt);
System.out.println(set);
System.out.println(filter.getFilerWords(txt));
}
}
相关推荐
在本文中,我们将探讨如何使用DFA(有穷自动机)算法在Java中实现敏感词过滤功能。敏感词过滤在许多应用程序中都是必要的,例如社交媒体、论坛或博客平台,以防止用户发布不当或有害的内容。以下是对DFA算法及其在...
`SensitivewordFilter.java` 文件很可能是实现敏感词过滤的核心类。在这个类中,可能会包含以下功能: 1. **初始化敏感词库**:首先,需要读取敏感词列表,如从配置文件、数据库或内存中加载。这些敏感词会被转换为...
例如,可以使用Java的HashMap或TreeMap实现。 3. 实现Aho-Corasick算法:需要对字符串操作和指针理解有一定要求,可以利用Java的StringBuilder或StringBuffer类。 4. 编写正则表达式:Java的Pattern和Matcher类可...
在Java中,我们可以使用以下几种方式来实现敏感词过滤: 1. **HashMap或TreeMap**:将敏感词库存储为HashMap或TreeMap,利用键值对的快速查找特性提高效率。遍历文本,对每个单词进行查找,如果在字典中找到,就...
在Java编程语言中实现敏感词检索,通常涉及到以下几个关键技术点: 1. **数据结构选择**:敏感词库通常包含大量词汇,为了高效地进行查找,会选择合适的数据结构来存储。常见的选择有数组、链表、哈希表(如HashMap...
HashMap是Java编程中非常重要的数据结构之一,它作为基于哈希表实现的Map接口实例,以键值对(key-value)的形式存储数据。HashMap的主要特点在于通过哈希算法快速定位到存储的位置,允许我们高效地插入、删除和查找...
在本文中,我们将详细介绍如何模拟Java的HashMap集合,使用数组和链表来实现Hash表的存储。我们将从基本概念开始,逐步深入到HashMap的实现细节中。 什么是HashMap? HashMap是一种基于散列表的数据结构,用于存储...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括Java)的习惯,这使得JSON对于程序员来说易于读写。本教程将深入讲解如何在Java...
### TF-IDF算法Java实现详解 #### 一、算法简介 TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索与文本挖掘中的权重计算公式。它通过统计单词在文档中出现的频率以及在整个文集中的频率...
- Java集合框架包括Set、List、Map接口,以及对应的实现类如HashSet、ArrayList、HashMap等。 - Java的并发库`java.util.concurrent`提供了线程安全的数据结构,如ConcurrentHashMap、ConcurrentLinkedQueue等。 ...
Java语言使用hashmap实现向购物车添加删除修改商品,显示商品信息
java代码-使用java解决手写hashMap的源代码 ——学习参考资料:仅用于个人学习使用!
此外,k-means算法在Java中的实现可以结合各种数据结构和算法,例如使用ArrayList或LinkedList存储数据点,使用HashMap或HashSet快速查找最近的质心。为了优化性能,还可以考虑多线程处理大规模数据。 总结,k-...
这个"springBoot-java敏感词语过滤类"是一个实用的工具类,用于帮助开发者实现在Java环境中对用户输入或者系统文本进行安全审查,防止不适当、非法或者有害的信息传播。这个工具类通常会包含一系列的方法,用于匹配...
通过这些课程,你可以学习如何分析和设计算法,理解其复杂度(如时间复杂度和空间复杂度),并能熟练地在Java代码中实现。 在实际开发中,了解和运用数据结构与算法可以显著提升软件的性能和可维护性。比如,在...
在Java中实现DFA算法,主要是通过构建状态转移图,来判断字符串中是否存在预定义的敏感词汇。 在给出的代码实例中,DFA算法被用于检测文本中的敏感词。首先,我们有一个`Keywords`类,它代表一个敏感词实体,包含一...