Ansj 分词工具
如今,自然语言处理技术越来越成熟,越来越得到大家关注。许多互联网公司,如京东,阿里,新美大等互联网公司都有大量的文本评论数据,如何从这些文本中挖掘出有效的信息成为关键,这就需要应用自然语言处理技术,而对文本分词是自然语言处理的第一步,很关键。分词工具有很多NLPIR、IKAnalyzer、stanford nlp等等,本篇博文将介绍我所使用的分词工具 Ansj 的使用。
准备工作
下载 jar
访问http://maven.nlpcn.org/org/ansj/ 下载ansj-seg,倒入自己的 IDE,就可以了。如果你使用 maven,可以添加以下依赖:
<!-- 增加新的maven源 -->
<repositories>
<repository>
<id>mvn-repo</id>
<url>http://maven.nlpcn.org/</url>
</repository>
</repositories>
<dependencies>
....
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.0.1</version>
</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<Term> parse(String text) {
if (text == null || text.length() == 0) {
return null;
}
return ToAnalysis.parse(text);
}
}
- 分词结果:
从两次的分词结果比较结果可以看出,我们的词库已经起到了作用,对应的姓名和媒体都已经是单独的一个词了,而且词性也是自定义的词性。如,中新网/media,安倍晋三/name等等。这样就可以根据词性获取需要的信息了。