ansj

编程入门 行业动态 更新时间:2024-10-26 08:20:29

ansj

ansj

原文地址

最近需要使用分词搜索,在网上查找了许多,看了很多分词工具的对比,感觉这个还是非常不错的,相比较与ik更适合我们使用。

在网上查找了许多配置都不能用,大多数都是因为jar包版本不匹配,在这里我使用了两个jar包

ansj_seg 5.0.4 .ansj/ansj_seg/5.1.4

nlp-lang 1.7.3 .nlpcn/nlp-lang/1.7.3    注意这个包必须要最新的!!!!

1.给ansj来个硬广

项目的github地址:

git文档地址(最新)

项目的文档地址(有点旧):/ 

2.配置maven

在maven项目的pom中配置ansj的dependency:

<!-- .nlpcn/nlp-lang -->
<dependency><groupId>org.nlpcn</groupId><artifactId>nlp-lang</artifactId><version>1.7.3</version>
</dependency><!-- .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>的termsSystem.out.println(result.getTerms());List<Term> terms = result.getTerms(); //拿到termsSystem.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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上面的代码就拿到了我们想要的分词结果!

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方法查询会优先从用户字典中查询


更多推荐

ansj

本文发布于:2024-02-17 14:48:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1694406.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ansj

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!