Java实现敏感词过滤
生活随笔
收集整理的這篇文章主要介紹了
Java实现敏感词过滤
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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实现敏感词过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原生twig模板引擎详解(安装使用)
- 下一篇: css3的伪(伪类和伪元素)大合集