天天看點

中文自然語言處理工具hanlp隐馬角色标注詳解

本文旨在介紹如何利用HanLP訓練分詞模型,包括語料格式、語料預處理、訓練接口、輸出格式等。 目前HanLP内置的訓練接口是針對一階HMM-NGram設計的,另外附帶了通用的語料加載工具,可以通過少量代碼導出供其他訓練工具使用的特定格式(如CRF++)。

語料格式

輸入語料格式為人民日報分詞語料庫格式。該格式并沒有明确的規範,但總體滿足以下幾點:

1、單詞與詞性之間使用“/”分割,如華爾街/nsf,且任何單詞都必須有詞性,包括标點等。

2、單詞與單詞之間使用空格分割,如美國/nsf 華爾街/nsf 股市/n。

3、支援用[]将多個單詞合并為一個複合詞,如[紐約/nsf 時報/n]/nz,複合詞也必須遵守1和2兩點規範。

你可以參考OpenCorpus/pku98/199801.txt(作者并無版權,請勿詢問)。

語料預處理

語料預處理指的是将語料加載到記憶體中,根據需要增删改其中部分詞語的一個過程。 在HanLP中,這是通過CorpusLoader.walk實作的:

        CorpusLoader.walk("path/to/your/corpus", new CorpusLoader.Handler()

        {

            @Override

            public void handle(Document document)

            {

                System.out.println(document);

            }

        });

其中,document對象就是加載到記憶體的文檔,對應某一個文本檔案。使用者可以通過document.getSimpleSentenceList等接口擷取文檔中的句子清單,每個句子都是單詞的連結清單,具體參數請參考source.jar,不再贅述。而Handler是一個處理邏輯(lambda函數),在此可以編寫自己的預處理代碼。

· CRF分詞采用BMES标注集,從人民日報轉換到CRF訓練語料的完整預處理代碼請參考com.hankcs.test.model.TestCRF#testPrepareCRFTrainingCorpus。

· 若不使用上述預處理代碼則請注意:由于在HanLP實作的CRF分詞解碼算法中,數詞被轉換為M,英文被轉換為W;是以在訓練CRF分詞之前,需要用相同的邏輯預處理語料。轉換代碼請參考:com.hankcs.test.model.TestCRF#compile

訓練HMM-NGram分詞模型

HMM-NGram在HanLP中特意被處理為文本形式,友善使用者了解、修改HMM-NGram模型(習慣上稱為詞典,但這并不代表它不是模型)。此處的訓練就是為了得到分詞所需的全部模型,而訓練,隻需一兩行代碼:

 final NatureDictionaryMaker dictionaryMaker = new NatureDictionaryMaker();

        CorpusLoader.walk("path/to/your/corpus", new CorpusLoader.Handler()

            public void handle(Document document)

                dictionaryMaker.compute(CorpusUtil.convert2CompatibleList(document.getSimpleSentenceList(true)));

        dictionaryMaker.saveTxtTo("data/test/CoreNatureDictionary");

其中,document.getComplexSentenceList()代表擷取複合詞句子清單(即複合詞原樣輸出),使用者可以将其替換為CorpusUtil.convert2CompatibleList(document.getSimpleSentenceList(true))來将複合詞拆分為單個詞語。

輸出格式

訓練後一共得出3個檔案:

1、CoreNatureDictionary.txt:單詞詞性詞典

2、CoreNatureDictionary.ngram.txt:二進制接續詞典

3、CoreNatureDictionary.tr.txt:詞性轉移矩陣

接下來使用者可以通過替換配置檔案中的CoreDictionaryPath來使用新訓練的詞典。

繼續閱讀