我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Java中使用DFA算法过滤敏感词

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Java中使用DFA算法过滤敏感词

怎么在Java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

具体实现:

 1、匹配大小写过滤
 2、匹配全角半角过滤
 3、匹配过滤停顿词过滤。
 4、敏感词重复词过滤。

例如:

支持如下类型类型过滤检测:

fuck 全小写

FuCk 大小写

fuck全角半角

f!!!u&c ###k 停顿词

fffuuuucccckkk 重复词

敏感词过滤的做法有很多,我简单描述我现在理解的几种:

①查询数据库当中的敏感词,循环每一个敏感词,然后去输入的文本中从头到尾搜索一遍,看是否存在此敏感词,有则做相

应的处理,这种方式讲白了就是找到一个处理一个。

优点:so easy。用java代码实现基本没什么难度。

缺点:这效率让我心中奔过十万匹草泥马,而且匹配的是不是有些蛋疼,如果是英文时你会发现一个很无语的事情,比如英文

a是敏感词,那我如果是一篇英文文档,那程序它妹的得处理多少次敏感词?谁能告诉我?

②传说中的DFA算法(有穷自动机),也正是我要给大家分享的,毕竟感觉比较通用,算法的原理希望大家能够自己去网上查查

资料,这里就不详细说明了。

优点:至少比上面那sb效率高点。

缺点:对于学过算法的应该不难,对于没学过算法的用起来也不难,就是理解起来有点gg疼,匹配效率也不高,比较耗费内存,

敏感词越多,内存占用的就越大。

③第三种在这里要特别说明一下,那就是你自己去写一个算法吧,或者在现有的算法的基础上去优化,这也是小Alan追求的至

高境界之一,如果哪位淫兄有自己的想法一定别忘了小Alan,可以加小Alan的QQ:810104041教小Alan两招耍耍。

二、代码实现

其目录结构如下:

怎么在Java中使用DFA算法过滤敏感词

其中resources资源目录中:

stopwd.txt :停顿词,匹配时间直接过滤。

wd.txt:敏感词库。

1、WordFilter敏感词过滤类

package org.andy.sensitivewdfilter;  import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set;  import org.andy.sensitivewdfilter.util.BCConvert;   public class WordFilter {    private static final FilterSet set = new FilterSet(); // 存储首字   private static final Map<Integer, WordNode> nodes = new HashMap<Integer, WordNode>(1024, 1); // 存储节点   private static final Set<Integer> stopwdSet = new HashSet<>(); // 停顿词   private static final char SIGN = '*'; // 敏感词过滤替换    static {     try {       long a = System.nanoTime();       init();       a = System.nanoTime() - a;       System.out.println("加载时间 : " + a + "ns");       System.out.println("加载时间 : " + a / 1000000 + "ms");     } catch (Exception e) {       throw new RuntimeException("初始化过滤器失败");     }   }    private static void init() {     // 获取敏感词     addSensitiveWord(readWordFromFile("wd.txt"));     addStopWord(readWordFromFile("stopwd.txt"));   }       private static List<String> readWordFromFile(String path) {     List<String> words;     BufferedReader br = null;     try {       br = new BufferedReader(new InputStreamReader(WordFilter.class.getClassLoader().getResourceAsStream(path)));       words = new ArrayList<String>(1200);       for (String buf = ""; (buf = br.readLine()) != null;) {         if (buf == null || buf.trim().equals(""))           continue;         words.add(buf);       }     } catch (Exception e) {       throw new RuntimeException(e);     } finally {       try {         if (br != null)           br.close();       } catch (IOException e) {       }     }     return words;   }       private static void addStopWord(final List<String> words) {     if (words != null && words.size() > 0) {       char[] chs;       for (String curr : words) {         chs = curr.toCharArray();         for (char c : chs) {           stopwdSet.add(charConvert(c));         }       }     }   }       private static void addSensitiveWord(final List<String> words) {     if (words != null && words.size() > 0) {       char[] chs;       int fchar;       int lastIndex;       WordNode fnode; // 首字母节点       for (String curr : words) {         chs = curr.toCharArray();         fchar = charConvert(chs[0]);         if (!set.contains(fchar)) {// 没有首字定义           set.add(fchar);// 首字标志位 可重复add,反正判断了,不重复了           fnode = new WordNode(fchar, chs.length == 1);           nodes.put(fchar, fnode);         } else {           fnode = nodes.get(fchar);           if (!fnode.isLast() && chs.length == 1)             fnode.setLast(true);         }         lastIndex = chs.length - 1;         for (int i = 1; i < chs.length; i++) {           fnode = fnode.addIfNoExist(charConvert(chs[i]), i == lastIndex);         }       }     }   }       public static final String doFilter(final String class="lazy" data-src) {     char[] chs = class="lazy" data-src.toCharArray();     int length = chs.length;     int currc;     int k;     WordNode node;     for (int i = 0; i < length; i++) {       currc = charConvert(chs[i]);       if (!set.contains(currc)) {         continue;       }       node = nodes.get(currc);// 日 2       if (node == null)// 其实不会发生,习惯性写上了         continue;       boolean couldMark = false;       int markNum = -1;       if (node.isLast()) {// 单字匹配(日)         couldMark = true;         markNum = 0;       }       // 继续匹配(日你/日你妹),以长的优先       // 你-3 妹-4 夫-5       k = i;       for (; ++k < length;) {         int temp = charConvert(chs[k]);         if (stopwdSet.contains(temp))           continue;         node = node.querySub(temp);         if (node == null)// 没有了           break;         if (node.isLast()) {           couldMark = true;           markNum = k - i;// 3-2         }       }       if (couldMark) {         for (k = 0; k <= markNum; k++) {           chs[k + i] = SIGN;         }         i = i + markNum;       }     }      return new String(chs);   }         public static final boolean isContains(final String class="lazy" data-src) {     char[] chs = class="lazy" data-src.toCharArray();     int length = chs.length;     int currc;     int k;     WordNode node;     for (int i = 0; i < length; i++) {       currc = charConvert(chs[i]);       if (!set.contains(currc)) {         continue;       }       node = nodes.get(currc);// 日 2       if (node == null)// 其实不会发生,习惯性写上了         continue;       boolean couldMark = false;       if (node.isLast()) {// 单字匹配(日)         couldMark = true;       }       // 继续匹配(日你/日你妹),以长的优先       // 你-3 妹-4 夫-5       k = i;       for (; ++k < length;) {         int temp = charConvert(chs[k]);         if (stopwdSet.contains(temp))           continue;         node = node.querySub(temp);         if (node == null)// 没有了           break;         if (node.isLast()) {           couldMark = true;         }       }       if (couldMark) {         return true;       }     }      return false;   }       private static int charConvert(char class="lazy" data-src) {     int r = BCConvert.qj2bj(class="lazy" data-src);     return (r >= 'A' && r <= 'Z') ? r + 32 : r;   }  }

其中:

isContains :是否包含敏感词
doFilter:过滤敏感词

2、WordNode敏感词节点

package org.andy.sensitivewdfilter;  import java.util.LinkedList; import java.util.List;   public class WordNode {    private int value; // 节点名称    private List<WordNode> subNodes; // 子节点    private boolean isLast;// 默认false    public WordNode(int value) {     this.value = value;   }    public WordNode(int value, boolean isLast) {     this.value = value;     this.isLast = isLast;   }       private WordNode addSubNode(final WordNode subNode) {     if (subNodes == null)       subNodes = new LinkedList<WordNode>();     subNodes.add(subNode);     return subNode;   }       public WordNode addIfNoExist(final int value, final boolean isLast) {     if (subNodes == null) {       return addSubNode(new WordNode(value, isLast));     }     for (WordNode subNode : subNodes) {       if (subNode.value == value) {         if (!subNode.isLast && isLast)           subNode.isLast = true;         return subNode;       }     }     return addSubNode(new WordNode(value, isLast));   }    public WordNode querySub(final int value) {     if (subNodes == null) {       return null;     }     for (WordNode subNode : subNodes) {       if (subNode.value == value)         return subNode;     }     return null;   }    public boolean isLast() {     return isLast;   }    public void setLast(boolean isLast) {     this.isLast = isLast;   }    @Override   public int hashCode() {     return value;   }  }

关于怎么在Java中使用DFA算法过滤敏感词问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Java中使用DFA算法过滤敏感词

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Java中使用DFA算法过滤敏感词

怎么在Java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现: 1、匹配大小写过滤 2、匹配全角半角过滤 3、匹配过滤停顿词过滤。 4、敏
2023-05-30

如何在java中使用DFA算法过滤敏感词

如何在java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。敏感词过滤的做法有很多,我简单描述我现在理解的几种:①查询数据库当中的敏感词,循环每一
2023-05-31

Java怎么使用DFA算法实现敏感词过滤

本篇内容主要讲解“Java怎么使用DFA算法实现敏感词过滤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用DFA算法实现敏感词过滤”吧!1 前言敏感词过滤就是你在项目中输入某些字(
2023-07-05

Java使用DFA算法实现敏感词过滤的示例代码

很多项目中都会有一个敏感词管理模块,本文主要介绍了Java使用DFA算法实现敏感词过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-24

Python基于DFA算法怎么实现内容敏感词过滤

这篇文章主要讲解了“Python基于DFA算法怎么实现内容敏感词过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于DFA算法怎么实现内容敏感词过滤”吧!DFA 算法是通过提前
2023-06-30

如何在Java项目中利用DFA算法实现一个过滤敏感字功能

这期内容当中小编将会给大家带来有关如何在Java项目中利用DFA算法实现一个过滤敏感字功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。模式图直接上代码public class KeywordFilter
2023-05-31

SpringBoot使用前缀树过滤敏感词的方法是什么

这篇文章跟大家分析一下“SpringBoot使用前缀树过滤敏感词的方法是什么”。内容详细易懂,对“SpringBoot使用前缀树过滤敏感词的方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着
2023-06-26

PHP中怎么使用Ajax判断是否有敏感词汇并过滤

这篇文章给大家介绍PHP中怎么使用Ajax判断是否有敏感词汇并过滤,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。敏感词汇数组sensitive.phpreturn array ( 0 => 111111,
2023-06-04

怎么在java中使用Filter实现过滤

今天就跟大家聊聊有关怎么在java中使用Filter实现过滤,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应
2023-06-14

filter过滤器怎么在Java项目中使用

这篇文章将为大家详细讲解有关filter过滤器怎么在Java项目中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Filter过滤器技术。通过过滤器,可以对来自客户端的请求进行拦截,进行预
2023-05-31

怎么在java 项目中使用归并排序算法

怎么在java 项目中使用归并排序算法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。归并排序 归并排序,指的是将两个已经排序的序列合并成一个序列的操
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录