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));
}
}
- 分詞結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyM0QTMwQjM2EzNxETM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
可以發現,文本已經分好詞了,但是有些分詞就不是很滿意,如“中新網”就是一個網站名,應該就是一個詞,又比如說安倍晉三是一個人名,應該就是一個詞。要想解決這個問題就要加入自己的詞庫。
-
自定義詞庫
現有以下詞庫:
名字詞庫(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, );
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 實作分詞
*
* @param text 文本
* @return 分詞後的文本
*/
public static List<Term> parse(String text) {
if (text == null || text.length() == ) {
return null;
}
return ToAnalysis.parse(text);
}
}
- 分詞結果:
從兩次的分詞結果比較結果可以看出,我們的詞庫已經起到了作用,對應的姓名和媒體都已經是單獨的一個詞了,而且詞性也是自定義的詞性。如,中新網/media,安倍晉三/name等等。這樣就可以根據詞性擷取需要的資訊了。