IKAnalyzer 独立使用 配置扩展词典

我与影子孤独终老i 提交于 2020-03-23 03:14:51

有三点要注意(要不然扩展词典始终不生效):

  1. 后缀名.dic的词典文件,必须如使用文档里所说的 无BOM的UTF-8编码保存的文件。如果不确定什么是  无BOM的UTF-8编码,最简单的方式就是 用Notepad++编辑器打开,Encoding->选择 Encoding in UTF-8 without BOM,然后保存。
  2. 项目preferences 里 编码选择 utf8。
  3. 词典和IKAnalyzer.cfg.xml配置文件的路径问题。IKAnalyzer.cfg.xml必须在src根目录下。词典可以任意放,但是在IKAnalyzer.cfg.xml里要配置对。如下:我的两个词典文件my.dic 和 mine.dic 放在src下的com.org.config包下,注意com前面一定不要加/,否则是绝对路径找不到。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">com/org/config/my.dic;com/org/config/mine.dic;</entry> 
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">/com/org/config/stopword.dic</entry> 
</properties>
 
IKAnalyzer 独立使用的代码:
package com.org;
 
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
 
public class IKAnalyzerTest {
public static void main(String[] args) {
String str = "最希望从企业得到的是独家的内容或销售信息,获得打折或促销信息等;最不希望企业进行消息或广告轰炸及访问用户的个人信息等。这值得使用社会化媒体的企业研究";
 
IKAnalysis(str);
}
 
public static String IKAnalysis(String str) {
StringBuffer sb = new StringBuffer();
try {
// InputStream in = new FileInputStream(str);//
byte[] bt = str.getBytes();// str
InputStream ip = new ByteArrayInputStream(bt);
Reader read = new InputStreamReader(ip);
IKSegmenter iks = new IKSegmenter(read, true);
Lexeme t;
while ((t = iks.next()) != null) {
sb.append(t.getLexemeText() + " , ");
 
}
sb.delete(sb.length() - 1, sb.length());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sb.toString());
return sb.toString();
 
}
}

 

运行结果:
加载扩展词典:com/org/config/my.dic
加载扩展词典:com/org/config/mine.dic
加载扩展停止词典:/com/org/config/stopword.dic
最希望 , 从 , 企业 , 得到 , 的 , 是 , 独家 , 的 , 内容或销售信息 , 获得 , 打折 , 或 , 促销信息 , 等 , 最不 , 希望 , 企业 , 进行 , 消息 , 或 , 广告 , 轰炸 , 及 , 访问 , 用户 , 的 , 个人信息 , 等 , 这 , 值得 , 使用 , 社会化媒体 , 的 , 企业研究 ,
 
加粗的词是扩展词典里的词。

 

以下是proj的目录结构。

附加:手动添加相关词库

    public static void main(String[] args) throws IOException {
        String s = "中文分词工具包";
        Configuration cfg = DefualtConfig.getInstance();  //加载词库
        cfg.setUseSmart(true); //设置智能分词
        Dictionary.initial(cfg);

        Dictionary dictionary = Dictionary.getSingleton();
        // List<String> words = new ArrayList<String>();
        // words.add("基础班");
        // words.add("高级会计实务");
        // dictionary.addWords(words);  //自动添加自定义词

        System.out.println(cfg.getMainDictionary()); // 系统默认词库
        System.out.println(cfg.getQuantifierDicionary());

        Hit hit = dictionary.matchInMainDict("基础班".toCharArray());
        System.out.println(hit.isMatch());

        System.out.println(queryWords(s));

    }

    /**
     * IK 分词
     *
     * @param query
     * @return
     * @throws IOException
     */
    public static List<String> queryWords(String query) throws IOException {
        List<String> list = new ArrayList<String>();
        StringReader input = new StringReader(query.trim());

        IKSegmenter ikSeg = new IKSegmenter(input, true);// true 用智能分词 ,false细粒度
        for (Lexeme lexeme = ikSeg.next(); lexeme != null; lexeme = ikSeg.next()) {
            list.add(lexeme.getLexemeText());
        }

        return list;
    }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!