Hanlp分詞之CRF中文詞法分析詳解

adnb34g發表於2019-02-18


這是另一套基於 CRF的詞法分析系統,類似感知機詞法分析器,提供了完善的訓練與分析介面。

CRF的效果比感知機稍好一些,然而訓練速度較慢,也不支援線上學習。

預設模型訓練自 OpenCorpus/pku98/199801.txt, hanlp 1.6.2以上版本釋出

語料格式等與感知機詞法分析器相同,請先閱讀《感知機詞法分析器》。

中文分詞

訓練

        CRFSegmenter segmenter = new CRFSegmenter(null);

        segmenter.train("data/test/pku98/199801.txt", CWS_MODEL_PATH);

輸出為 HanLP私有的二進位制模型,有興趣的話還可以通過命令匯出為相容CRF++的純文字格式。

java -cp hanlp.jar com.hankcs.hanlp.model.crf.crfpp.crf_learn -T cws.bin cws.txt

CRF++相容

由於 C++的執行效率和記憶體效率優於Java,所以推薦直接利用CRF++執行大規模訓練。

首先將人民日報語料轉換為 CRF++格式:

 

        CRFSegmenter segmenter = new CRFSegmenter(null);

        segmenter.convertCorpus("data/test/pku98/199801.txt", "data/test/crf/cws-corpus.tsv");

然後準備一份特徵模板,或者直接用 HanLP預設的:

        segmenter.dumpTemplate("data/test/crf/cws-template.txt");

接著用 CRF++的crf_learn執行訓練:

crf_learn cws-template.txt cws-corpus.tsv cws -t

·此處必須使用-t命令CRF++輸出文字格式的模型cws.txt

·HanLP只相容CRF++的文字模型,不相容二進位制

 

cws.txt格式的模型傳入CRFSegmenter或CRFLexicalAnalyzer的建構函式即可建立分詞器,同時HanLP會自動建立二進位制快取.txt.bin,下次載入耗時將控制在數百毫秒內。

預測

可通過如下方式載入:

        CRFSegmenter segmenter = new CRFSegmenter(CWS_MODEL_PATH);

        List<String> wordList = segmenter.segment("商品和服務");

        System.out.println(wordList);

不傳入模型路徑時將預設載入配置檔案指定的模型。

詞性標註

CRF詞性標註器的訓練與載入與中文分詞類似,對應CRFPOSTagger。

命名實體識別

CRF命名實體識別也是類似的用法,對應CRFNERecognizer。

CRF詞法分析器

訓練了 1至3個模型後,可以構造CRF詞法分析器:

    /**

     * 構造CRF詞法分析器

     *

     * @param cwsModelPath CRF分詞器模型路徑

     * @param posModelPath CRF詞性標註器模型路徑

     * @param nerModelPath CRF命名實體識別器模型路徑

     */

    public CRFLexicalAnalyzer(String cwsModelPath, String posModelPath, String nerModelPath) throws IOException

    

    /**

     * 載入配置檔案指定的模型

     *

     * @throws IOException

     */

    public CRFLexicalAnalyzer() throws IOException

構造後可以呼叫 analyze介面或與舊介面相容的seg:

 

        CRFLexicalAnalyzer analyzer = new CRFLexicalAnalyzer();

        String[] tests = new String[]{

            "商品和服務",

            "上海華安工業(集團)公司董事長譚旭光和祕書胡花蕊來到美國紐約現代藝術博物館參觀",

            "微軟公司於1975年由比爾·蓋茲和保羅·艾倫創立,18年啟動以智慧雲端、前端為導向的大改組。" // 支援繁體中文

        };

        for (String sentence : tests)

        {

            System.out.println(analyzer.analyze(sentence));

            System.out.println(analyzer.seg(sentence));

        }

1.6.2以上版本中,所有的詞法分析介面都同時支援簡繁。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2636268/,如需轉載,請註明出處,否則將追究法律責任。

相關文章