import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
public class test {
/**
* 根节点
*/
private TreeNode rootNode = new TreeNode();
/**
* 关键词缓存
*/
private ByteBuffer keywordBuffer = ByteBuffer.allocate(1024);
/**
* 关键词编码
*/
private String charset = "utf-8";
/**
* 创建DFA
* @param keywordList
* @throws UnsupportedEncodingException
*/
public void createKeywordTree(List<String> keywordList) throws UnsupportedEncodingException{
for (String keyword : keywordList) {
if(keyword == null) continue;
keyword = keyword.trim();
byte[] bytes = keyword.getBytes(charset);
TreeNode tempNode = rootNode;
for (int i = 0; i < bytes.length; i++) {
int index = bytes[i] & 0xff;
TreeNode node = tempNode.getSubNode(index);
if(node == null){
node = new TreeNode();
tempNode.setSubNode(index, node);
}
tempNode = node;
if(i == bytes.length - 1){
tempNode.setKeywordEnd(true);
}
}
}
}
public String searchKeyword(String text) throws UnsupportedEncodingException{
return searchKeyword(text.getBytes(charset));
}
public String searchKeyword(byte[] bytes){
StringBuilder words = new StringBuilder();
if(bytes == null || bytes.length == 0){
return words.toString();
}
TreeNode tempNode = rootNode;
int rollback = 0;
int position = 0;
while (position < bytes.length) {
int index = bytes[position] & 0xFF;
keywordBuffer.put(bytes[position]);
tempNode = tempNode.getSubNode(index);
if(tempNode == null){
position = position - rollback;
rollback = 0;
tempNode = rootNode;
keywordBuffer.clear();
}
else if(tempNode.isKeywordEnd()){
keywordBuffer.flip();
for (int i = 0; i <= rollback; i++) {
bytes[position-i] = 42;
}
keywordBuffer.limit(keywordBuffer.capacity());
rollback = 1;
}else{
rollback++;
}
position++;
}
String result = null;
try {
result = new String(bytes,"utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void setCharset(String charset) {
this.charset = charset;
}
}
import java.util.ArrayList;
import java.util.List;
public class TreeNode {
private static final int NODE_LEN = 256;
/**
* true 关键词的终结 ; false 继续
*/
private boolean end = false;
private List<TreeNode> subNodes = new ArrayList<TreeNode>(NODE_LEN);
public TreeNode(){
for (int i = 0; i < NODE_LEN; i++) {
subNodes.add(i, null);
}
}
/**
* 向指定位置添加节点树
* @param index
* @param node
*/
public void setSubNode(int index, TreeNode node){
subNodes.set(index, node);
}
public TreeNode getSubNode(int index){
return subNodes.get(index);
}
public boolean isKeywordEnd() {
return end;
}
public void setKeywordEnd(boolean end) {
this.end = end;
}
}
分享到:
相关推荐
以下是对DFA算法及其在Java敏感词过滤中的应用的详细解释。 ### 一、敏感词过滤的重要性 敏感词过滤的目标是检测和处理用户输入中可能存在的敏感词汇。这可以防止不良信息的传播,维护网络环境的和谐。常见的做法...
在实际项目中,DFA算法实现的敏感词过滤可以有效避免误报和漏报,同时保证处理速度。考虑到性能,可能需要在内存和计算效率之间做出权衡,例如,通过压缩状态图来减少内存占用,或者使用启发式方法来优化搜索路径。 ...
在实际应用中,DFA算法的优点在于效率高,一旦进入某个敏感词的路径,就能立即识别出敏感词,无需回溯。但缺点是构建DFA的过程可能复杂,尤其是敏感词库庞大时。为了优化,可以使用压缩算法(如Trie树)或者预处理...
在这个例子中,`loadWords()`方法用于加载敏感词库,`filter()`方法则进行实际的过滤操作,将敏感词替换为星号(或其他指定的替换字符)。通过这种方式,开发者可以轻松地集成到自己的项目中,对用户输入或显示的...
高效敏感词过滤JAVA实现(DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...
例如,我们可以创建一个HashSet来存储敏感词,提高查找效率,然后遍历输入文本,对每个单词进行判断,如果发现敏感词,就按照预设规则进行替换,如替换为星号(*)或其他无意义的字符。 在处理过程中,有几点需要注意...
总结一下,这个实例展示了如何使用DFA算法和Java编程实现一个敏感词过滤系统。`SensitiveWordUtil`作为核心工具类,负责构建和操作DFA,`censorwords.prop`文件则是敏感词的来源。这样的系统能够有效地在文本处理...
egg插件,敏感词判断,替换,使用DFA算法
总的来说,ThinkPHP5敏感词过滤类结合DFA算法,为Web开发者提供了一种有效且高效的手段来防止不合适的敏感内容出现在网站上。这不仅有助于维护网站的合规性,还能保护用户免受不良信息的影响,对于构建健康、安全的...
总结,"java敏感词过滤"是一个轻量级的Java解决方案,利用DFA算法高效地处理敏感词过滤任务。开发者可以通过理解这两个核心类和敏感词文件的格式,轻松地将其集成到自己的项目中,以满足内容审查或合规性的需求。
本资源为实战总结资源,开...1、基于自定义注解+DFA算法,实现自定义敏感词过滤、自定义字符替换; 2、两种注解方式:方法参数注解、实体类注解 3、两种用户体验模式:告诉用户存在哪些敏感词、替换敏感词为自定义字符
用C++写的比较简单的敏感词过滤程序,涉及到几个简单的算法和一些容器使用
高效敏感词过滤JAVA实现(DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...
总结来说,这个Java敏感词过滤源码是基于DFA和Trie树算法实现的,可以高效地在文本中检测和处理敏感词汇。对于需要在Java环境中进行文本审核或内容过滤的开发者来说,这是一个非常有价值的资源。通过深入理解和修改...
该项目是一款基于Java实现的敏感词过滤系统源码,包含60个文件,其中Java源文件41个,支持多种敏感词过滤算法,包括TTMP、DFA、DAT、hash bucket和Tire算法。系统提供文本高亮、过滤、判词、替换的接口支持,适用于...
本主题将深入探讨JavaScript如何实现敏感词过滤,特别关注DFA算法的应用。JavaScript作为浏览器端的主要脚本语言,提供了丰富的功能来处理文本数据,而敏感词过滤就是其中之一。 首先,理解敏感词过滤的基本概念。...
编号 字符串长度 不替换敏感词[replace:false] 替换敏感词 1 1000 2 5000 3 10000 4 20000 5 50000 6 100000 与DFA算法对比 Aho-Corasick算法 DFA算法 算法效率 多模式串时表现良好 单模式串时表现良好 内存...
总之,"敏感词屏蔽"和"DFA算法"在IT行业,特别是网络内容管理和安全领域中起着至关重要的作用。通过对敏感词包的处理,利用DFA进行快速匹配,可以在不影响用户体验的前提下,有效维护网络环境的和谐与秩序。
使用DFA算法实现的敏感词过滤。主要用于实现数据文本的内容安全,反垃圾,智能鉴黄,敏感词过滤,不良信息检测,携带文本的关键词获取。 过滤SQL脚本 过滤中文字符 过滤英文字符 过滤script标签 过滤html标签 过滤数字 ...