这是另一套基于CRF的词法分析系统,类似感知机词法分析器,提供了完善的训练与分析接口。

CRF的效果比感知机稍好一些,然而训练速度较慢,也不支持在线学习。

默认模型训练自OpenCorpus/pku98/199801.txt,随hanlp 1.6.2以上版本发布

语料格式等与感知机词法分析器相同,请先阅读《感知机词法分析器》。

中文分词

训练

CRFSegmenter segmenter = new CRFSegmenter(null);

segmenter.train("data/test/pku98/199801.txt", CWS_MODEL_PATH);

输出为HanLP私有的二进制模型,有兴趣的话还可以通过命令导出为兼容CRF++的纯文本格式。

java -cp hanlp.jar com.hankcs.hanlp.model.crf.crfpp.crf_learn -T cws.bin cws.txt

与CRF++兼容

由于C++的运行效率和内存效率优于Java,所以推荐直接利用CRF++执行大规模训练。

首先将人民日报语料转换为CRF++格式:

CRFSegmenter segmenter = new CRFSegmenter(null);

segmenter.convertCorpus("data/test/pku98/199801.txt", "data/test/crf/cws-corpus.tsv");

然后准备一份特征模板,或者直接用HanLP默认的:

segmenter.dumpTemplate("data/test/crf/cws-template.txt");

接着用CRF++的crf_learn执行训练:

crf_learn cws-template.txt cws-corpus.tsv cws -t

·此处必须使用-t命令CRF++输出文本格式的模型cws.txt

·HanLP只兼容CRF++的文本模型,不兼容二进制

将cws.txt格式的模型传入CRFSegmenter或CRFLexicalAnalyzer的构造函数即可创建分词器,同时HanLP会自动创建二进制缓存.txt.bin,下次加载耗时将控制在数百毫秒内。

预测

可通过如下方式加载:

CRFSegmenter segmenter = new CRFSegmenter(CWS_MODEL_PATH);

List<String> wordList = segmenter.segment("商品和服务");

System.out.println(wordList);

不传入模型路径时将默认加载配置文件指定的模型。

词性标注

CRF词性标注器的训练与加载与中文分词类似,对应CRFPOSTagger。

命名实体识别

CRF命名实体识别也是类似的用法,对应CRFNERecognizer。

CRF词法分析器

训练了1至3个模型后,可以构造CRF词法分析器:

/**

* 构造CRF词法分析器

*

* @param cwsModelPath CRF分词器模型路径

* @param posModelPath CRF词性标注器模型路径

* @param nerModelPath CRF命名实体识别器模型路径

*/

public CRFLexicalAnalyzer(String cwsModelPath, String posModelPath, String nerModelPath) throws IOException

/**

* 加载配置文件指定的模型

*

* @throws IOException

*/

public CRFLexicalAnalyzer() throws IOException

构造后可以调用analyze接口或与旧接口兼容的seg:

CRFLexicalAnalyzer analyzer = new CRFLexicalAnalyzer();

String[] tests = new String[]{

"商品和服务",

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

"微软公司於1975年由比爾·蓋茲和保羅·艾倫創立,18年啟動以智慧雲端、前端為導向的大改組。" // 支持繁体中文

};

for (String sentence : tests)

{

System.out.println(analyzer.analyze(sentence));

System.out.println(analyzer.seg(sentence));

}

在1.6.2以上版本中,所有的词法分析接口都同时支持简繁。

Hanlp分词之CRF中文词法分析详解的更多相关文章

  1. 条件随机场之CRF++源码详解-预测

    这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易. 预测 上一篇条件随机场训练的源码详解中,有一个地方并没有 ...

  2. elasticsearch-.yml(中文配置详解)

    此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...

  3. HanLP中的人名识别分析详解

    在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: u u名字识别的问题 #387 u u机构名识别错误 u u关于层叠H ...

  4. HAProxy详细中文用法详解

    一.HAProxy简介 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProx ...

  5. Python OS模块常用功能 中文图文详解

    一.Python OS模块介绍 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> i ...

  6. Nginx配置文件中文注释详解

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  7. coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解

      一, 前言    1,研究coreseek的动机 我有一个自己的笔记博客,经常在上面做一些技术文章分析.在查询一些文章的时候,以前只能将要查询的内容去mysql中用like模糊匹配.在文章多了的情 ...

  8. HanLP用户自定义词典源码分析详解

    1. 官方文档及参考链接 l 关于词典问题Issue,首先参考:FAQ l 自定义词典其实是基于规则的分词,它的用法参考这个issue l 如果有些数量词.字母词需要分词,可参考:P2P和C2C这种词 ...

  9. filebeat.yml(中文配置详解)

    ################### Filebeat Configuration Example ######################### ####################### ...

随机推荐

  1. 我有特殊的Windows激活姿势

    一直都在用的激活姿势,给大家分享下~ 保存为 .cmd 文件 右键->以管理员身份运行 @echo off setlocal EnableDelayedExpansion & cd /d ...

  2. 2019-04-04-day026-模块和包的导入

    课前 估分 重新做题 思考为什么 积累问题 提前了解你的情况 40分以下 选课系统 按照反射那个版本 把反射的逻辑看明白 接着把逻辑填完整 用上pickle logging写日志 进阶 : 用软件开发 ...

  3. Java知识汇总——思维导图

    转载:https://www.cnblogs.com/java1024/p/8757952.html Java知识点汇总,从基础到常用的API.还有常用的集合类,总结的很详细.图片是从论坛里面找到的, ...

  4. Linux make menuconfig查找并快速跳转指定驱动选项

    /********************************************************************** * Linux make menuconfig查找并快速 ...

  5. 【】opencv窗口创建、大小调整等问题

    opencv窗口创建.大小调整等问题 图像最开始大小可能为1280*720或者其他大小的: 使用cv::resizeWindow函数之后,不同的参数感觉窗口大小没有多少改变,看不出来: 使用cv::s ...

  6. Python之路,第十七篇:Python入门与基础17

    python3  面向对象编程 面向对象编程 什么是对象? 一切皆对象: 面向对象是思想: 描述思想的语言有:C++/Java/Python/Swift/C# 两个概念: 类  class 对象 ob ...

  7. 【02_258】Add Digits

    Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...

  8. c# 移动鼠标到指定位置

    /// <summary> /// 引用user32.dll动态链接库(windows api), /// 使用库中定义 API:SetCursorPos /// </summary ...

  9. 牛客OI赛制测试赛2

    A题: https://www.nowcoder.com/acm/contest/185/A 链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题 ...

  10. [LeetCode&Python] Problem 788. Rotated Digits

    X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...