日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现敏感词过滤 - IKAnalyzer中文分词工具

發(fā)布時(shí)間:2025/3/15 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现敏感词过滤 - IKAnalyzer中文分词工具 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

IKAnalyzer 是一個開源的,基于java語言開發(fā)的輕量級的中文分詞工具包。

官網(wǎng): https://code.google.com/archive/p/ik-analyzer/
本用例借助 IKAnalyzer 進(jìn)行分詞,通過遍歷分詞集合進(jìn)行敏感詞過濾。

使用前需對敏感詞庫進(jìn)行初始化: 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中文分詞工具 - 借助分詞進(jìn)行敏感詞過濾** @author sam* @since 2017/9/4*/ public class SensitiveWordUtil2 {/*** 敏感詞集合*/public static HashMap sensitiveWordMap;/*** 初始化敏感詞庫** @param sensitiveWordSet 敏感詞庫*/public static synchronized void init(Set<String> sensitiveWordSet) {//初始化敏感詞容器,減少擴(kuò)容操作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 替換的字符,匹配的敏感詞以字符逐個替換,如 語句:我愛中國人 敏感詞:中國人,替換字符:*, 替換結(jié)果:我愛**** @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 替換的字符串,匹配的敏感詞以字符逐個替換,如 語句:我愛中國人 敏感詞:中國人,替換字符串:[屏蔽],替換結(jié)果:我愛[屏蔽]* @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;}/*** 對語句進(jìn)行分詞** @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("發(fā)呆");//初始化敏感詞庫SensitiveWordUtil2.init(sensitiveWordSet);/*** 需要進(jìn)行處理的目標(biāo)字符串*/System.out.println("敏感詞的數(shù)量:" + SensitiveWordUtil2.sensitiveWordMap.size());String string = "太多的傷感情懷也許只局限于飼養(yǎng)基地 熒幕中的情節(jié)。"+ "然后 我們的扮演的角色就是跟隨著主人公的喜紅客聯(lián)盟 怒哀樂而過于牽強(qiáng)的把自己的情感也附加于銀幕情節(jié)中,然后感動就流淚,"+ "難過就躺在某一個人的懷里盡情的闡述心扉或者手機(jī)卡復(fù)制器一個賤人一杯紅酒一部電影在夜 深人靜的晚上,關(guān)上電話靜靜的發(fā)呆著。";System.out.println("待檢測語句字?jǐn)?shù):" + string.length());/*** 是否含有關(guān)鍵字*/try {boolean result = SensitiveWordUtil2.contains(string);System.out.println(result);} catch (Exception e) {e.printStackTrace();}/*** 獲取語句中的敏感詞*/Set<String> set = SensitiveWordUtil2.getSensitiveWord(string);System.out.println("語句中包含敏感詞的個數(shù)為:" + set.size() + "。包含:" + set);/*** 替換語句中的敏感詞*/String filterStr = SensitiveWordUtil2.replaceSensitiveWord(string, '*');System.out.println(filterStr);String filterStr2 = SensitiveWordUtil2.replaceSensitiveWord(string, "[*敏感詞*]");System.out.println(filterStr2);}}
以上,使用 IKAnalyzer 可以很輕松的實(shí)現(xiàn)敏感詞過濾功能。
缺點(diǎn):使用 IKAnalyzer 進(jìn)行分詞,有時(shí)候分詞結(jié)果并不是很理想。如:發(fā)呆著,分詞結(jié)果是 ["發(fā)","呆著"],而我們的敏感詞是發(fā)呆,這種情況就會造成敏感詞過濾不完整。
因此,推薦使用 Java實(shí)現(xiàn)敏感詞過濾 - DFA算法
經(jīng)博主測試,其效率低于使用DFA算法實(shí)現(xiàn)的敏感詞過濾。參考:Java實(shí)現(xiàn)敏感詞過濾 - DFA算法

附敏感詞庫:鏈接: https://pan.baidu.com/s/1bBrbtk 密碼: e4w6

轉(zhuǎn)載于:https://www.cnblogs.com/magicalSam/p/7473791.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Java实现敏感词过滤 - IKAnalyzer中文分词工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。