zoukankan      html  css  js  c++  java
  • 分词工具Hanlp基于感知机的中文分词框架

     

     结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词、词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用1个算法解决3个问题,时自治同意的系统,同时三个任务顺序渐进,构成流水线式的系统。本文先介绍中文分词框架部分内容。

    中文分词

    训练

    只需指定输入语料的路径(单文档时为文件路径,多文档时为文件夹路径,灵活处理),以及模型保存位置即可:

    命令行

    java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main -task CWS -train -reference data/test/pku98/199801.txt -model data/test/perceptron/cws.bin

    API

        public void testTrain() throws Exception

        {        

            PerceptronTrainer trainer = new CWSTrainer();

            PerceptronTrainer.Result result = trainer.train(

                "data/test/pku98/199801.txt",

                Config.CWS_MODEL_FILE

                );

            //        System.out.printf("准确率F1:%.2f ", result.prf[2]);

        }

    事实上,视语料与任务的不同,迭代数、压缩比和线程数都可以自由调整,以保证最佳结果:

        /**

         * 训练

         *

         * @param trainingFile  训练集

         * @param developFile   开发集

         * @param modelFile     模型保存路径

         * @param compressRatio 压缩比

         * @param maxIteration  最大迭代次数

         * @param threadNum     线程数

         * @return 一个包含模型和精度的结构

         * @throws IOException

         */

        public Result train(String trainingFile, String developFile,

                            String modelFile, final double compressRatio,

                            final int maxIteration, final int threadNum) throws IOException

    单线程时使用AveragedPerceptron算法,收敛较好;多线程时使用StructuredPerceptron,波动较大。关于两种算法的精度比较,请参考下一小节。目前默认多线程,线程数为系统CPU核心数。请根据自己的需求平衡精度和速度。

    准确率

    sighan2005的msr数据集上的性能评估结果如下:

     

    l 语料未进行任何预处理

    只使用了7种状态特征,未使用词典

    压缩比0.0,迭代数50

    l 总耗时包含语料加载与模型序列化

    对任意PerceptronTagger,用户都可以调用准确率评估接口:

        /**

         * 性能测试

         *

         * @param corpora 数据集

         * @return 默认返回accuracy,有些子类可能返回P,R,F1

         * @throws IOException

         */

        public double[] evaluate(String corpora) throws IOException

    速度

    目前感知机分词是所有“由字构词”的分词器实现中最快的,比自己写的CRF解码快1倍。新版CRF词法分析器框架复用了感知机的维特比解码算法,所以速度持平。

     

    l 测试时需关闭词法分析器的自定义词典、词性标注和命名实体识别

    测试环境 Java8 i7-6700K

    测试

    测试时只需提供分词模型的路径即可:

    public void testCWS() throws Exception

    {

        PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);

        System.out.println(segmenter.segment("商品和服务"));

    }

    正常情况下对商品和服务的分词结果为[商品, 和, 服务]。建议在任何语料上训练时都试一试这个简单的句子,当作HelloWorld来测试。若这个例子都错了,则说明语料格式、规模或API调用上存在问题,须仔细排查,而不要急着部署上线。

    另外,数据包中已经打包了在人民日报语料1998年1月份上训练的模型,不传路径时将默认加载配置文件中指定的模型。

    在本系统中,分词器PerceptronSegmenter的职能更加单一,仅仅负责分词,不再负责词性标注或命名实体识别。这是一次接口设计上的新尝试,未来可能在v2.0中大规模采用这种思路去重构。

  • 相关阅读:
    【论文阅读-Embedding】《GloVe: Global Vectors for Word Representation》
    机器学习的问题总结
    预算平滑
    ML基础番外篇-距离度量
    vim配置使用
    强化学习 Note
    强化学习(David Silver)9:探索与利用
    强化学习(David Silver)8:集成学习和计划
    强化学习(David Silver)7:策略梯度算法
    数学基础01-最优化(梯度下降法、牛顿法、拟牛顿法等)
  • 原文地址:https://www.cnblogs.com/adnb34g/p/10647189.html
Copyright © 2011-2022 走看看