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

加载

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

l public PerceptronLexicalAnalyzer(String cwsModelFile) throws IOException

l public PerceptronLexicalAnalyzer(String cwsModelFile, String posModelFile) throws IOException

l 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

l 默认加载配置文件指定的模型,可以通过-model your/cws.bin,your/pos.bin,your/ner.bin指定别的模型。

l 还可以将输入输出重定向到文件,形成一个pipeline。

l 更多信息,请参考《编译运行》。

未来工作

l 英文和数字最好要做特殊处理。

l 与hanlp-lucene-plugin的集成。

l 集成自定义词典。

l 索引分词等功能。

l 重构出新的分词、词性标注与命名实体识别接口,统一所有分词器,并逐步淘汰旧接口。

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

Hanlp自然语言处理工具之词法分析器的更多相关文章

  1. Hanlp自然语言处理工具的使用演练

    Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用.Hanlp具备功能完善.性能高效.架构清洗.语料时新.可自定义的特点:提供词法分析(中文分词.磁性标注.命名实体识 ...

  2. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

  3. Python中调用自然语言处理工具HanLP手记

    手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...

  4. 中文自然语言处理工具HanLP源码包的下载使用记录

    中文自然语言处理工具HanLP源码包的下载使用记录 这篇文章主要分享的是hanlp自然语言处理源码的下载,数据集的下载,以及将让源代码中的demo能够跑通.Hanlp安装包的下载以及安装其实之前就已经 ...

  5. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

  6. HanLP 自然语言处理 for nodejs

    HanLP 自然语言处理 for nodejs ·支持中文分词(N-最短路分词.CRF分词.索引分词.用户自定义词典.词性标注),命名实体识别(中国人名.音译人名.日本人名.地名.实体机构名识别),关 ...

  7. GitHub10岁之际HanLP自然语言处理包用户量跃居榜首

    在本周,GitHub终于度过了属于它自己的十周岁生日.这个在2008年由3个来自旧金山的年轻人创建的基于Git的代码托管网站,先后超越了元老级的SourceForge和背景强大的Google Code ...

  8. Python 的十个自然语言处理工具

    原文 先mark,后续尝试. 1.NLTK NLTK 在用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的借口,还有分类.分词.除茎.标注.语法分析 ...

  9. 自然语言处理工具hanlp 1.7.3版本更新内容一览

    HanLP 1.7.3 发布了.HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用.HanLP 具备功能完善.性能高效.架构清晰.语料时新.可自定义的特 ...

随机推荐

  1. Oracle数据库各种名字的区别

    数据库名(DB_NAME).数据库实例名(INSTANCE_NAME).操作系统环境变量(ORACLE_SID).数据库服务名(SERVICE_NAME).数据库域名(DB_DOMAIN)以及全局数据 ...

  2. Unity3D Button组管理(给按钮的onclick事件“传递参数”)

    using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; // ...

  3. pytest自动化7:assert断言

    前言:assert断言就是将实际结果和期望结果做对比,符合预期结果就测试pass,不符合预期就测试failed. 实例1:简单断言 实例1优化版--增加异常信息文字描述 异常断言 excinfo 是一 ...

  4. 使用iframe框架后的页面跳转时目标页面变为iframe的子页面的问题

    <frameset rows="4,200,10,*,120" cols="*" framespacing="0" framebord ...

  5. 转自:阮一峰 Git远程操作详解

      对于git的一些指令还是有些生疏,而且在课堂上讲的只是简单介绍了一些功能,并没有具体深入,看到这篇文章之后,觉得比较详细,所以转了过来. Git是目前最流行的版本管理系统,学会Git几乎成了开发者 ...

  6. 如何使用HTML5的WebSocket实现网页与服务器的双工通信(二)

    本系列服务端双工通信包括两种实现方式:一.使用Socket构建:二.使用WCF构建.本文为使用WCF构建服务端的双工通信,客户端同样使用Html5的WebSocket技术进行调用. 一.创建WCF服务 ...

  7. CSS效果:跑马灯按钮

    HTML代码 <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  8. 基于Openstack环境下开启SRIOV

    主题思想: 先在系统层面修改配置文件,再去openstack里面修改配置文件 compute node系统层面: 先确认下是否含有ixgbe moudle lsmod |grep ixgbe 修改/e ...

  9. 模块四-shutil模块

    shutil模块 高级的文件处理模块 主要是文件的处理,移动,压缩和解压缩 shutil模块的使用方法: shutil.copyfile()#拷贝文件 shutil.copy()#拷贝文件和权限 sh ...

  10. jmeter学习随笔

    1.jmeter配置环境是需要注意jdk版本,不同的jdk版本可支持运行不同版本的jmeter,对应关系如下图 2.HTTP请求和HTTP默认请求的区别 若一个项目中会多次调用相同的接口域名及端口号, ...