屏蔽功能

KeyTree类  这个类的功能是 :

读取硬盘上的key.txt(里面存放的是敏感关键词),将之读入Set中,再讲Set中的元素传入到Map中(通过Map来生成敏感词的树状结构),并传出这个Map(敏感词树)

public Map createKeyWord():创建一个Map类型的词库(敏感词树)

private void readSetToMap(Set<String> keyWordSet): (内部方法)读取敏感词库,将敏感词放入HashSet中

private Set<String> readKeyTxt():(内部方法)读取敏感词库中的内容,将内容添加到set集合中

  1 package pingbi;
  2
  3 /**
  4  * keyWordSet:敏感词集合(中间量) 将原始key.txt中的内容先读入到这个变量(keyWordSet)中,
  5  *             再由此变量生成敏感词树(keyTreeMap)
  6  * newMap、nowMap:一起用来生成敏感词树(keyTreeMap)的
  7  * keyTreeMap:敏感词树
  8  */
  9 import java.io.BufferedReader;
 10 import java.io.File;
 11 import java.io.FileInputStream;
 12 import java.io.InputStreamReader;
 13 import java.util.*;
 14
 15 /** ----------------初始化敏感词库,将敏感词加入到HashMap中,构建DFA算法模型-----------------*/
 16 public class KeyTree {
 17     // private String ENCODING = "GBK"; //字符编码
 18     private String ENCODING = "UTF-8"; // 字符编码
 19     @SuppressWarnings("rawtypes")
 20     private HashMap keyTreeMap;// 敏感词集合
 21
 22     public HashMap getKeyTreeMap() {
 23         return keyTreeMap;
 24     }
 25
 26     @SuppressWarnings("rawtypes")
 27     public Map createKeyWord() {
 28         try {
 29             // 读取敏感词库
 30             Set<String> keyWordSet = readKeyTxt();
 31             // 将敏感词库加入到HashMap中
 32             readSetToMap(keyWordSet);
 33             // spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);
 34         } catch (Exception e) {
 35             e.printStackTrace();
 36         }
 37         return keyTreeMap;
 38     }
 39
 40     /*-------------- 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型--------------*/
 41     @SuppressWarnings({ "rawtypes", "unchecked" })
 42     private void readSetToMap(Set<String> keyWordSet) {
 43         keyTreeMap = new HashMap(keyWordSet.size());// 初始化敏感词容器,减少扩容操作
 44         String key = null;
 45         Map nowMap = null;
 46         Map<String, String> newMap = null;
 47         // 迭代keyWordSet
 48         Iterator<String> iterator = keyWordSet.iterator();
 49         while (iterator.hasNext()) {
 50             key = iterator.next(); // 关键字
 51             nowMap = keyTreeMap;
 52             for (int i = 0; i < key.length(); i++) {
 53                 char keyChar = key.charAt(i); // 转换成char型
 54                 Object wordMap = nowMap.get(keyChar); // 获取
 55
 56                 if (wordMap != null) { // 如果存在该key,直接赋值
 57                     nowMap = (Map) wordMap;
 58                 } else { // 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
 59                     newMap = new HashMap<String, String>();
 60                     newMap.put("isEnd", "0"); // 不是最后一个
 61                     nowMap.put(keyChar, newMap);
 62                     nowMap = newMap;
 63                 }
 64
 65                 if (i == key.length() - 1) {
 66                     nowMap.put("isEnd", "1"); // 最后一个
 67                 }
 68             }
 69         }
 70     }
 71
 72     /*------------------- 读取敏感词库中的内容,将内容添加到set集合中--------------------*/
 73     @SuppressWarnings("resource")
 74     private Set<String> readKeyTxt() throws Exception {
 75         Set<String> set = null;
 76
 77         String filepath = "E:\\pingbi\\key.txt";
 78         File file = new File(filepath); // 读取文件
 79         // String filename = "key.txt";
 80
 81         InputStreamReader read = new InputStreamReader(new FileInputStream(filepath), ENCODING);
 82         try {
 83             if (file.isFile() && file.exists()) {// 文件流是否存在
 84                 set = new HashSet<String>();
 85                 BufferedReader bufferedReader = new BufferedReader(read);
 86                 String txt;
 87                 while ((txt = bufferedReader.readLine()) != null) {// 读取文件,将文件内容放入到set中
 88                     set.add(txt);
 89                 }
 90             } else {// 不存在抛出异常信息
 91                 throw new Exception("敏感词库文件不存在");
 92             }
 93         } catch (Exception e) {
 94             throw e;
 95         } finally {
 96             read.close();// 关闭文件流
 97         }
 98         return set;
 99     }
100 }

shieldUtil类提供 工具方法

public shieldUtil(): 构造方法,初始化敏感词库

public Set<String> getSensitiveWord(String txt): 获取文字中所有的的敏感词,并放入一个Set中

public String replaceSensitiveWord(String txt, String replaceChar): 替换敏感字字符,替换字符,默认

public int CheckSensitiveWord(String txt, int beginIndex) :检查文字中是否包含敏感字符,检查规则如下: 如果存在,则返回敏感词字符的长度,不存在返回0

public boolean isSensitive(String txt): 判断是否含有敏感词

private String getReplaceChars(String replaceChar, int length): (内部方法)获取替换字符串

 1 package pingbi;
 2
 3 import java.io.*;
 4 import java.util.HashSet;
 5 import java.util.Iterator;
 6 import java.util.Map;
 7 import java.util.Set;
 8
 9 /** 敏感词过滤 */
10 public class shieldUtil {
11     @SuppressWarnings("rawtypes")
12     private Map keyWord= null;// 树
13
14     /* -------------------构造函数,初始化敏感词库-------------------------- */
15     public shieldUtil() {
16         keyWord= new KeyTree().createKeyWord();
17     }
18
19     /*--------------- 获取文字中所有的的敏感词,并放入一个Set中--------------------*/
20     public Set<String> getSensitiveWord(String txt) {
21         Set<String> sensitiveWordSet = new HashSet<String>();
22
23         for (int i = 0; i < txt.length(); i++) {
24             int length = CheckSensitiveWord(txt, i);// 判断是否包含敏感字符
25             if (length > 0) {// 存在,加入list中
26                 sensitiveWordSet.add(txt.substring(i, i + length));
27                 i = i + length - 1;// 减1的原因,是因为for会自增
28             }
29         }
30         return sensitiveWordSet;
31     }
32
33     /*------------------替换敏感字字符,替换字符,默认------------------*/
34     public String replaceSensitiveWord(String txt, String replaceChar) {
35         String resultTxt = txt;
36         Set<String> set = getSensitiveWord(txt); // 获取所有的敏感词
37         Iterator<String> iterator = set.iterator();
38         String word = null;
39         String replaceString = null;
40         while (iterator.hasNext()) {
41             word = iterator.next();
42             replaceString = getReplaceChars(replaceChar, word.length());
43             resultTxt = resultTxt.replaceAll(word, replaceString);
44         }
45         return resultTxt;
46     }
47
48     /*-----------------获取替换字符串 -----------------*/
49     /* 例如,已知匹配到的敏感词长度是3,想要替换成“*”号,则得到的替换字符串为“***” */
50     private String getReplaceChars(String replaceChar, int length) {
51         String resultReplace = replaceChar;
52         for (int i = 1; i < length; i++) {
53             resultReplace += replaceChar;
54         }
55         return resultReplace;
56     }
57
58     /*--------检查文字中是否包含敏感字符,检查规则如下: 如果存在,则返回敏感词字符的长度,不存在返回0---------*/
59     // 只匹配一次,成功即返回
60     @SuppressWarnings({ "rawtypes" })
61     public int CheckSensitiveWord(String txt, int beginIndex) {
62         boolean flag = false;// 敏感词结束标识位:用于敏感词只有1位的情况
63         int matchLength = 0;// 匹配标识数默认为0
64         char word = 0;
65         Map nowMap = keyWord;
66         for (int i = beginIndex; i < txt.length(); i++) {
67             word = txt.charAt(i);
68             nowMap = (Map) nowMap.get(word);// 获取指定key
69             if (nowMap != null) {// 存在,则判断是否为最后一个
70                 matchLength++;// 找到相应key,匹配标识+1
71                 if ("1".equals(nowMap.get("isEnd"))) {// 如果为最后一个匹配规则,结束循环,返回匹配标识数
72                     flag = true;// 结束标志位为true
73                 }
74             } else {// 不存在,直接返回
75                 break;
76             }
77         }
78         if (matchLength < 2 || !flag) {// 长度必须大于等于1,为词
79             matchLength = 0;
80         }
81         return matchLength;
82     }
83
84     /*----------------------判断是否含有敏感词------------------*/
85     public boolean isSensitive(String txt) {
86         int matchLength = CheckSensitiveWord(txt, 0);
87         return matchLength > 0;
88     }
89 }
时间: 2024-11-06 19:47:14

屏蔽功能的相关文章

iOS9的广告屏蔽功能在谷歌背后捅了致命一刀?

苹果此前就曾以隐私保护和用户偏好的名义提醒过开发人员,它们将会在即将到来的iOS9中增加广告屏蔽的功能.这预期最早将会随着九月九号的新iPhone一起到来(事实上推迟了).这在谷歌,移动应用开发公司,和应用发行商之中制造了一些紧张的气氛. 如果iOS9和广告屏蔽功能被广泛采用的话,这就意味着700亿美元的移动广告市场将会遭受到严重的颠覆.广告屏蔽越多,在手游和移动应用中可以被用户看到的广告就越少.应用发行商,广告平台,以及营销公司的收入就会越少.手游公司现在还不需要恐慌,但是大家最好打醒十二分精

iOS 9推广告屏蔽功能,移动营销界也做了哪些动作?(转)

观察数字营销行业发展历程可以看出,每一种新广告形式.新产品刚被市场发现之时,就是蕴含价值量最大的时候,如同未被挖掘的金矿一样.网盟.积分墙.广点通.热搜,最早敢于吃这些“螃蟹”的人到后来都赚得盆满钵满而功成身退. 但也有些产品出来后,则会给市场和企业带来致命的威胁,如最近苹果iOS 9推出广告屏蔽功能. 今天Fmarketing就为大家搜罗了数字营销界最近新出的产品和推广方式,让大家防患于未然的同时抓住机会,看谁能够先胆大心细抢占山头,圈一块地.分一杯羹了. 苹果iOS 9推出广告屏蔽功能:应用

html中如何使用python屏蔽一些基本功能

进行数据解析的理由不计其数,相关的工具和技巧也同样如此.但是,当您需要用这些数据做一些新的事情时,即使有"合适的"工具可能也是不够的.这一担心对于异类数据源的集成同样存在.用来做这项工作的合适工具迟早应该是一种编程语言. Oracle 提供了一些非常强大的实用程序来加载.处理和卸载数据.SQL*Loader.Data Pump.外部表.Oracle Text.正则表达式都能提供这些功能.然而人们常常会需要在数据库外做一些事情(或者,说得琐碎些,可能您还没有获得必要的数据库权限). 利用

IE将开始屏蔽旧版ActiveX控件

?? 根据用户的反馈情况,我们决定等到2014年9月9日再开始屏蔽那些旧版本的ActiveX控件.然而,旧版ActiveX控件的屏蔽功能和相关的组策略设置,仍然在2014年8月12日就可以开始使用. IE的此次变动会对您的企业带来哪些影响呢? 从2014年9月9日起,如果您的企业在使用IE访问的Internet网站仍然依赖于旧版本的JAVA,那么您将受到这次改动的影响. 用户将会看到屏蔽的通知界面(点击此处可预览界面),但其可以通过点击相应的按钮坚持允许旧版ActiveX控件运行. 如果对您的企

Windows Server 2012文件服务器资源管理器(FSRM)(2)---文件屏蔽

上篇文章介绍了FSRM的文件分类功能,这次介绍FSRM的另外一个重要功能文件屏蔽. 文件屏蔽管理允许你阻止用户将特定的类型的文件存放在卷或者文件夹树中.文件屏蔽会应用到指定路径中的所有文件夹.文件屏蔽管理通过文件组去控制文件类型,例如你可以创建一个文件屏蔽规则去阻止用户保存视频和音频文件到服务器中他们的个人文件夹中.和FSRM所有的组件一样,也可以对文件屏蔽选择发送邮件或者其他通知来报告文件屏蔽事件触发. 文件屏蔽可以配置成两种模式,主动的或者被动: 主动模式:主动屏蔽模式会阻止用户保存未经授权

EBS五种安全性屏蔽解析

http://blog.11equals3.top/2018/02/09/190/ 分类帐集 定义: 分类帐集顾名思义就是分类账的集合.它是总帐提供的将相同科目表和相同日历的多个分类帐集合一起用于多分类账操作的一种功能.例如可以用分类帐集运行报表.运行经常性日记账和打开期间等操作. 分配或使用 在职责配置文件GL:数据访问权限集中使用所定义的分类帐集. 使用报表时选择已定义的分类帐集. 在日记账录入或查询时选择分类帐集的各个分类账. 账户查询中选择分类帐集的各个分类账,可以看到各个分类账中汇总或

Thinkphp模板中函数的使用

1.在模板中使用php函数 在thinkphp的html中,我们经常会遇到一些变量难以直接从php控制端直接处理,这些变量只有在模板中循环输出的时候处理比较合适,这个时候,我们就要在模板中使用函数 1.1对输出模板使用php函数 {$data.name|md5} //把模板中的name变量进行md5加密 把这句话翻译成php语言: <?php echo (md5($data['name'])); ?>   1.2函数中多个参数需要调用 1.2.1将前面输出的变量当后面函数的第二个参数使用 {$

《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)

注意:本系列教程为长篇连载无底洞,半路杀进来的朋友,如果看不懂的话,请从第一章开始看起,文章目录请点击下面链接. http://blog.csdn.net/lufy_legend/article/details/8888787 一,内容预览 算起来,游戏脚本系列文章已经很久没更新了,虽然该系列文章更新缓慢,但是确实还是能够帮到一些朋友,前段时间,仅仅因为做毕业设计通过邮件联系我的就有4位学生.有鉴于此,我还是挤点儿时间来继续慢慢更新一下了.另外,我想再声明一下,目前该脚本引擎还处在移植开发阶段,

做好竞价的四个关键点

所谓是竞价账户好注册,竞价却不好做,没有专业的扎实的知识,系统的数据分析能力.专业的团队做好竞价不太容易.以下总结了做好竞价的四个关键点,希望对您有所帮助. 1.关键词的精准性.关键词的选取跟企业产品的定位,以及用途以及客户的搜索习惯都有很大的关系,不是越多越好,无效的关键词只会浪费金钱增加成本,对于托管没有什么用. 2.设置最高限额.账户后台设置限额的目的主要是是为了防止恶意的点击,避免钱被恶意消耗,降低风险. 3.监控IP.学会统计观察一些没有用处的IP,尤其是经常出现的恶意IP,一旦发现就