IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。

官网: https://code.google.com/archive/p/ik-analyzer/
本用例借助 IKAnalyzer 进行分词,通过遍历分词集合进行敏感词过滤。

使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet);

1、pom.xml 引入maven依赖
<!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer -->
<dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version>
</dependency>
2、工具类
package cn.swfilter.util;import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;import java.io.IOException;
import java.io.StringReader;
import java.util.*;/*** 敏感词处理工具 - IKAnalyzer中文分词工具 - 借助分词进行敏感词过滤** @author sam* @since 2017/9/4*/
public class SensitiveWordUtil2 {/*** 敏感词集合*/public static HashMap sensitiveWordMap;/*** 初始化敏感词库** @param sensitiveWordSet 敏感词库*/public static synchronized void init(Set<String> sensitiveWordSet) {//初始化敏感词容器,减少扩容操作sensitiveWordMap = new HashMap(sensitiveWordSet.size());for (String sensitiveWord : sensitiveWordSet) {sensitiveWordMap.put(sensitiveWord, sensitiveWord);}}/*** 判断文字是否包含敏感字符** @param txt 文字* @return 若包含返回true,否则返回false*/public static boolean contains(String txt) throws Exception {boolean flag = false;List<String> wordList = segment(txt);for (String word : wordList) {if (sensitiveWordMap.get(word) != null) {return true;}}return flag;}/*** 获取文字中的敏感词** @param txt 文字* @return*/public static Set<String> getSensitiveWord(String txt) throws IOException {Set<String> sensitiveWordList = new HashSet<>();List<String> wordList = segment(txt);for (String word : wordList) {if (sensitiveWordMap.get(word) != null) {sensitiveWordList.add(word);}}return sensitiveWordList;}/*** 替换敏感字字符** @param txt         文本* @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱**** @return*/public static String replaceSensitiveWord(String txt, char replaceChar) throws IOException {String resultTxt = txt;//获取所有的敏感词Set<String> sensitiveWordList = getSensitiveWord(txt);String replaceString;for (String sensitiveWord : sensitiveWordList) {replaceString = getReplaceChars(replaceChar, sensitiveWord.length());resultTxt = resultTxt.replaceAll(sensitiveWord, replaceString);}return resultTxt;}/*** 替换敏感字字符** @param txt        文本* @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]* @return*/public static String replaceSensitiveWord(String txt, String replaceStr) throws IOException {String resultTxt = txt;//获取所有的敏感词Set<String> sensitiveWordList = getSensitiveWord(txt);for (String sensitiveWord : sensitiveWordList) {resultTxt = resultTxt.replaceAll(sensitiveWord, replaceStr);}return resultTxt;}/*** 获取替换字符串** @param replaceChar* @param length* @return*/private static String getReplaceChars(char replaceChar, int length) {String resultReplace = String.valueOf(replaceChar);for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;}/*** 对语句进行分词** @param text 语句* @return 分词后的集合* @throws IOException*/private static List segment(String text) throws IOException {List<String> list = new ArrayList<>();StringReader re = new StringReader(text);IKSegmenter ik = new IKSegmenter(re, true);Lexeme lex;while ((lex = ik.next()) != null) {list.add(lex.getLexemeText());}return list;}public static void main(String[] args) throws IOException {Set<String> sensitiveWordSet = new HashSet<>();sensitiveWordSet.add("太多");sensitiveWordSet.add("爱恋");sensitiveWordSet.add("静静");sensitiveWordSet.add("哈哈");sensitiveWordSet.add("啦啦");sensitiveWordSet.add("感动");sensitiveWordSet.add("发呆");//初始化敏感词库SensitiveWordUtil2.init(sensitiveWordSet);/*** 需要进行处理的目标字符串*/System.out.println("敏感词的数量:" + SensitiveWordUtil2.sensitiveWordMap.size());String string = "太多的伤感情怀也许只局限于饲养基地 荧幕中的情节。"+ "然后 我们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把自己的情感也附加于银幕情节中,然后感动就流泪,"+ "难过就躺在某一个人的怀里尽情的阐述心扉或者手机卡复制器一个贱人一杯红酒一部电影在夜 深人静的晚上,关上电话静静的发呆着。";System.out.println("待检测语句字数:" + string.length());/*** 是否含有关键字*/try {boolean result = SensitiveWordUtil2.contains(string);System.out.println(result);} catch (Exception e) {e.printStackTrace();}/*** 获取语句中的敏感词*/Set<String> set = SensitiveWordUtil2.getSensitiveWord(string);System.out.println("语句中包含敏感词的个数为:" + set.size() + "。包含:" + set);/*** 替换语句中的敏感词*/String filterStr = SensitiveWordUtil2.replaceSensitiveWord(string, '*');System.out.println(filterStr);String filterStr2 = SensitiveWordUtil2.replaceSensitiveWord(string, "[*敏感词*]");System.out.println(filterStr2);}}
以上,使用 IKAnalyzer 可以很轻松的实现敏感词过滤功能。
缺点:使用 IKAnalyzer 进行分词,有时候分词结果并不是很理想。如:发呆着,分词结果是 ["发","呆着"],而我们的敏感词是发呆,这种情况就会造成敏感词过滤不完整。
因此,推荐使用 Java实现敏感词过滤 - DFA算法
经博主测试,其效率低于使用DFA算法实现的敏感词过滤。参考:Java实现敏感词过滤 - DFA算法

附敏感词库:链接: https://pan.baidu.com/s/1bBrbtk 密码: e4w6

转载于:https://www.cnblogs.com/magicalSam/p/7473791.html

Java实现敏感词过滤 - IKAnalyzer中文分词工具相关推荐

  1. Java实现敏感词过滤双向词库完美跳过24口交换机

    Java实现敏感词过滤jar包3.0版本发布,采用双向词库,当检索语句中敏感词交错在正向词库中时,比较词汇level,如果正向词汇的level大于敏感词的level,则跳过此敏感词.完美过滤,&quo ...

  2. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  3. java实现敏感词过滤算法DFA并忽略敏感词中的特殊字符

    参考文章:https://blog.csdn.net/chenssy/article/details/26961957 补充说明: 1.具体的DFA介绍参考原文章,此处只是补充了文章中没有介绍的点以及 ...

  4. 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现

    文章目录 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 代码如下 package utils;import com.goo ...

  5. 敏感词过滤 java

    学习目标: 今天我们来学习一下,java 完成敏感词过滤. 完成思路: 1. 敏感词存入前缀树 前缀树: 名称:trie.字典树.查找树 特点:查找效率高.消耗内存大(也就是以空间换时间) 应用:字符 ...

  6. NLP笔记:中文分词工具简介

    中文分词工具简介 0. 引言 1. jieba分词 1. jieba分词的基本用法 2. jieba分词的进阶版用法 1. 全模式的分词 2. 自定义领域词表加入 3. 使用jieba进行关键词抽取 ...

  7. java HashMap实现中文分词器 应用:敏感词过滤实现

    今天下午部门内部技术分享是分词器算法.这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健. 作者简介: Ansj分词器作者 elasticsearch-sql(elasticsearch的sql插件)作 ...

  8. 基于ik分词器和布隆过滤器实现敏感词过滤

    文章目录 准备阶段 为何选用IK Analyzer 什么是布隆过滤器 开发过程 整合Ik 总结 <基于ik分词器和布隆过滤器实现敏感词过滤>首发 牧马人博客转发请加此提示 最近公司业务有个 ...

  9. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

最新文章

  1. 11CSS的三大特性
  2. [置顶] 电信系统方案 电信Boss系统
  3. Fennec Alpha 1 for Windows Mobile available
  4. 用动态内存读入任意大小的文件(c语言)
  5. getheaderfields java_java – HttpsURLConnection getHeaderFields没有返回set-cookie
  6. mysql主从同步面试题_面试被问MySQL 主从复制,怎么破?
  7. android微信条码支付接口,Android中调用微信支付接口
  8. 【渝粤教育】国家开放大学2018年春季 8616-22T食品营养卫生 参考试题
  9. 堆栈小应用(一):括号匹配程序
  10. 学会提问pdf_原来只要1分钟,Word、PPT、PDF文件就能随意互相转换,快学学
  11. Pandas数据分析与处理补充习题
  12. wps打开服务器文件很慢,wps打开速度慢怎么办-wps打开速度慢解决方法 - 河东软件园...
  13. Fedora 12下使用HP USB打印机(HP laserjet P1007)
  14. 纵行科技联合Kinéis等欧洲企业,开发ZETA星地融合低功耗物联网芯片
  15. 学习React Native必看的几个开源项目
  16. Spring的bean的注创建、依赖注入、自动装配
  17. symbian v3模拟器开启后自动关闭
  18. 利用R语言对贷款客户作风险评估(下)——零膨胀回归分析
  19. idyll 开源生成交互式web的标记语言试用
  20. 关于如何清除百度全家桶的一些经验

热门文章

  1. 合理的使用纯函数式编程
  2. Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
  3. [na][tools]快速ping网段工具-QuickPing
  4. WebSocket FlashSocket
  5. 如何防御DDoS攻击
  6. price ceiling
  7. finally 90%
  8. TortoiseGIT安装过程及问题
  9. 博弈入门(思想)HDkiki‘s game;
  10. ThinkPHP5下自己写日志