本算法对纯文本匹配执行效率已改进到:5000字5毫秒(2400敏感词库)

原理:基于多叉树的查找。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** 敏感词库初始化* * @author pipi**/
public class SensitiveWordInit {/*** 敏感词库*/@SuppressWarnings("rawtypes")public static HashMap sensitiveWordMap;/*** 初始化敏感词* * @return*/@SuppressWarnings("rawtypes")public Map initKeyWord(List<SmsSensitiveWord> sensitiveWords) {try {// 从敏感词集合对象中取出敏感词并封装到Set集合中Set<String> keyWordSet = new HashSet<String>();for (SmsSensitiveWord s : sensitiveWords) {keyWordSet.add(s.getSensitiveWord().trim());}// 将敏感词库加入到HashMap中addSensitiveWordToHashMap(keyWordSet);} catch (Exception e) {e.printStackTrace();}return sensitiveWordMap;}/*** 封装敏感词库* * @param keyWordSet*/@SuppressWarnings({ "rawtypes", "unchecked" })private void addSensitiveWordToHashMap(Set<String> keyWordSet) {// 初始化HashMap对象并控制容器的大小sensitiveWordMap = new HashMap(keyWordSet.size());// 敏感词String key = null;// 用来按照相应的格式保存敏感词库数据Map nowMap = null;// 用来辅助构建敏感词库Map<String, String> newWorMap = null;// 使用一个迭代器来循环敏感词集合Iterator<String> 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<String, String>();newWorMap.put("isEnd", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}// 如果该字是当前敏感词的最后一个字,则标识为结尾字if (i == key.length() - 1) {nowMap.put("isEnd", "1");}}}}
}
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*** 敏感词过滤工具类* * @author pipi**/
public class SensitivewordEngine {/*** 只过滤最小敏感词*/public static int minMatchTYpe = 1;/*** 过滤所有敏感词*/public static int maxMatchType = 2;/*** 敏感词库敏感词数量* * @return*/public static int getWordSize() {if (SensitiveWordInit.sensitiveWordMap == null) {return 0;}return SensitiveWordInit.sensitiveWordMap.size();}/*** 是否包含敏感词* * @param txt* @param matchType* @return*/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<String> getSensitiveWord(String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<String>();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;}/*** 替换敏感词* * @param txt* @param matchType* @param replaceChar* @return*/public static String replaceSensitiveWord(String txt, int matchType, String replaceChar) {String resultTxt = txt;Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> 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;}/*** 替换敏感词内容* * @param replaceChar* @param length* @return*/private static String getReplaceChars(String replaceChar, int length) {String resultReplace = replaceChar;for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;}/*** 检查敏感词数量* * @param txt* @param beginIndex* @param matchType* @return */@SuppressWarnings("rawtypes")public static int checkSensitiveWord(String txt, int beginIndex, int matchType) {boolean flag = false;// 记录敏感词数量int matchFlag = 0;char word = 0;Map nowMap = SensitiveWordInit.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 (SensitivewordEngine.minMatchTYpe == matchType) {break;}}} else {break;}}if (!flag) {matchFlag = 0;}return matchFlag;}}

关键词敏感字高效查找匹配算法相关推荐

  1. 一步步教你优化Delphi字串查找(转载)

    一步步教你优化Delphi字串查找 2005-06-13 11:46 作者: 朱晓峰 出处: csdn开发高手 责任编辑:方舟 本人在编写离线浏览器WebSeizer的过程中,用到大量字符串处理函数, ...

  2. python敏感字替换_python用类实现文章敏感词的过滤方法示例

    过滤一遍并将敏感词替换之后剩余字符串中新组成了敏感词语,这种情况就要用递归来解决,直到过滤替换之后的结果和过滤之前一样时才算结束 第一步:建立一个敏感词库(.txt文本) 第二步:编写代码在文章中过滤 ...

  3. 如何用python找文献_如何高效查找文献、紧跟研究领域热点和前沿?

    如何高效查找文献.紧跟研究领域热点和前沿? 每一次"论文手术" ,都令人头秃: 在知网.各大论坛的海量文献里挣扎,一耗就是一天,筛出的可用信息并不多: 整合搜罗到的数据.案例和实验 ...

  4. 【算法】在N个乱序数字中查找第K大的数字

    目录 1. 结论 2. 经典的几种解法 2.1 解法一:O(n*k) 2.2 解法二:O(n*logk) 2.3 解法三:O(n) 2.4 解法四:O(n*logn+k) 2.5 解法五:O(n*lo ...

  5. 敏感字检测or替换,并可以限定字符串长度

    大概测试了一下,效率还算可以的,. 用到了log4net这个包做debug,不用的删掉就行. using log4net; using System; using System.Collections ...

  6. 艾美捷甘油比色测定试剂盒-简单,敏感,高效

    艾美捷甘油比色测定试剂盒,利用双酶联反应系统来检测血清和血浆中的甘油的含量.最后用酶标仪在540nm处测吸光度值即可. 甘油是甘油三酯的骨架,是参与氧化和合成过程的能量代谢的重要中间体.甘油和游离脂肪 ...

  7. 在N个乱序数字中查找第k大的数字

    在N个乱序数字中查找第k大的数字 在N个乱序数字中查找第k大的数字,时间复杂度可以减小至 O(N*logN) O(N) O(1) O(2) 答案:B 所谓"第(前)k大数问题"指的 ...

  8. java查找和替换_java敏感字查找和替换

    /*** @date 2020-12-09 009 19:36*/ public classSensitiveWordsSearch {/*** 关键字根节点*/ protectedWordsNode ...

  9. 网站发帖敏感字java_网站敏感词过滤的实现(附敏感词库)

    现在基本上所有的网站都需要设置敏感词过滤,z似乎已经成了一个网站的标配,如果你的网站没有,或者你没有做相应的处理,那么小心相关部门请你喝茶哦. 最近在调研Java web网站的敏感词过滤的实现,网上找 ...

最新文章

  1. 鱼眼相机标定_鱼眼相机模型(二)
  2. 16道嵌入式C语言面试题(经典) 预处理器(Preprocessor)
  3. hdu 6153 A Secret kmp + dp
  4. 局域网聊天9月局域网聊天
  5. metasploit 使用search报错
  6. 王琪你计算机学院,计算机学院“计忆时光”2019元旦联欢会暨年度颁奖典礼圆满举行...
  7. 01 - 树莓派简介以及烧录系统
  8. java DFS与BFS算法
  9. 计算机光驱启动设置,光驱启动怎么设置
  10. 垃圾分类数据集-8w张图片245个类附赠tensorflow代码
  11. 博士入学考题(ZZ)
  12. 国内ERP的弊端,从“自定义单据“和“自定义流程“来应对客户多变的业务需求
  13. 计算机的发展史英语作文,A History of Modern Computing-现代计算机历史 (英文原版)
  14. C++のeasyx3:函数clearcliprgn、cleardevice、closegraph、getaspectratio、graphdefaults的运用
  15. 移动H5前端性能优化指南(转自ISUX)
  16. 阿里云学生机 部署JavaWeb项目
  17. css-doodle 学习第三天, selectors的使用
  18. 如何绕过mac地址过滤_终极MAC地址过滤~到底要不要死心?
  19. scratch 3 安装过程图
  20. mysql查询并计算单价,sql语句查询今年单价总金额

热门文章

  1. 欧盟商标和马德里商标有什么区别?
  2. android 调用原生相机
  3. Pytorch搭建Retinaface人脸检测与关键点定位平台
  4. java身份证号码校验工具类
  5. 本科挂科、被处分、没有学位证……会影响考研吗?
  6. 2013-2014嵌入式开发从业人员调查报告
  7. 基于网站html文件查找恶意外链
  8. 基于5G智慧路灯杆打造数字乡村
  9. 一文教会你离线Linux主机简易搭建YUM源私服
  10. win7 计算机里显示视频,电脑中看不了网页视频怎么办_网页视频看不了如何解决-win7之家...