Java 敏感词过滤 DFA有穷自动机

  • 初始化敏感词
  • 构建树
  • 查询
  • 完整代码如下
  • 后记

初始化敏感词

使用set集合,可以查询数据库。

 /*** 初始化值* @return*/private static Set<String> getKeySet() {HashSet<String> set = new HashSet<>(3);//敏感词 河南 编码 0.3300set.add("河南0.3300");set.add("河北0.3200");set.add("北京0.1000");return set;}

构建树

将set集合中的数据构建成树,方便查询;树如图所示:

/*** 构建树*/public static void add() {keySet = getKeySet();String key;Map nowMap;Map<String, String> newWordMap;Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {//北京0.1000key = iterator.next();nowMap = cityMap;for (int i = 0; i < key.length(); i++) {char keyChar = key.charAt(i);//获取敏感词idif('0'==keyChar && '.'==key.charAt(i+1)){nowMap.put("isEnd", "1");nowMap.put("id",key.substring(i));break;}else {Object wordMap = nowMap.get(keyChar);if (wordMap != null) {nowMap = (Map) wordMap;} else {newWordMap = new HashMap<>();newWordMap.put("isEnd", "0");nowMap.put(keyChar, newWordMap);nowMap = newWordMap;}}}}}

查询

传入要匹配的字符串,如果匹配到了就返回敏感词id(仅匹配一个敏感词)

/*** 匹配txt是否含有对应字段* @param txt* @return*/public static String check(String txt) {if (cityMap.size() == 0) {add();}int matchFlag = 0;char word;Map nowMap = cityMap;for (int i = 0; i < txt.length(); i++) {word = txt.charAt(i);if (nowMap.get(word) != null) {nowMap = (Map) nowMap.get(word);matchFlag++;if ("1".equals(nowMap.get("isEnd"))) {return nowMap.get("id").toString();}}else {i-=matchFlag;matchFlag=0;nowMap = cityMap;}}return "0.";}
}

完整代码如下

/*** @projectName XXXX* @package com.XXXX.system* @className com.XXXX.system.CityTree* @copyright Copyright 2021 XXXX, Inc All rights reserved.*/
package com.XXXX.system;import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*** CityTree* @description 构建城市省份查询树,用于根据企业名称查找企业所在省份* @author XXX* @date 2022/10/17 17:38* @version 1.0*/
public class CityTree {private static Map<String, Object> cityMap = new HashMap(6);private static Set<String> keySet;/*** 构建树*/public static void add() {keySet = getKeySet();String key;Map nowMap;Map<String, String> newWordMap;Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) {//北京0.1000key = iterator.next();nowMap = cityMap;for (int i = 0; i < key.length(); i++) {char keyChar = key.charAt(i);//获取idif('0'==keyChar && '.'==key.charAt(i+1)){nowMap.put("isEnd", "1");nowMap.put("id",key.substring(i));break;}else {Object wordMap = nowMap.get(keyChar);if (wordMap != null) {nowMap = (Map) wordMap;} else {newWordMap = new HashMap<>();newWordMap.put("isEnd", "0");nowMap.put(keyChar, newWordMap);nowMap = newWordMap;}}}}}/*** 初始化值* @return*/private static Set<String> getKeySet() {HashSet<String> set = new HashSet<>(3);//敏感词 河南 编码 0.3300set.add("河南0.3300");set.add("河北0.3200");set.add("北京0.1000");return set;}/*** 匹配txt是否含有对应字段* @param txt* @return*/public static String check(String txt) {if (cityMap.size() == 0) {add();}int matchFlag = 0;char word;Map nowMap = cityMap;for (int i = 0; i < txt.length(); i++) {word = txt.charAt(i);if (nowMap.get(word) != null) {nowMap = (Map) nowMap.get(word);matchFlag++;if ("1".equals(nowMap.get("isEnd"))) {return nowMap.get("id").toString();}}else {i-=matchFlag;matchFlag=0;nowMap = cityMap;}}return "";}
}

后记

1.查询方法可根据不同的需求修改为匹配多个敏感词、修改敏感词等
2.构建树方法可修改为不要id,仅构建敏感词树

Java 敏感词过滤(DFA有穷自动机)相关推荐

  1. 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现

    文章目录 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 代码如下 package utils;import com.goo ...

  2. 对敏感词过滤(DFA算法)的思考与理解

    对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...

  3. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

  4. DFA算法:简易Java敏感词过滤(含源文件和上万敏感词列表)

    敏感词过滤说白了就是简单的字符串替换,Java本身已经提供了相关函数,但是一旦遇到长文本,或者敏感词数量庞大,效率下降就会非常明显.本文将介绍利用多叉树进行敏感词存储和过滤的方法. 多叉树 多叉树是一 ...

  5. java敏感词过滤源代码_Java实现敏感词过滤代码

    importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStr ...

  6. Java敏感词过滤、java关键词过滤工具包原理

    原理:基于多叉树的查找. 第一步:把敏感词读入搜索多叉树中, 树结构: 第二步,对需过滤的句子进行逐字匹配: 比如句子:解放了全中国 1.记录起始位置start=0,读到了"解", ...

  7. java使用DFA算法实现敏感词过滤

    Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...

  8. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  9. 敏感词之 DFA 算法

    敏感词之 DFA 算法 常用算法 遍历匹配 将输入的词语,与词库中的敏感词逐个字符遍历,对比是否包含 优点:思路简单,易于实现(KMP 算法,Brute-Force 算法) 缺点:当词库数目非常大时, ...

最新文章

  1. nginx+tomcat配置负载均衡集群
  2. Assembly--及相关内容
  3. 太励志!80 后草根创业者自学编程年收入上亿
  4. oracle cost cardinality,ORACLE 执行计划中cost cardinality bytes cpu_cost io_cost解释
  5. 中国饲用微生态制剂行业十四五研发方向与专项应用调研报告2022年
  6. Matplotlib 2016-04-15
  7. PWN-PRACTICE-BUUCTF-3
  8. java httpclient form_Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)...
  9. 拓端tecdat|R语言泊松Poisson回归模型分析案例
  10. 【蓝桥杯】历年真题题目及题解汇总
  11. 几个提高睡眠质量的方法。
  12. 苹果手机升级13无法开机_苹果手机升级系统后无法开机怎么办?快拿出你的小本本来做笔记吧...
  13. 关于html中的图片居中问题
  14. JAVA java学习(9)——————java常用开发工具介绍
  15. python技巧:如何使用Python对音频进行特征提取?
  16. GPU 编程与CG 语言之阳春白雪下里巴人——CG学习读书笔记之数学函数(之一)。
  17. 功率半导体的正负温度系数
  18. 年入800万!韩国第一虚拟网红的崛起
  19. 应届生嵌入式面试题总结——嵌入式基础
  20. 为什么您仍然不应该购买《星球大战:前线II》

热门文章

  1. 风口之上,AI教育的一场“文火慢炖”
  2. 2021-09-15 如何退出微信小程序
  3. 厚积薄发|迭代为什么叫冲刺?
  4. Downie 4.1.8 (4169) Mac 上视频下载工具
  5. 下面是刚颁布的《中国贫富标准线》,看看我们生活在哪个层次?
  6. 279. 完全平方数。
  7. GitHub 标星 20.8 K:超高颜值 Markdown 编辑器,爱了!
  8. Node.js 沙箱环境
  9. Android里的HTTP异常
  10. 【车载开发系列】CAN总线通信---总线报文格式