首页 > 编程知识 正文

过滤器模型的证据支持,新浪微博敏感词过滤器

时间:2023-05-05 20:39:13 阅读:20110 作者:2259

1、前言

在开发过程中使用文本编辑器上载文本时,可能需要检测敏感字。 对于少量字符,请直接使用indexOf或正则表达式来确定敏感词语是否存在。 但是,文字量多的话,性能会变差。 在这里,我们简单地学习DFA算法模型进行索引,使敏感词成为树形结构,便于检索,提高了查询的效率。

2、DFA算法的数据结构

DFA算法的目的是说单词的分词整体,形成一个树结构。 每个关键字必须从根节点到末端节点,并且只有一个结束标志。 具体来说,可以移动到【传送门】

数据结构如下:

*中={ * isEnd=0 *国={ * isEnd=1 *人={isEnd=0 *民={isend=1}*}男={ * isEnd=0 *人={ * isend=1* } }

/** *敏感词过滤工具类* * @ author Shuai.Wang */publicclassensitivewordtool {//结束标志privatestaticfinalstringend _ flag=' ' //未结束标志- valueprivatestaticfinalintegernot _ end _ val=0; //敏感词典private MapString,Object sensitiveWordResult; //匹配的敏感词语[不加重]专用列表stringsensitivewordlist; publicsensitivewordtool(}/***为敏感单词编制索引* * @ param elements */publicsensitivewordtool (string.elements ) 导入删除字(对/**删除字进行索引),在HashSet中包含删除字,从而建立DFA算法模型。 br * pre *中={ * isEnd=0 *国={ * isEnd=1 *人={isEnd=0 *民={isend=1}*}男={ * isEnd=0 *人} }*}五={。

ex(Set<String> sensitiveWords) {// 建立敏感词库sensitiveWordResult = Maps.newHashMapWithExpectedSize(sensitiveWords.size());// 当前的操作的MapMap<String, Object> currentMap = null;// 创建新结果集Map<String, Object> newMap = null;// 建立索引if (CollectionUtils.isNotEmpty(sensitiveWords)) {for (String sensitiveWord : sensitiveWords) {currentMap = sensitiveWordResult;int len = sensitiveWord.length();for (int i = 0; i < len; i++) {String key = String.valueOf(sensitiveWord.charAt(i));Object result = currentMap.get(key);if (result != null) {// 当期字符已经建立索引,获取当前字符的后续索引链currentMap = (Map<String, Object>)result;}else {// 建立索引newMap = Maps.newHashMapWithExpectedSize(2);newMap.put(END_FLAG, NOT_END_VAL);currentMap.put(key, newMap);// 当前操作Map修改成新建的索引链currentMap = newMap;}//设置敏感字的结束标识if (i == len-1) {currentMap.put(END_FLAG, END_VAL);}}}}}/** * 检索敏感词 * * @param text * @return */@SuppressWarnings("unchecked")public void filterSensitiveWordList(String text){List<String> appearList = Lists.newArrayList(); Map<String, Object> currentResult = sensitiveWordResult;int matchIndex = 0;if (currentResult != null && !currentResult.isEmpty()) {String key = null;if (StringUtils.isNotBlank(text)) {int len = text.length();StringBuilder sb = new StringBuilder();for (int i = 0; i < len; i++) {key = String.valueOf(text.charAt(i));Object object = currentResult.get(key);if (object != null) {// 匹配到第一个关键字,需要记录检索的位置并标记matchIndex++;sb.append(key);currentResult =(Map<String, Object>)object;if (Objects.equal(currentResult.get(END_FLAG), END_VAL)) {appearList.add(sb.toString()); /* // 匹配不到数据时才退出重新匹配 sb = new StringBuilder();currentResult = sensitiveWordResult;// 修改匹配到第一个关键字的索引位置i = i - matchIndex + 1;matchIndex = 0; */}}else {if (StringUtils.isNotBlank(sb.toString())) {sb = new StringBuilder();currentResult = sensitiveWordResult;// 修改匹配到第一个关键字的索引位置i = i - matchIndex;matchIndex = 0;}}}}}sensitiveWordList = appearList;}/** * 敏感词去重 * * @return */public Set<String> getSensitiveWordSet(){return Sets.newHashSet(sensitiveWordList);}/** * 统计关键词的个数 * * @param key * @return */public int getCount(String key){Multiset<String> countGroup = HashMultiset.create();countGroup.addAll(sensitiveWordList);return countGroup.count(key);}}

代码中引入了guava工具类,可直接使用。

4、测试类

@Testpublic void test04() { String[] keywords = {"那些", "大漠", "无耻"}; SensitiveWordTool tool = new SensitiveWordTool(keywords); String text = "大漠漫漫长河,没有江南风荷的淡然;只希望遇一人牧马塞外,看大雪纷飞后红梅缀雪的静染!"+"那时,烧一只陶埙,与那大漠、胡杨共同吹起风沙雪落就已经是最安然的生活……有事感叹:人生像秋风扫落叶般,有时是那么的无情,有时反而给人一种缠绵的感觉! " +"看到机智的往事而来,夕阳吐霞而归,那些,那些所谓的伤悲是不是可以放下?塞外牧马,食毡饮雪,虽然所有的一切看似不堪,可对于我来说,或许,那就是最好的去处!"+"不入红尘土,何染尘世泥?大漠孤烟直,长河落日圆,这又是一种怎样的心情呢?"; tool.filterSensitiveWordList(text); System.out.println("关键字为:"+ tool.getSensitiveWordSet()); System.out.println("关键字【大漠】次数为:"+ tool.getCount("大漠")); System.out.println("关键字【那些】次数为:"+ tool.getCount("那些"));}

5、结果

6、参考文档:

技术博客: https://www.cnblogs.com/chenssy/p/3751221.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。