ansj 自定义词典

提出问题

java多态 是java中重要的概念,应该分成2个词:

  1. java
  2. 多态

但日常生活中,多态 根本不是词,所以使用 ansj 进行分词时,就会分成下面3个词:

  1. java
  2. 多
  3. 态

这就导致分词错误

代码验证

public static void main(String[] args) {
    Result result = DicAnalysis.parse("java多态");
    Iterator<Term> it = result.iterator();
    while(it.hasNext()){
        Term t = it.next();
        System.out.println(t.getName());
    }
}

分析问题

让 ansj 加载 特有的词 多态,就能正确识别,进行分词

解决

定义字典文件

在该文件中,定义 特有的词

创建 userLibrary.dict 文件,内容如下:

多态    n    1000

关键 关键 关键:

  • 必须是 tab键 进行间隔,不能是 空格。粘贴到 idea 等开发工具时,可能会自动变成 空格 ,必须手动改正

  • 如果是英文,必须全小写

  • 词性需小写(如n)

加载词库

方式一:

Forest forest = Library.makeForest("D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict");

方式二:

MyStaticValue.putLibrary(DicLibrary.DEFAULT, "D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict");

分词

方式一:

分词时必须指定上面的 forest

Result result = DicAnalysis.parse("java多态",forest);

方式二:

Result result = DicAnalysis.parse("java多态");

完整代码

方式一:

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.DicAnalysis;
import org.nlpcn.commons.lang.tire.domain.Forest;
import org.nlpcn.commons.lang.tire.library.Library;

public class Test2 {
    static Forest forest;

    public static void main(String[] args) {
        try {
            forest = Library.makeForest("D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict");
        } catch (Exception e) {
            e.printStackTrace();
        }

        Result result = DicAnalysis.parse("java多态",forest);
        Iterator<Term> it = result.iterator();
        while(it.hasNext()){
            Term t = it.next();
            System.out.println(t.getName());
        }
    }
}

方式二:

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.library.DicLibrary;
import org.ansj.splitWord.analysis.DicAnalysis;
import org.ansj.util.MyStaticValue;

import java.util.Iterator;

public class Test3 {

    public static void main(String[] args) {
        MyStaticValue.putLibrary(DicLibrary.DEFAULT, "D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict");
        Result result = DicAnalysis.parse("java多态");
        Iterator<Term> it = result.iterator();
        while(it.hasNext()){
            Term t = it.next();
            System.out.println(t.getName());
        }
    }
}