IK分词器结合JAVA使用并附一个实用的例子

IK Analyzer是基于lucene实现的分词开源框架,下载路径:http://code.google.com/p/ik-analyzer/downloads/list

需要在项目中引入:

IKAnalyzer.cfg.xml

IKAnalyzer2012.jar

lucene-core-3.6.0.jar

stopword.dic

什么都不用改

示例代码如下(使用IK Analyzer):

package com.haha.test;
 
import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;
 
public class Test2 {
	public static void main(String[] args) throws IOException {
		String text="基于java语言开发的轻量级的中文分词工具包";
		//创建分词对象
		Analyzer anal=new IKAnalyzer(true);		
		StringReader reader=new StringReader(text);
		//分词
		TokenStream ts=anal.tokenStream("", reader);
		CharTermAttribute term=ts.getAttribute(CharTermAttribute.class);
		//遍历分词数据
		while(ts.incrementToken()){
			System.out.print(term.toString()+"|");
		}
		reader.close();
		System.out.println();
	}
 
}

运行后结果:

基于|java|语言|开发|的|轻量级|的|中文|分词|工具包|

 

使用(lucene)实现:

package com.haha.test;
 
import java.io.IOException;
import java.io.StringReader;
 
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
 
public class Test3 {
	
	public static void main(String[] args) throws IOException {
		String text="基于java语言开发的轻量级的中文分词工具包";
		StringReader sr=new StringReader(text);
		IKSegmenter ik=new IKSegmenter(sr, true);
		Lexeme lex=null;
		while((lex=ik.next())!=null){
			System.out.print(lex.getLexemeText()+"|");
		}
	}
 
}

我们公司使用这个小工具开切分我们从网上爬下来的企业上下游信息,由于涉及公司隐私的问题不能上传这个例子,附上一个清除敏感词的例子。
使用前需对敏感词库进行初始化: 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算法

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在Java使用IK分词器进行查询,你需要进行以下步骤: 1. 添加IK分词器依赖项:首先,在你的Java项目中添加IK分词器的依赖项。你可以从GitHub上找到IK分词器的源代码,并将其作为一个Maven或Gradle项目导入到你的项目中。 2. 创建Elasticsearch客户端:按照上述步骤创建Elasticsearch客户端实例。 3. 创建搜索请求和分词器设置:创建一个搜索请求,并设置使用IK分词器进行搜索。以下是一个示例: ```java SearchRequest searchRequest = new SearchRequest("your_index"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("your_field", "your_search_text").analyzer("ik_max_word")); searchRequest.source(searchSourceBuilder); ``` 在上面的示例中,我们使用`matchQuery`来构建一个匹配查询,并使用`analyzer`方法将分词器设置为`ik_max_word`。你可以根据需要选择不同的IK分词器(例如`ik_smart`或其他自定义IK分词器)。 4. 执行搜索请求:使用客户端执行搜索请求,并处理搜索结果。以下是一个示例: ```java SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); for (SearchHit hit : hits.getHits()) { String sourceAsString = hit.getSourceAsString(); // 处理搜索到的文档数据 } ``` 在上面的示例中,我们通过调用`client.search`方法来执行搜索请求,并使用`getHits`方法获取搜索结果的列表。然后,我们可以遍历搜索结果,并处理每个搜索命中的文档数据。 请注意,以上示例是一个简单的示例,你可能需要根据你的具体需求进行更多的配置和操作。确保已经安装并配置了IK分词器,并且已经创建了相应的索引和映射。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuxu1116

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值