Java过滤敏感词汇算法(字典树)
定义节点
import java.util.ArrayList;
import java.util.List;public class Node {private char root;private List<Node> childList;private boolean isLeaf;public Node(char root){this.root=root;childList=new ArrayList<Node>();isLeaf=false;}public Node subNode(char c){if(childList != null){for(Node eachChild : childList){if(eachChild.root == c){return eachChild;}}}return null;}public boolean isLeaf() {return isLeaf;}public void setLeaf(boolean leaf) {isLeaf = leaf;}public void addChild(Node node){this.childList.add(node);}
}
定义字典树
public class WordsTree {private Node head;public WordsTree() {this.head = new Node(' ');//头结点}public void insert(String word) {if(search(word).equals(word)) return;//检测树中是否存在此词Node node = head;for (int i = 0; i < word.length(); i++) {Node child = node.subNode(word.charAt(i));if (child != null) {node = child;} else {node.addChild(new Node(word.charAt(i)));node = node.subNode(word.charAt(i));}}node.setLeaf(true);}public String search(String word) {Node node = this.head;String str = "";for (int i = 0; i < word.length(); i++) {if (node.isLeaf()) return str;//在这添加防止文章中的敏感词汇被空格(可以加其他字符)隔开,无法识别if (word.charAt(i) == ' ') {str += word.charAt(i);continue;}if (node.subNode(word.charAt(i)) == null) return "";node = node.subNode(word.charAt(i));str += word.charAt(i);}if (node.isLeaf() == true) return str;else return "";}public String searchComment(String comment) {String str = "";String comment1 = comment;for (int i = 0; i < comment.length(); i++) {str = this.search(comment.substring(i));if (!str.equals("")) {comment1 = comment1.replaceAll(str, "\\*\\*");}i += str.length();}return comment1;}
}
调用
public class main {public static void main(String[] args){WordsTree tree=new WordsTree();tree.insert("鲤鱼");tree.insert("他家");System.out.println(tree.searchComment("红鲤鱼家有头小绿驴叫李屡屡,绿鲤 鱼家有头小红驴叫吕里里,红鲤1鱼说他家的李屡屡要比绿鲤鱼家的吕里里绿,绿鲤鱼说他家的吕里里要比红鲤鱼家的李屡屡红,是红鲤鱼比绿鲤鱼的驴绿,还是绿鲤鱼比红鲤鱼的驴红。"));}
}
结果:
红**家有头小绿驴叫李屡屡,绿**家有头小红驴叫吕里里,红鲤1鱼说**的李屡屡要比绿**家的吕里里绿,绿**说**的吕里里要比红**家的李屡屡红,是红**比绿**的驴绿,还是绿**比红**的驴红。
可以看出用空格隔开的“鲤鱼”二字仍然被识别出来了,而用“1”隔开的“鲤鱼”二字没有被识别,在网上聊天的时候就是这样识别的,当一些词语无法发送的时候用一些常见字符隔开就可以发送了,“他家”两个字也可以检测出来。
Java过滤敏感词汇算法(字典树)相关推荐
- 过滤敏感词汇(trie树实现敏感词过滤)
1.字符串匹配 (1)暴力解法:采用两个for循环,每次匹配的时间复杂度O(m*n) (2)KMP:时间复杂度O(m+n) n表示字符串的长度,m表示每个灵感词的长度 (3)trie树 字典树/单词查 ...
- java实现前缀树--过滤敏感词汇
一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...
- 使用数据结构过滤敏感词算法
前缀树 名称:Tire.字典树.查找树 特点:查找效率高,消耗内存大 应用:字符串检索.词频统计.字符串排序等 敏感词过滤器 定义前缀树 package com.nowcoder.community. ...
- python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法
利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...
- 过滤器-过滤敏感词汇
首先要准备好敏感词库,敏感词汇的格式如下: |1 买枪|2 四大舰队|3 其中1代表禁用词:禁用词将禁止提交,2代表审核次:将以高亮字体显示,3代表过滤词:将替换为****, 过滤器代码实现如下: p ...
- flex java 全局拦截_flex + java 过滤敏感词
过滤敏感词这个相对比较容易做到,网上也很多方法,看得比较多的一个方法就是:把所有的敏感词写入到一个properties文件中,程序启动时拼成一个正则表达式.这个也只是比较基础的敏感词过滤器,比较强大的 ...
- 自学Java day53 使用jvav实现 字典树 数据结构 从jvav到架构师
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公 ...
- JAVA压缩之LZW算法字典压缩与解压
压缩过程: 前面已经写过一篇哈夫曼压缩,LZW字典压缩与哈夫曼压缩的不同之处在于不需要把编码写入文件,编码表是在读文件中生成的,首先将0-255个ASCLL码与对应的数字存入哈希表中,作为基础码表. ...
- python过滤敏感词汇_浅谈Python 敏感词过滤的实现
一个简单的实现 class NaiveFilter(): '''Filter Messages from keywords very simple filter implementation > ...
最新文章
- Active Directory还原工具之三Software Active Directory Recycle Bin PowerPack
- python turtle画熊-用Python Turtle 画可爱的熊猫
- Nginx之负载均衡
- big sur 降级_太阳报:若诺维奇降级,球员将降薪一半
- spring集成 JedisCluster 连接 redis3.0 集群
- c#和python同一主机直接udp_为什么Python 如此之慢
- 电脑怎么打字切换中文_Master of Typing in Chinese for Mac(中文打字大师)
- mac文件丢失,苹果电脑有没有好用的恢复软件?
- Win10修改EFI分区文件
- 算法第四版开发环境的配置
- 重装jdk时出错Error: could not open `C:\Program Files\Java\jre6\lib\amd64\jvm.cfg'
- 基于校园图书管理系统需求分析
- python爬虫之批量下载小说
- 暴走英雄坛服务器维护,《暴走英雄坛》4月29日更新公告
- 一文搞定 Spring Security 异常处理机制!
- CSP 201409-5 拼图问题(给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中......)
- Android 8.0 recovery 流程分析
- node js+sql 后端分页查询效率越来越低解决方案
- 继承 extends
- java jtextarea.setfont,Java JTextArea用法