天天看點

分詞工具-ansjAnsj 分詞工具

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));
    }
}
           
  • 分詞結果:
分詞工具-ansjAnsj 分詞工具

可以發現,文本已經分好詞了,但是有些分詞就不是很滿意,如“中新網”就是一個網站名,應該就是一個詞,又比如說安倍晉三是一個人名,應該就是一個詞。要想解決這個問題就要加入自己的詞庫。

  • 自定義詞庫

    現有以下詞庫:

名字詞庫(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);
    }
}
           
  • 分詞結果:
分詞工具-ansjAnsj 分詞工具

從兩次的分詞結果比較結果可以看出,我們的詞庫已經起到了作用,對應的姓名和媒體都已經是單獨的一個詞了,而且詞性也是自定義的詞性。如,中新網/media,安倍晉三/name等等。這樣就可以根據詞性擷取需要的資訊了。

繼續閱讀