java dfa_基于java实现DFA算法代码实例
DFA简介
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。(自己百度吧)
直接代码:
敏感词实体类
package com.nopsmile.dfa;
public class Keywords {
private String pid;
private String Content;
public Keywords() {
}
public Keywords(String content) {
super();
Content = content;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
}
敏感词库初始化
package com.nopsmile.dfa;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 敏感词库初始化
*
*/
public class SensitiveWordInit{
/**
* 敏感词库
*/
public HashMap sensitiveWordMap;
/**
* 初始化敏感词 keywords
*/
public Map initKeyWord(List sensitiveWords) {
try {
// 从敏感词集合对象中取出敏感词并封装到Set集合中
Set keyWordSet = new HashSet();
for (Keywords s : sensitiveWords) {
keyWordSet.add(s.getContent().trim());
}
// 将敏感词库加入到HashMap中
addSensitiveWordToHashMap(keyWordSet);
} catch (Exception e) {
e.printStackTrace();
}
return sensitiveWordMap;
}
/**
* 封装敏感词库
*/
private void addSensitiveWordToHashMap(Set keyWordSet) {
// 初始化HashMap对象并控制容器的大小
sensitiveWordMap = new HashMap(keyWordSet.size());
// 敏感词
String key = null;
// 用来按照相应的格式保存敏感词库数据
Map nowMap = null;
// 用来辅助构建敏感词库
Map newWorMap = null;
// 使用一个迭代器来循环敏感词集合
Iterator iterator = keyWordSet.iterator();
while (iterator.hasNext()) {
key = iterator.next();
// 等于敏感词库,HashMap对象在内存中占用的是同一个地址,所以此nowMap对象的变化,sensitiveWordMap对象也会跟着改变
nowMap = sensitiveWordMap;
for (int i = 0; i < key.length(); i++) {
// 截取敏感词当中的字,在敏感词库中字为HashMap对象的Key键值
char keyChar = key.charAt(i);
// 判断这个字是否存在于敏感词库中
Object wordMap = nowMap.get(keyChar);
if (wordMap != null) {
nowMap = (Map) wordMap;
} else {
newWorMap = new HashMap();
newWorMap.put("isEnd", "0");
nowMap.put(keyChar, newWorMap);
nowMap = newWorMap;
}
// 如果该字是当前敏感词的最后一个字,则标识为结尾字
if (i == key.length() - 1) {
nowMap.put("isEnd", "1");
}
}
}
}
}
自定义的工具类
package com.nopsmile.dfa;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.alibaba.fastjson.JSONArray;
import net.sf.json.JSONObject;
/**
* 敏感词过滤工具类
*
* @author AlanLee
*
*/
public class SensitivewordUtils {
/**
* 敏感词库
*/
public static Map sensitiveWordMap = null;
/**
* 只过滤最小敏感词
*/
public static int minMatchTYpe = 1;
/**
* 过滤所有敏感词
*/
public static int maxMatchType = 2;
/**
* 敏感词库敏感词数量
*
* @return
*/
public static int getWordSize() {
if (SensitivewordUtils.sensitiveWordMap == null) {
return 0;
}
return SensitivewordUtils.sensitiveWordMap.size();
}
/**
* 是否包含敏感词
*
*/
public static boolean isContaintSensitiveWord(String txt, int matchType) {
boolean flag = false;
for (int i = 0; i < txt.length(); i++) {
int matchFlag = checkSensitiveWord(txt, i, matchType);
if (matchFlag > 0) {
flag = true;
}
}
return flag;
}
/**
* 获取敏感词内容
*
* @param txt
* @param matchType
* @return 敏感词内容
*/
public static Set getSensitiveWord(String txt, int matchType) {
Set sensitiveWordList = new HashSet();
for (int i = 0; i < txt.length(); i++) {
int length = checkSensitiveWord(txt, i, matchType);
if (length > 0) {
// 将检测出的敏感词保存到集合中
sensitiveWordList.add(txt.substring(i, i + length));
i = i + length - 1;
}
}
return sensitiveWordList;
}
/**
* 替换敏感词
*
*/
public static String replaceSensitiveWord(String txt, int matchType, String replaceChar) {
String resultTxt = txt;
Set set = getSensitiveWord(txt, matchType);
Iterator iterator = set.iterator();
String word = null;
String replaceString = null;
while (iterator.hasNext()) {
word = iterator.next();
replaceString = getReplaceChars(replaceChar, word.length());
resultTxt = resultTxt.replaceAll(word, replaceString);
}
return resultTxt;
}
/**
* 替换敏感词内容
*
*/
private static String getReplaceChars(String replaceChar, int length) {
String resultReplace = replaceChar;
for (int i = 1; i < length; i++) {
resultReplace += replaceChar;
}
return resultReplace;
}
/**
* 检查敏感词数量
*
*/
public static int checkSensitiveWord(String txt, int beginIndex, int matchType) {
boolean flag = false;
// 记录敏感词数量
int matchFlag = 0;
char word = 0;
Map nowMap = SensitivewordUtils.sensitiveWordMap;
for (int i = beginIndex; i < txt.length(); i++) {
word = txt.charAt(i);
// 判断该字是否存在于敏感词库中
nowMap = (Map) nowMap.get(word);
if (nowMap != null) {
matchFlag++;
// 判断是否是敏感词的结尾字,如果是结尾字则判断是否继续检测
if ("1".equals(nowMap.get("isEnd"))) {
flag = true;
// 判断过滤类型,如果是小过滤则跳出循环,否则继续循环
if (SensitivewordUtils.minMatchTYpe == matchType) {
break;
}
}
} else {
break;
}
}
if (!flag) {
matchFlag = 0;
}
return matchFlag;
}
/**
* 敏感词汇对应个数
* 返回 "关键字"="关键字个数"
*
*/
public static Map getSensitiveWordSum(String txt, int matchType) {
Map map = new HashMap();
for (int i = 0; i < txt.length(); i++) {
int length = checkSensitiveWord(txt, i, matchType);
if (length > 0) {
// 将检测出的敏感词保存到集合中
String str=txt.substring(i, i + length);
if(map.containsKey(str)) {
map.put(str, map.get(str).intValue()+1);
}else {
map.put(str, new Integer(1));
}
//System.out.println(txt.substring(i, i + length));
i = i + length - 1;
}
}
return map;
}
/**
* 对map数组value排序,并取前10
* this method will always sort the map;
* isCondition is true condition can be used otherwise invalid
* @param unsortMap
* @return
*/
public static Map sortByValue(Map unsortMap,int condition,boolean isCondition) {
// 1. Convert Map to List of Map
List> list =
new LinkedList>(unsortMap.entrySet());
// 2. Sort list with Collections.sort(), provide a custom Comparator
// Try switch the o1 o2 position for a different order
Collections.sort(list, new Comparator>() {
public int compare(Map.Entry o1,
Map.Entry o2) {
return (o2.getValue()).compareTo(o1.getValue());
}
});
// 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap
Map sortedMap = new LinkedHashMap();
if(isCondition) {
for (int i = 0; i < list.size(); i++) {
if (i < condition) {
sortedMap.put(list.get(i).getKey(), list.get(i).getValue());
}
}
}else{
for (int i = 0; i < list.size(); i++) {
sortedMap.put(list.get(i).getKey(), list.get(i).getValue());
}
}
return sortedMap;
}
}
使用上面类流程代码
Keywords ss=new Keywords("好");
List list = new ArrayList();
list.add(ss);
SensitiveWordInit sensitiveWordInit = new SensitiveWordInit();
Map sensitiveWordMap = sensitiveWordInit.initKeyWord(list);
// 传入SensitivewordEngine类中的敏感词库
SensitivewordUtils.sensitiveWordMap = sensitiveWordMap;
SensitivewordUtils.getSensitiveWordSum("需要检测的文本", 2) ;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。
原文链接:https://blog.51cto.com/4534309/2391498
java dfa_基于java实现DFA算法代码实例相关推荐
- 曼哈顿距离java实现_基于javascript实现获取最短路径算法代码实例
这篇文章主要介绍了基于javascript实现获取最短路径算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 //A算法 自动寻路 ...
- java 实现违章_基于JAVA的车辆违章查询数据调用代码实例
基于JAVA的车辆违章查询数据调用代码实例 代码描述:基于JA V A的车辆违章查询数据调用代码实例 相关平台:聚合数据 import java.io.BufferedReader; import j ...
- java查询序列_基于JAVA的苹果序列号查询api调用代码实例
代码描述:基于JAVA的苹果序列号查询api调用代码实例 关联数据:苹果序列号 接口地址:http://www.juhe.cn/docs/api/id/37 1.[代码][Java]代码 import ...
- 医院医生评价的java代码_基于JAVA的医院信息查询接口调用代码实例
基于JAVA的医院信息查询接口调用代码实例 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io ...
- Java:实现基于计算法的CRC-CCITT算法(附完整源码)
Java:实现基于计算法的CRC-CCITT算法 public static int CRC_XModem(byte[] bytes){int crc = 0x00; // initial value ...
- Java实现MD5加密及解密的代码实例分享
如果对安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享: 基础:M ...
- java二维数组长度表示,java二维数组指定不同长度代码实例
本篇文章小编给大家分享一下java二维数组指定不同长度代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.二维数组的每个元素都是一个一维数组, ...
- 基于PHP的DFA算法(敏感词过滤)
基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...
- python 蓝牙开发_基于python实现蓝牙通信代码实例
这篇文章主要介绍了基于python实现蓝牙通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装和示例 linux下安装 sudo apt ...
最新文章
- 【微服务架构】SpringCloud之Eureka入门篇
- php 7.0 编译安装mysql_源码编译安装php7.0.5
- Zulip 2.0.1 发布,功能强大的群组聊天软件
- 校园送礼风为何难刹住 “送了没个完,不送没个底”
- 解决:RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB
- Delphi2009下编译提示“无法找到“Excel_TLB”
- 计算机音乐tfboys手机,TFBoys王源的iPhone挂了 别怕 手贱有得治
- [codeup 2143] 迷瘴
- 加密的m3u8、ts文件合并
- HSPICE与非门仿真
- 通过有线网卡共享无线网络
- elasticsearch对analyzed字段无法使用term方法的解决办法
- luci编程 openwrt_【玩转开源】BananaPi R2 —— 第四篇 Openwrt Luci 初探
- 图解图论介绍及应用(1):哥尼斯堡七桥
- FileSystemWatcher触发多次Change事件的解决办法
- 类别不均衡问题之loss大集合:focal loss, GHM loss, dice loss 等等
- Python爬取QQ音乐内地专辑
- C语言文件操作(1)
- JS中常见的 “Uncaught TypeError: XXXX is not a function” 错误解析
- 语音识别领域公司分析
热门文章
- figma下载_最佳的免费Figma资源:模板,图标,UI工具包等
- css 在div左上角添加类似书签的标记
- javamail复杂格式邮件,带附件,html格式,d图片,超链接
- 键盘事件keydown、keypress、keyon区别
- python黑猫投诉网爬虫,无需修改参数可直接生成投诉内容词云、投诉请求与地址柱形图~(源码)
- windows web服务器性能测试工具,Web 性能测试编辑器概述
- 计算机软件著作权登记申请流程和需要的时间
- java jolt tuxedo_使用java通过jolt调用tuxedo
- 00018计算机应用基础大纲,自学考试00018计算机应用基础(复习资料).doc
- 一个三十岁中国男人的婚姻思考 转帖