当前位置: 首页 > 工具软件 > ansj_seg > 使用案例 >

ansj_seg 学习,自定义词典加载

戚勇
2023-12-01

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


 类似资料: