原文地址http://blog.csdn.net/bitcarmanlee/article/details/53607776
最近需要使用分词搜索,在网上查找了许多,看了很多分词工具的对比,感觉这个还是非常不错的,相比较与ik更适合我们使用。
在网上查找了许多配置都不能用,大多数都是因为jar包版本不匹配,在这里我使用了两个jar包
ansj_seg 5.0.4 http://mvnrepository.com/artifact/org.ansj/ansj_seg/5.1.4
nlp-lang 1.7.3 http://mvnrepository.com/artifact/org.nlpcn/nlp-lang/1.7.3 注意这个包必须要最新的!!!!
1.给ansj来个硬广
项目的github地址:https://github.com/NLPchina/ansj_seg
git文档地址(最新)https://github.com/NLPchina/ansj_seg/wiki
项目的文档地址(有点旧):http://nlpchina.github.io/ansj_seg/
2.配置maven
在maven项目的pom中配置ansj的dependency:
<!-- https://mvnrepository.com/artifact/org.nlpcn/nlp-lang -->
<dependency>
<groupId>org.nlpcn</groupId>
<artifactId>nlp-lang</artifactId>
<version>1.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.ansj/ansj_seg -->
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.3</version>
</dependency>
3.使用实例
先不说那么多的理论,直接上可以run起来的代码。毕竟在工作过程中,解决问题是第一位的。只有解决完问题以后,我们才有功夫来慢慢研究其中的门道。
对于分词来说,最重要的任务无非就是拿到切分以后的结果(词)。直接看代码:
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import java.util.*;
public class AnsjTest {
public static void test() {
//只关注这些词性的词
Set<String> expectedNature = new HashSet<String>() {{
add("n");add("v");add("vd");add("vn");add("vf");
add("vx");add("vi");add("vl");add("vg");
add("nt");add("nz");add("nw");add("nl");
add("ng");add("userDefine");add("wh");
}};
String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;
Result result = ToAnalysis.parse(str); //分词结果的一个封装,主要是一个List<Term>的terms
System.out.println(result.getTerms());
List<Term> terms = result.getTerms(); //拿到terms
System.out.println(terms.size());
for(int i=0; i<terms.size(); i++) {
String word = terms.get(i).getName(); //拿到词
String natureStr = terms.get(i).getNatureStr(); //拿到词性
if(expectedNature.contains(natureStr)) {
System.out.println(word + ":" + natureStr);
}
}
}
public static void main(String[] args) {
test();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
将代码run起来:
欢迎/v, 使用/v, ansj/en, _, seg/en, ,, (, ansj/en, 中文/nz, 分词/n, ), 在/p, 这里/r, 如果/c, 你/r, 遇到/v, 什么/r, 问题/n, 都/d, 可以/v, 联系/v, 我/r, ./m, 我/r, 一定/d, 尽/v, 我/r, 所/u, 能/v, ./m, 帮助/v, 大家/r, ./m, ansj/en, _, seg/en, 更/d, 快/a, ,, 更/d, 准/a, ,, 更/d, 自由/a, !]
45
欢迎:v
使用:v
中文:nz
分词:n
遇到:v
问题:n
可以:v
联系:v
尽:v
能:v
帮助:v
上面的代码就拿到了我们想要的分词结果!
4.自定义词典
自定义词典在anjs_seg中运用起来十分简单,在作者文档中也有写到,我自己总结出来三种常用的,适用于5.1.x版本
项目下建立library文件夹,将自己的自定义词典放入文件夹中,自定义词典的格式要特别注意,上官方文档看作者的格式,他空了几格你也一定要空多少,不能多也不能少,否则加载进去也没用
1 配置文件中加载
这种方式是最正规的,在工程目录下建立library.properties文件,运行时会自动查找到配置文件中的内容
dic=library/car.dic
#set real name
isRealName=true
#isNameRecognition default true
isNameRecognition=true
#isNumRecognition default true
isNumRecognition=true
#digital quantifier merge default true
isQuantifierRecognition=true
isSkipUserDefine=true
5.1.x 版本的 配置 自定义词典 命名全部为dic不管你有一个还是两个
2内存中自定义加载
及时加载
Forest forest = Library.makeForest("library/car.dic");
MyStaticValue.putLibrary(DicLibrary.DEFAULT,"library/car.dic",forest);
需要实例化Forest对象 ,使用MyStaticValue的方法会加载进去
还有一个懒加载的方法,用到的时候再加载,同样的方法MyStaticValue.putLibrary(key,path)不传入Forest对象
配置完成后,最终查询时使用DicAnalysis.parse方法查询会优先从用户字典中查询