1.DFA算法
DFA算法的原理可以参考 这里,简单来说就是通过Map构造出一颗敏感词树,树的每一条由根节点到叶子节点的路径构成一个敏感词,例如下图:
代码简单实现如下:
public class TextFilterUtil { //日志 private static final Logger LOG = LoggerFactory.getLogger(TextFilterUtil.class); //敏感词库 private static HashMap sensitiveWordMap = null; //默认编码格式 private static final String ENCODING = "gbk"; //敏感词库的路径 private static final InputStream in = TextFilterUtil.class.getClassLoader().getResourceAsStream("sensitive/keyWords.txt"); /** * 初始化敏感词库 */ private static void init() { //读取文件 Set<String> keyWords = readSensitiveWords(); //创建敏感词库 sensitiveWordMap = new HashMap<>(keyWords.size()); for (String keyWord : keyWords) { createKeyWord(keyWord); } } /** * 构建敏感词库 * * @param keyWord */ private static void createKeyWord(String keyWord) { if (sensitiveWordMap == null) { LOG.error("sensitiveWordMap 未初始化!"); return; } Map nowMap = sensitiveWordMap; for (Character c : keyWord.toCharArray()) { Object obj = nowMap.get(c); if (obj == null) { Map<String, Object> childMap = new HashMap<>(); childMap.put("isEnd", "false"); nowMap.put(c, childMap); nowMap = childMap; } else { nowMap = (Map) obj; } } nowMap.put("isEnd", "true"); } /** * 读取敏感词文件 * * @return */ private static Set<String> readSensitiveWords() { Set<String> keyWords = new HashSet<>(); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(in, ENCODING)); String line; while ((line = reader.readLine()) != null) { keyWords.add(line.trim()); } } catch (UnsupportedEncodingException e) { LOG.error("敏感词库文件转码失败!"); } catch (FileNotFoundException e) { LOG.error("敏感词库文件不存在!"); } catch (IOException e) { LOG.error("敏感词库文件读取失败!"); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } reader = null; } } return keyWords; } /** * 检查敏感词 * * @return */ private static List<String> checkSensitiveWord(String text) { if (sensitiveWordMap == null) { init(); } List<String> sensitiveWords = new ArrayList<>(); Map nowMap = sensitiveWordMap; for (int i = 0; i < text.length(); i++) { Character word = text.charAt(i); Object obj = nowMap.get(word); if (obj == null) { continue; } int j = i + 1; Map childMap = (Map) obj; while (j < text.length()) { if ("true".equals(childMap.get("isEnd"))) { sensitiveWords.add(text.substring(i, j)); } obj = childMap.get(text.charAt(j)); if (obj != null) { childMap = (Map) obj; } else { break; } j++; } } return sensitiveWords; } }
2.TTMP算法
TTMP算法由网友原创,关于它的起源可以查看 这里,TTMP算法的原理是将敏感词拆分成“脏字”的序列,只有待比对字符串完全由“脏字”组成时,才去判断它是否为敏感词,减少了比对次数。这个算法的简单实现如下:
public class TextFilterUtil { //日志 private static final Logger LOG = LoggerFactory.getLogger(TextFilterUtil.class); //默认编码格式 private static final String ENCODING = "gbk"; //敏感词库的路径 private static final InputStream in = TextFilterUtil.class.getClassLoader().getResourceAsStream("sensitive/keyWords.txt"); //脏字库 private static Set<Character> sensitiveCharSet = null; //敏感词库 private static Set<String> sensitiveWordSet = null; /** * 初始化敏感词库 */ private static void init() { //初始化容器 sensitiveCharSet = new HashSet<>(); sensitiveWordSet = new HashSet<>(); //读取文件 创建敏感词库 readSensitiveWords(); } /** * 读取本地的敏感词文件 * * @return */ private static void readSensitiveWords() { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(in, ENCODING)); String line; while ((line = reader.readLine()) != null) { String word = line.trim(); sensitiveWordSet.add(word); for (Character c : word.toCharArray()) { sensitiveCharSet.add(c); } } } catch (UnsupportedEncodingException e) { LOG.error("敏感词库文件转码失败!"); } catch (FileNotFoundException e) { LOG.error("敏感词库文件不存在!"); } catch (IOException e) { LOG.error("敏感词库文件读取失败!"); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } reader = null; } } return; } /** * 检查敏感词 * * @return */ private static List<String> checkSensitiveWord(String text) { if (sensitiveWordSet == null || sensitiveCharSet == null) { init(); } List<String> sensitiveWords = new ArrayList<>(); for (int i = 0; i < text.length(); i++) { Character word = text.charAt(i); if (!sensitiveCharSet.contains(word)) { continue; } int j = i; while (j < text.length()) { if (!sensitiveCharSet.contains(word)) { break; } String key = text.substring(i, j + 1); if (sensitiveWordSet.contains(key)) { sensitiveWords.add(key); } j++; } } return sensitiveWords; } }
注:以上代码实现仅用于展示思路,在实际使用中还有很多地方可以优化。
相关推荐
从提供的文件内容来看,本文是一篇关于Java Web技术研究的文章,主要介绍了一种基于Java Web的敏感词过滤系统的实现方法。该系统通过自动识别和阻断含有敏感词的聊天内容,并将敏感词替换为特定的符号或关键词,以...
本文主要探讨了一种基于Java Web的敏感词过滤方法的研究与实现,旨在为网络平台提供安全、高效的内容过滤解决方案。 首先,我们要理解Java Web的基本概念。Java Web是Java技术在Web应用中的应用,它包括了Servlet、...
标题中的“基于SpringBoot实现的博客系统”是一个使用SpringBoot框架构建的Web应用程序,它集成了多种功能,如评论、留言、简历编写和下载以及敏感词过滤。SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...
包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...
在`TestSensitiveWdFilter.java`文件中,`TestFilter()`方法应该是测试敏感词过滤功能的入口。通常,这个方法会包含创建DFA对象,加载敏感词库,然后对一段待检查的文本调用过滤方法进行检测。例如: ```java ...
**敏感词过滤算法** 敏感词过滤通常涉及到字符串搜索和替换。一种常见的方法是使用哈希表或者字典存储敏感词,然后遍历输入文本,逐个字符或单词地与敏感词表进行比较。如果找到匹配项,就用预设的替换词替换。在这...
5. **敏感词过滤**:项目中可能包含敏感词过滤功能,用于防止不当言论的发布,这通常通过预定义的敏感词列表和字符串匹配算法实现。 6. **文件组织结构**: - `MyForum.iml`:这是IntelliJ IDEA项目配置文件,用于...
为了防止恶意评论,博客系统通常会有审核机制,比如启用验证码或设置敏感词过滤。 除此之外,搜索功能也是不可或缺的,用户可以通过关键词搜索感兴趣的文章。后台需要实现全文检索或关键字匹配算法,以提高搜索效率...
“敏感词过滤”是网站为了维护社区环境和防止不良信息传播而实施的一种机制。通常,网站会建立一个敏感词库,当用户输入的文字中包含敏感词汇时,系统会自动屏蔽或替换这些词汇。这可能涉及到文本处理、字符串匹配...
3. 对于大量数据的处理,考虑优化过滤性能,例如使用高效的字符串匹配算法或使用正则表达式。 综上所述,"javaWeb实现的过滤器敏感字过滤"项目通过使用JavaWeb过滤器技术,有效地防止了敏感字符的传播,提高了应用...
尤其在敏感词过滤方面,通过算法设计和程序编码,有效地确保了论坛内容的健康性。Ajax技术的使用,提升了用户的交互体验,实现了无刷新的页面内容更新。 论文研究过程中,刘冠军同学对数据库系统理论也进行了深入...
在开发Web应用,尤其是搭建论坛或社区类网站时,关键字过滤是一个重要的功能模块。它主要用于防止用户发布含有敏感词汇或不适宜内容的信息,确保网络环境的健康与和谐。本项目中,我们关注的是如何在JSP(Java ...
综上所述,"Filter.zip"中的实现结合了Java的Servlet过滤器、IO流操作和敏感词处理策略,为处理网络内容的敏感词汇过滤提供了一个基础框架。这样的设计有助于提高应用程序的安全性和合规性,同时减少不适当内容的...
可自行定义干扰字、无意义字、敏感词过滤列表。如:啊、唉、个、了等无意义的以及煸动、反动、黄色和侵害他人的汉字、词组及英文。 本人已经测试可用。 注意两点: 1、没有注册的版本只支持25个字以内的分词。 2、...
IP追溯、数字过滤、火星文过滤、自定义提示语、直接拦截等功能,加上利用正则制作的黑词列表和敏感词列表,帮助您更好拦截SPAM 支持智能手机管理博客 手机wap功能进一步增强,支持图片上传,支持文章管理,支持...
为了维护社区的健康环境,Tipask系统应有内容审核机制,如过滤敏感词、防止灌水等。源码中可能会包含文本处理库,用于执行这些任务。 6. **通知与消息推送** 系统需要实时通知用户有关他们的问题或答案的更新,这...
1. **字典树算法**:用于实现敏感词过滤。字典树是一种高效的字符串匹配数据结构,它能快速查找字符串集合中的单词。在本系统中,当用户发表内容时,会自动检测是否包含预设的敏感词列表中的词汇。 2. **权值计算*...