zoukankan      html  css  js  c++  java
  • 中文自然语言处理工具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()

            {

                @Override

                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来使用新训练的词典。

  • 相关阅读:
    2017中国大学生程序设计竞赛
    [POJ3667]Hotel(线段树,区间合并,重写)
    [HDOJ3308]LCIS(线段树,区间合并,新的代码)
    [HDOJ5091]Beam Cannon(贪心,线段树,扫描线,矩形内覆盖最多点)
    HDU 5128.The E-pang Palace-计算几何
    HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))
    洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
    hihoCoder #1831 : 80 Days-RMQ (ACM/ICPC 2018亚洲区预选赛北京赛站网络赛)
    ACM竞赛常用头文件模板-备忘
    C++-二维vector初始化大小方法-备忘
  • 原文地址:https://www.cnblogs.com/adnb34g/p/10369830.html
Copyright © 2011-2022 走看看