`

Hanlp自然语言处理工具之词法分析器

 
阅读更多

 

本章是接前两篇《分词工具Hanlp基于感知机的中文分词框架》和《基于结构化感知机的词性标注与命名实体识别框架》的。本系统将同时进行中文分词、词性标注与命名实体识别3个任务的子系统称为“词法分析器”。

 

加载

对应的类为PerceptronLexicalAnalyzer,其构造方法为递增的3个模型地址:

<!--[if !supportLists]--><!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException

<!--[if !supportLists]--><!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException

<!--[if !supportLists]--><!--[endif]-->public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile, String nerModelFile) throws IOException

用户根据自己要进行的任务,训练3个模型中的任意个数,然后灵活传入此类构造即可。此处假设训练了3个模型,那么传入这3个模型的路径即可构造词法分析器:

public void testCWSandPOSandNER() throws Exception

{

    PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);

}

分析

词法分析器的分析接口如下:

public static final String SENTENCE = "香港特别行政区的张朝阳说商品和服务是三原县鲁桥食品厂的主营业务";

public void testCWSandPOSandNER() throws Exception

{

    PerceptronLexicalAnalyzer segmenter = new PerceptronLexicalAnalyzer(Config.CWS_MODEL_FILE, Config.POS_MODEL_FILE, Config.NER_MODEL_FILE);

    Sentence sentence = segmenter.analyze(SENTENCE);

    System.out.println(sentence);

}

正常情况下输出:

[香港/ns 特别/a 行政区/n]/ns 的/n 张朝阳/nr 说/v 商品/n 和/c 服务/vn 是/v [三原县/ns 鲁桥/nz 食品厂/n]/nt 的/z 主营/vn 业务/n

Sentence结构是一个对人民日报语料格式的实现,用户可以方便地用for循环去遍历单词,用instanceof来判断单词属于复合词还是简单词。此处演示输出句子中所有复合词内部的简单词:

for (IWord word : sentence)

{

    if (word instanceof CompoundWord)

        System.out.println(((CompoundWord) word).innerList);

}

结果:

[香港/ns, 特别/a, 行政区/n]

[三原县/ns, 鲁桥/nz, 食品厂/n]

通过此结构,我们可以捕捉语言的复合结构(简单词构成复合词)。此结构输出为文本后满足人民日报2014语料格式,形成了一个语料与文本之间的闭环。

HanLP旧接口的兼容

本系统依然兼容HanLP的seg接口,与analyze接口比较如下:

System.out.println(segmenter.seg(SENTENCE));

System.out.println(segmenter.analyze(SENTENCE));

输出:

[香港特别行政区/ns, 的/n, 张朝阳/nr, 说/v, 商品/n, 和/c, 服务/vn, 是/v, 三原县鲁桥食品厂/nt, 的/z, 主营/vn, 业务/n]

[香港/ns 特别/a 行政区/n]/ns 的/n 张朝阳/nr 说/v 商品/n 和/c 服务/vn 是/v [三原县/ns 鲁桥/nz 食品厂/n]/nt 的/z 主营/vn 业务/n

注意上面两个结果中的命名实体有着本质的不同,seg接口无法输出层次结构,而analyze接口可以。

在线学习

本框架另一个特色功能是“在线学习”,或称“增量训练”。其适用场景如下: 线上系统的统计模型依然会犯错误,但重新训练的代价过大(比如耗时长,没有语料等等)。本系统支持在线学习新知识,实时修正统计模型的错误。这里举一个分词的例子,人民日报1998年1月份训练出来的模型无法分对“下雨天地面积水”这个句子:

PerceptronSegmenter segmenter = new PerceptronSegmenter(Config.CWS_MODEL_FILE);

System.out.println(segmenter.segment("下雨天地面积水"));

输出:

[下雨, 天地, 面积, 水]

但本系统支持在线学习这个句子的正确分词方式:

segmenter.learn("下雨天 地面 积水");

System.out.println(segmenter.segment("下雨天地面积水"));

通过learn接口,感知机模型学习到了这个句子的正确分词方式,并输出了正确结果:

[下雨天, 地面, 积水]

对于类似的句子,也拥有了举一反三的泛化能力:

System.out.println(segmenter.segment("下雨天地面积累了很多水"));

输出:

[下雨天, 地面, 积累, 了, 很多, 水]

词性标注器和命名实体识别器也有类似的learn接口,用户可举一反三类似地调用,不再赘述。

模型压缩与持久化

在线学习或训练后的模型可以序列化到某个路径,其接口是:

    /**

     * @param ratio 压缩比c(压缩掉的体积,压缩后体积变为1-c)

     * @return

     */

    public LinearModel compress(final double ratio)

    

    /**

     * 保存到路径

     *

     * @param modelFile

     * @throws IOException

     */

    public void save(String modelFile, final double ratio) throws IOException

比如压缩比为0.1,则压缩后的体积为原来的0.9。此处的“体积”指的是特征数量,并不一定等于文件体积。

命令行接口

如上文所述,本框架中的功能可以通过命令行调用:

$ java -cp hanlp.jar com.hankcs.hanlp.model.perceptron.Main

缺少必需参数: -model

用法: com.hankcs.hanlp.model.perceptron.Main

  -task[TaskType]任务类型:CWS|POS|NER (CWS)

  -train[flag]执行训练任务

  -test[flag]执行预测任务

  -evaluate[flag]执行评估任务

  -model[String]模型文件路径

  -input[String]输入文本路径

  -result[String]结果保存路径

  -gold[String]标准分词语料

  -reference[String]训练集

  -development[String]开发集

  -iter[Integer]迭代次数 (5)

  -compressRatio[Double]模型压缩比率 (0.0)

  -thread[int]线程数 (8)

当用户按照上文所述训练了1到3个模型后,可以通过命令行接口交互式地观察效果:

$ java -cp target/hanlp-1.6.0.jar:src/main/resources com.hankcs.hanlp.model.perceptron.Main -test

商品和服务

商品/n 和/c 服务/vn

上海华安工业(集团)公司董事长谭旭光和秘书胡花蕊来到美国纽约现代艺术博物馆参观

[上海/ns 华安/nz 工业/n (/w 集团/n )/w 公司/n]/nt 董事长/n 谭旭光/nr 和/c 秘书/n 胡花蕊/nr 来到/v [美国/ns 纽约/ns 现代/t 艺术/n 博物馆/n]/ns 参观/v

<!--[if !supportLists]--><!--[endif]-->默认加载配置文件指定的模型,可以通过-model your/cws.bin,your/pos.bin,your/ner.bin指定别的模型。

<!--[if !supportLists]--><!--[endif]-->还可以将输入输出重定向到文件,形成一个pipeline。

<!--[if !supportLists]--><!--[endif]-->更多信息,请参考《编译运行》。

未来工作

<!--[if !supportLists]--><!--[endif]-->英文和数字最好要做特殊处理。

<!--[if !supportLists]--><!--[endif]-->hanlp-lucene-plugin的集成。

<!--[if !supportLists]--><!--[endif]-->集成自定义词典。

<!--[if !supportLists]--><!--[endif]-->索引分词等功能。

<!--[if !supportLists]--><!--[endif]-->重构出新的分词、词性标注与命名实体识别接口,统一所有分词器,并逐步淘汰旧接口。

 文章摘自:HanLP: Han Language Processing ——开源自由的汉语言处理包

分享到:
评论

相关推荐

    C_minus语言词法分析器

    C_minus语言词法分析器 C_minus语言词法分析器

    C语言开发课程设计词法分析器源代码.zip

    设计任务: 使用词法分析的自动生成工具 Flex 生成 C/C++语言的词法分析器 ,当输入C/C++源代码文件时,即后缀为 c/cpp 的文件,程序输出后缀为 tok 的文本性文件。涉及知识点:词法分析,Flex 工具使用。 环境配置:...

    词法分析器 词法分析器

    词法分析器 词法分析器 词法分析器 词法分析器 相信对大家会有帮助的

    编译原理:手工构造TINY语言的词法分析器.zip

    手工构造Tiny语言的词法分析器(C/C++语言) 1、熟悉Tiny语言词法; 2、构造DFA; 3、设计数据类型、数据结构; 4、用C++实现Tiny语言的词法分析器 。

    词法分析器词法分析器词法分析器词法分析器

    编译原理 词法分析器 词法分析器 int lineno = 0; //行号 FILE * source; FILE * listing; FILE * test; int EchoSource = TRUE; //打印源码标识 int TraceScan = TRUE; //打印二元组标识 int main( int ...

    编译原理 词法分析器 词法分析器

    编译原理 词法分析器 词法分析器编译原理 词法分析器 词法分析器编译原理 词法分析器 词法分析器编译原理 词法分析器 词法分析器编译原理 词法分析器 词法分析器编译原理 词法分析器 词法分析器编译原理 词法分析器 ...

    《编译原理》课程的实验 编译器词法分析器

    手工编写C--语言的词法分析器,理解词法分析器的工作原理,熟练掌握高级语言的单词符号的正规式表示,设计词法扫描器的工作流程并编写源代码清单,识别出单词的二元属性,填写符号表,同时,编写词法错误处理程序。

    词法分析器实验报告.doc

    本次实验通过用python语言,设计,编制,调试一个词法分析子程序,识别单词,实现一个python词法分析器,经过此过程可以加深对编译器解释单词流的过程。

    C 语言 词法分析器

    一个不错的C语言分析器,用C++写的,大家可以参考下……

    用C#语言实现的词法分析器

    词法分析是编译的第一个阶段,主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素。... 本词法分析器中包含各种词法单元的正则表达式,DFA转换表,设计流程等。

    PL/0语言词法分析器

    PL/0是pascal语言的子集,这是对PL/0语言进行词法分析并输出word类型和值

    java做的CMM语言词法分析器

    编译原理课程实践:用Java对CMM语言写的一个词法分析器,附带源代码

    编译原理实验-PL/0语言的词法分析

    (Python实现,详细注释)通过实现PL/0语言(一种示例小语言)的词法分析器,理解词法分析过程,掌握程序各部分之间的接口安排。 PL/0的语言的词法分析器将要完成以下工作: (1)跳过分隔符(如空格,回车,制表符...

    pl0词法分析器

    c语言实现PL0词法分析器

    C minus语言词法分析器的设计

    C minus语言词法分析器的设计是大学老师教学的资源和培养学生动手能力

    C_minus语言词法分析器的设计

    编译原理课程的词法分析器的设计,内含完整代码。

    用LEX(FLEX)生成PL语言的词法分析器,识别出单词符号

    利用FLEX工具生成PL语言的词法分析器,实现对输入的PL语言源程序进行词法分析,识别出单词符号。 要求输入一个PL语言源程序文件demo.pl,输出一个文件tokens.txt,该文件包括每一个单词及其种别枚举值,每行一个单词...

    java 版 编译原理实验 C_minus语言词法分析器的设计

    编译原理实验 C_minus语言词法分析器的设计 1、该个词法分析器要求至少能够识别以下几类单词: a. 关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; b. 标识符:识别与...

    词法分析器实验报告及源代码

    编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。...执行词法分析的程序称为词法分析器,也称为扫描器。词法分析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。

    java词法分析器

    本词法分析器能分析出java中常见...另外,本词法分析器对java中的注释也进行了处理,解析过程中会跳过注释。总的来说,本词法分析器是一个比较完备的java词法分析器。本人对比了一下网上词法分析器,觉得本人的比较好。

Global site tag (gtag.js) - Google Analytics