本章是接前两篇《分词工具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. L360 Most People Spend Their Time in Just 25 Places

    Some people are always out on the town, going to concerts, restaurant openings, you name it. They're ...

  2. shell脚本定义输出字符颜色

    #-------------------定义输入颜色---------------------# RED='\033[1;31m' GREEN='\033[1;32m' YELLOW='\033[1; ...

  3. 普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎。。。。。 测试。。测试。。。没刷过微博。屯里来的。看看啥效果

    普天同庆,微博开通,从今以后,努力用功! 狗屎一样的顺口溜!Q狗屎!!狗屎..... 测试..测试...没刷过微博.屯里来的.看看啥效果

  4. fdisk语法

    Linux下的fdisk功能是极其强大的,用它可以划分出最复杂的分区,下面简要介绍一下它的用法: 对于IDE硬盘,每块盘有一个设备名:对应于主板的四个IDE接口,设备名依次为:/dev/hda,/de ...

  5. vs2017激活码

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...

  6. Mac pip install mysql-python

    首次在mac os 下,用pip install MySQL-Python时经常出现如下错误: sh: mysql_config: command not foundTraceback (most r ...

  7. mac系统访问windows共享文件夹

    1. 打开finder 2. 找到前往 - 连接服务器 3. 打开后,输入smb://ip地址  点击连接 4. 选择共享文件夹 5. 点击好,之后就可以了,如下图

  8. Unity攻略

    Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  9. O/R关系的深入理解(转载)

    本文转载自aa8945163: http://aa8945163.iteye.com/blog/859713 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型和关系型数据库的数据 ...

  10. s21day22 python笔记

    s21day22 python笔记 一.内容回顾及补充 模块补充 importlib.import_module:通过字符串的形式导入模块 #示例一: import importlib # 用字符串的 ...