分词工具-ansj

Ansj 分词工具

如今,自然语言处理技术越来越成熟,越来越得到大家关注。许多互联网公司,如京东,阿里,新美大等互联网公司都有大量的文本评论数据,如何从这些文本中挖掘出有效的信息成为关键,这就需要应用自然语言处理技术,而对文本分词是自然语言处理的第一步,很关键。分词工具有很多NLPIR、IKAnalyzer、stanford nlp等等,本篇博文将介绍我所使用的分词工具 Ansj 的使用。

准备工作

  • 下载 jar

    访问http://maven.nlpcn.org/org/ansj/ 下载ansj-seg,倒入自己的 IDE,就可以了。如果你使用 maven,可以添加以下依赖:

   
<repositories>
    <repository>
        <id>mvn-repoid>
        <url>http://maven.nlpcn.org/url>
    repository>
repositories>


<dependencies>
    ....

    <dependency>
        <groupId>org.ansjgroupId>
        <artifactId>ansj_segartifactId>
        <version>5.0.1version>
    dependency>
    ....
dependencies>

示例演示

先来看一个简单的的 demo 演示。

  • Demo
import org.ansj.splitWord.analysis.ToAnalysis;
import org.junit.Test;

/**
 * Created by lionel on 16/11/17.
 */
public class AnsjTest {
    @Test
    public void test(){
        String text="中新网11月17日电 据外媒报道,日本首相安倍晋三称,有机会在唐纳德•特朗普获得美国大选胜利后,成为第一个与他会晤的外国领导人是“莫大的荣幸”,并表示希望在他们之间建立信任关系。报道称,特朗普与安倍或将于当地时间17日傍晚在纽约会谈。";
        System.out.println(ToAnalysis.parse(text));
    }
}
  • 分词结果:

这里写图片描述

可以发现,文本已经分好词了,但是有些分词就不是很满意,如“中新网”就是一个网站名,应该就是一个词,又比如说安倍晋三是一个人名,应该就是一个词。要想解决这个问题就要加入自己的词库。

  • 自定义词库
    现有以下词库:

名字词库(name.dic)

李连杰
刘德华
安倍晋三
唐纳德.特兰普

媒体词库(media.dic)

中新网
新华网

以上两个词库我直接放在 resources 文件夹下。
通过UserDefineLibrary类中的静态方法 insertWord()来加载自己的词库。

  • 示例代码
import org.ansj.domain.Term;
import org.ansj.library.UserDefineLibrary;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

/**
 * Created by lionel on 16/11/17.
 */
public class TextSegment {
    static {
        loadDictionary("/media.dic", "media");
        loadDictionary("/name.dic", "name");
    }

    /**
     *  从本地文件加载词库,并打上对应的标签,名字词库对应的词性是 name;媒体词库对应的词性是 media
     *
     * @param dic    本地词库路径
     * @param speech 词性
     */
    public static void loadDictionary(String dic, String speech) {
        try {
            InputStream is = TextSegment.class.getResourceAsStream(dic);
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = reader.readLine()) != null) {
                String token = line.replaceAll("[\\r\\n]", "").trim();
                UserDefineLibrary.insertWord(token, speech, 1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 实现分词
     *
     * @param text 文本
     * @return 分词后的文本
     */
    public static List parse(String text) {
        if (text == null || text.length() == 0) {
            return null;
        }

        return ToAnalysis.parse(text);
    }
}
  • 分词结果:

这里写图片描述

从两次的分词结果比较结果可以看出,我们的词库已经起到了作用,对应的姓名和媒体都已经是单独的一个词了,而且词性也是自定义的词性。如,中新网/media,安倍晋三/name等等。这样就可以根据词性获取需要的信息了。

你可能感兴趣的:(自然语言处理)