1.基于DFA算法的实现

1.1 DFA介绍

DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。

1.2构建模型

举个例子来说,在bash脚本命令检测中,我们规定“rm”,“reboot”,“shutdown”,"::","/dev/null","rmr"为敏感词,则我们需要根据这6个敏感词来构建检测模型,使用json格式来表示:

{"r":{"e":{"b":{"isEnd":"0","o":{"isEnd":"0","o":{"t":{"deepCount":"6","isEnd":"1"},"isEnd":"0"}}},"isEnd":"0"},"isEnd":"0","m":{"r":{"deepCount":"3","isEnd":"1"},"deepCount":"2","isEnd":"1"}},":":{":":{"deepCount":"2","isEnd":"1"},"isEnd":"0"},"s":{"h":{"u":{"t":{"d":{"isEnd":"0","o":{"w":{"isEnd":"0","n":{"deepCount":"8","isEnd":"1"}},"isEnd":"0"}},"isEnd":"0"},"isEnd":"0"},"isEnd":"0"},"isEnd":"0"},"/":{"d":{"e":{"v":{"isEnd":"0","/":{"isEnd":"0","n":{"u":{"l":{"l":{"deepCount":"9","isEnd":"1"},"isEnd":"0"},"isEnd":"0"},"isEnd":"0"}}},"isEnd":"0"},"isEnd":"0"},"isEnd":"0"}}

代码实现:

private static Map initSensitiveWordMap(){String key = null;Map nowMap = null;Map<String,String> newWorMap = null;Set<String> sensitiveWordSet = new HashSet<>();sensitiveWordSet.add("rm");sensitiveWordSet.add("reboot");sensitiveWordSet.add("shutdown");sensitiveWordSet.add("::");sensitiveWordSet.add("/dev/null");sensitiveWordSet.add("rmr");Map sensitiveWordMap = new HashMap(sensitiveWordSet.size());Iterator<String> iterator = sensitiveWordSet.iterator();while (iterator.hasNext()){key = iterator.next().toLowerCase();nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {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("deepCount",i + 1 + "");nowMap.put("isEnd","1");}}}System.out.println(JSONObject.toJSONString(sensitiveWordMap));return sensitiveWordMap;}

1.3检测脚本内容

public static Set<String> checkSensitiveWord(String scriptText, int matchType){Map sensitiveWordMap = initSensitiveWordMap();Set<String> sensitiveWordSet = new HashSet<>();for (int i = 0; i < scriptText.length(); i++) {int length = testSensitiveWord(scriptText,i,matchType,sensitiveWordMap);if(length > 0){sensitiveWordSet.add(scriptText.substring(i,i+length));i = i+length - 1;}}return sensitiveWordSet;}private static int testSensitiveWord(String scriptText,int index,int matchType,Map sensitiveWordMap){boolean flag = false;int matchFlag = 0;char word = 0;Map nowMap = sensitiveWordMap;for (int i = index; i < scriptText.length(); i++) {word = scriptText.charAt(i);nowMap = (Map) nowMap.get(word);if(nowMap != null){matchFlag++;//找到相应的key,匹配标识+1if("1".equals(nowMap.get("isEnd"))){Integer deepCount =Integer.valueOf((String) nowMap.get("deepCount"));flag = isWord(scriptText,i,deepCount);if(1 == matchType || flag){//1:最小匹配,2:全匹配break;}}} else {break;}}if(matchFlag < 2 || !flag){matchFlag = 0;}return matchFlag;}private static boolean isWord(String scriptText, int i,int deepCount) {boolean isWord = true;if(i < scriptText.length()-1 && ' '!=scriptText.charAt(i+1)){isWord = false;}if(i - deepCount >= 0 && scriptText.charAt(i-deepCount) > 96 && scriptText.charAt(i-deepCount) < 123){isWord = false;}return isWord;}

2.基于动态正则法实现

private static Set<String> checkSensitiveWord(String scriptText){Set<String> base_set = new HashSet<>();base_set.add("rm");base_set.add("dd");base_set.add("reboot");Set<Character> characters = new HashSet<>();for (String s : base_set) {for (int i = 0; i < s.length(); i++) {sc.add(s.charAt(i));}}String all = "";for (Character character : characters) {all += character;}String unexpected_character_reg = "[^a-z0-9\\s]";//提取符号String unexpected_character = "";Matcher m = Pattern.compile(unexpected_character_reg).matcher(all);while(m.find()) {unexpected_character += m.group();}String regexPre = "[a-z0-9";String regexSuf = "]+";String main_regex = regexPre+unexpected_character+regexSuf;//组装最终检验字符串的正则表达式Matcher main_m = Pattern.compile(main_regex).matcher(script);Set<String> match_set = new HashSet();while (main_m.find()) {if (base_set.contains(main_m.group())){match_set.add(main_m.group());}}return match_set;}

JAVA两种实现文本敏感词检测的方式相关推荐

  1. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  2. 关于java中敏感词检测的一些总结

    之前项目里客户提出一个需求,需要对系统中使用文本转化成语音发送的功能进行敏感词检测,禁止用户提交有敏感词的语音.通过查询各方面资料,整理了大概几种方案: 项目启动时对载入敏感词库作为缓存(一个大map ...

  3. java 敏感词检测

    在网上看到好多的敏感词检测,发现都是在推荐某某算法,但是敏感词全是利用文本去存放.在项目中不能很好的进行维护和管理(个人看法). 本文的敏感词的检测方式还是DFA算法检测,不过敏感词存放地址放入了Re ...

  4. 敏感词检测算法review

    字符串匹配是一个技术活,敏感词检测首先有一个敏感词词库,也就是敏感词的列表. 第一个想到的方法把敏感词放到一个set里,再待检测的文本分词,到set里去匹配: 第二种方法是遍历set,用正则表达式来过 ...

  5. 写一个高性能的敏感词检测组件

    最近写了一个高性能的敏感词检测组件[ToolGood.Words]. 一.高性能,它的效率到底有多快? 如果将正则表达式的算法效率设为1,高性能可达到正则表达式的1.5万倍. 二.选一个巧妙的算法: ...

  6. 【敏感词检测】用DFA构建字典树完成敏感词检测任务

    任务概述 敏感词检测是各类平台对用户发布内容(UGC)进行审核的必做任务. 对于文本内容做敏感词检测,最简单直接的方法就是规则匹配.构建一个敏感词词表,然后与文本内容进行匹配,如发现有敏感词,则提交报 ...

  7. 敏感词检测:整合阿里云与腾讯云相关API

    前言 项目地址:Text-Sensitivity 笔者在开发小程序时,由于需要对用户输入内容进行敏感词检查,故需要使用现有服务商的相关API(自行开发NLP产品,难度大). 我们技术团队初步使用的是腾 ...

  8. word2vec应用场景_介绍Word2Vec和Glove这两种最流行的词嵌入方法背后的直觉

    NLP 的首要问题就是寻求恰当的文本表示方法. 因为, 良好的文本表示形式, 是后续进一步处理的基础.近年来,词嵌入方法越来越流行,在各种各样的 NLP 任务中 得到了广泛的应用.简单而言,词嵌入是通 ...

  9. Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的.今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚. 敏感词匹配这种治标不治本的方法,在一 ...

最新文章

  1. python字符识别_crnn(基于pytorch、python3) 实现不定长中文字符识别
  2. 段式存储管理 Vs 页式存储管理 Vs 段页式存储管理
  3. python学习之路 一 :编程语言介绍
  4. 同步与异步系列之二 导读目录
  5. 微信公众号-关注取消关注后图文和普通消息自动回复
  6. Node.js:连接 MySQL
  7. 读《未来世界的幸存者》 -- 阮一峰
  8. 识别PDF文字的软件,得力OCR文字识别
  9. 使用c++filt工具demangle C++符号
  10. 普通话测试-短文60篇文章,附带拼音(21-30篇)
  11. c语言程序图像抠图,Opencv使用鼠标任意形状的抠图
  12. Normalized Gini Coefficient
  13. 腾讯辟谣心悦3玩家“特权”;共享充电宝陷入生死危机
  14. 欠定方程组的最小范数解
  15. Java仿文库的基本方法(openoffice+swftools+flexPaper)
  16. 2022广东最新八大员之(安全员)模拟试题题库及答案
  17. GridControl GridView 属性
  18. <Android开发> Android vold - 第三篇 vold 的NetLinkManager类简介
  19. CityMaker学习教程12 osg模型的创建
  20. MySql快速复习,看这一篇就够了!

热门文章

  1. 硬件大熊原创合集(2022/01更新) 内赠红包封面
  2. 2023年全球及中国被动元器件行业市场需求规模竞争格局研究预测及重点企业市场占有率分析
  3. java与sharepoint_隐藏已弃用的sharepoint网站
  4. 牛码宝宝 - Sprint log (No.7)
  5. 逃离360和腾讯的战场
  6. Android 界面防劫持
  7. 遇见C++ PPL:C++ 的并行和异步
  8. SHODAN的使用介绍
  9. 中奖号码由6个红球号码和1个蓝球号码组成。其中红球号码要求随机生成6个1~33之间不重复的随机号码。其中蓝球号码要求随机生成1个1~16之间的随机号码。
  10. 爬虫之非结构化数据爬取:字符串find,split应用