Java实现敏感词过滤 - IKAnalyzer中文分词工具
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
Java实现敏感词过滤 - IKAnalyzer中文分词工具的更多相关文章
- Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Java实现敏感词过滤(转)
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Java实现敏感词过滤 - DFA算法
Java实现DFA算法进行敏感词过滤 封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet); package cn.swf ...
- 转:Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- Java实现敏感词过滤代码
原文:http://www.open-open.com/code/view/1445762764148 import java.io.BufferedReader; import java.io.Fi ...
- java类敏感词过滤类
package com.fpx.pcs.prealert.process.service.impl; import java.util.HashMap;import java.util.HashSet ...
- 敏感词过滤的算法原理之DFA算法
参考文档 http://blog.csdn.net/chenssy/article/details/26961957 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有 ...
- java敏感词过滤
敏感词过滤在网站开发必不可少.一般用DFA,这种比较好的算法实现的. 参考链接:http://cmsblogs.com/?p=1031 一个比较好的代码实现: import java.io.IOExc ...
随机推荐
- [转]etcd 启用 https
1, 生成 TLS 秘钥对 2,拷贝密钥对到所有节点 3,配置 etcd 使用证书 4,测试 etcd 是否正常 5,配置 kube-apiserver 使用 CA 连接 etcd 6,测试 kube ...
- IOS 获取系统相册和拍照使用HXPhotoPicker 返回页面时页面上移被nav遮住问题
解决: - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self.automaticallyAdj ...
- 2019.03.25 NOIP训练 匹配(match)(贪心)
题意简述: 思路: 直接考虑把人和物品都看成二维平面上面的a,ba,ba,b两类点,然后一个aaa和bbb匹配的条件是xa≤xb&&ya≤ybx_a\le x_b\&\& ...
- VMware虚拟机Linux增加磁盘空间的扩容操作
转载自点击打开链接 用VMwareware虚拟机安装的Red Hat Enterprise Linux系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置 ...
- Linux 目录结构详解
Linux目录详解 Linux目录详解(RHEL5.4) 由于linux是开放源代码,各大公司和团体根据linux的核心代码做各自的操作,编程.这样就造成在根下的目录的不同.这样就造成个人不能使用他人 ...
- ajax轮询与长轮询
刚刚网了关于轮询的知识,必须拿到自己这里来做个备份了! 其实以前用ajax轮询做个及时数据更新的,只是当时做了不知道那个就是轮询. 首先我们什么时候会想到用轮询技术呢? 一般而言,最多的是及时信息 ...
- 关于Apahce服务器安装中遇到的问题
在这篇中,将记录一下安装Apache服务器所遇到的一些问题,并简单讲一些Apache和Tomcat的区别: 1>apache安装中遇到的问题: 1.1 Apache目前不再提供编译好的exe安装 ...
- 用pyspider爬取并解析json字符串
获取堆糖网站所有用户的id 昵称及主页地址 #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2016-06-21 13:57: ...
- eclipse新建的项目,也添加到tomcat上了,地址栏访问的时候就是访问不到。。。怎么办
其实是可以访问的,目前我遇到以下两种可能出现这种现象的原因: 1.这个项目在你写的过程中改了名字,这样你访问改后的名字是不行的,需要在下图,也就是server服务器的server.xml文件中修改访问 ...
- 1.Spring AOP应用
首先咱们来了解一下具体的业务场景(这是个真实的项目的业务场景):具体的业务是这样的,现在系统中有六十多个主档(功能模块),每个主档都有新增.修改.删除功能,当我们在对每个主档做这些操作时需要对其记录日 ...