Ansj是一个非常好用的中文词典,而且也支持与Lucene等框架的搭配。在垂直领域当中,使用一个专用的词典非常重要。例如这次实训当中的“西红柿炖牛腩”,一般的分词会将其按照名词-动词-名词的形式分开。但我们都知道菜名应当是一个名词,所以我们在这里使用Ansj的分词。
在其官方文档当中,使用了UserDefineLibrary这样一个类。但是5.1.6版本已经找不到这个类了,现在的做法是
public class NLPAnsj {
@Test
public void Test(){
String str = "西红柿炖牛腩怎么做?";
DicLibrary.insert(DicLibrary.DEFAULT, "西红柿炖牛腩", "n", 1000);//设置自定义分词 n代表名词 1000代表默认出现的频率
Result result=NlpAnalysis.parse(str);
List<Term> termList=result.getTerms();
for(Term term:termList){
System.out.println(term.getName()+":"+term.getNatureStr());
}
}
}
输出:
西红柿炖牛腩:n
怎么:r
做:v
当然了,要是每一次都添加一次,非常麻烦,那么我们该怎么做呢?
也是如官方文档所说,使用配置文件加载。
在resources文件夹下建立library文件夹
里面新建一个userLibrary.dic
里面写上
西红柿炖牛腩 n 1000
n是词性,数字是频率
最后,官方文档里的东西还是有点问题,应该使用forest激活这个词典,并在解析的时候将forest当做参数传入函数。
public class NLPAnsj {
public static void main(String argsp[]) throws Exception{
String str = "西红柿炖牛腩怎么做";
Forest forest= Library.makeForest(NLPAnsj.class.getResourceAsStream("/library/userLibrary.dic"));//加载字典文件
Result result= NlpAnalysis.parse(str, forest);
List<Term> termList=result.getTerms();
for(Term term:termList){
System.out.println(term.getName()+":"+term.getNatureStr());
}
}
}
结果一样。