当前位置: 首页 > news >正文

Hanlp中使用纯JAVA实现CRF分词

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Hanlp中使用纯JAVA实现CRF分词

与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 双数组Trie树(DoubleArrayTrie)储存,得到了一个高性能的中文分词器。

开源项目

本文代码已集成到HanLP中开源:http://hanlp.com/

CRF简介

CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题。

CRF训练

这类耗时的任务,还是交给了用C++实现的CRF++。关于CRF++输出的CRF模型,请参考《CRF++模型格式说明》。

CRF解码

解码采用维特比算法实现。并且稍有改进,用中文伪码与白话描述如下:

首先任何字的标签不仅取决于它自己的参数,还取决于前一个字的标签。但是第一个字前面并没有字,何来标签?所以第一个字的处理稍有不同,假设第0个字的标签为X,遍历X计算第一个字的标签,取分数最大的那一个。

如何计算一个字的某个标签的分数呢?某个字根据CRF模型提供的模板生成了一系列特征函数,这些函数的输出值乘以该函数的权值最后求和得出了一个分数。该分数只是“点函数”的得分,还需加上“边函数”的得分。边函数在本分词模型中简化为f(s',s),其中s'为前一个字的标签,s为当前字的标签。于是该边函数就可以用一个4*4的矩阵描述,相当于HMM中的转移概率。

实现了评分函数后,从第二字开始即可运用维特比后向解码,为所有字打上BEMS标签。

实例

还是取经典的“商品和服务”为例,首先HanLP的CRFSegment分词器将其拆分为一张表:

null表示分词器还没有对该字标注。

代码

上面说了这么多,其实我的实现非常简练:

标注结果

标注后将table打印出来:

最终处理

将BEMS该合并的合并,得到:

然后将词语送到词典中查询一下,没查到的暂时当作nx,并记下位置(因为这是个新词,为了表示它的特殊性,最后词性设为null),再次使用维特比标注词性:

新词识别

CRF对新词有很好的识别能力,比如:

输出:

null表示新词。

转载自hankcs的博客

转载于:https://my.oschina.net/u/3793864/blog/2249216

相关文章:

  • kotlin使用spring mvc(三)
  • 在Ubuntu 11.04中安装Openresty
  • Nginx 部署HTTPS
  • 浅谈IP地址-1
  • Rafy 领域实体框架演示(2) - 新功能展示
  • 高程读书笔记 第六章 面向对象程序设计
  • oracle常用操作语句
  • 搞定面试官
  • 使用WPF实现3D场景[一]
  • 初识MongoDB
  • STM32之CAN ---CAN ID过滤器分析
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 进制之间的相互转换
  • 值得推荐的10本PHP书籍(转)
  • C文件操作
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Flex布局到底解决了什么问题
  • JSDuck 与 AngularJS 融合技巧
  • MySQL QA
  • Node 版本管理
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 每天10道Java面试题,跟我走,offer有!
  • 如何设计一个微型分布式架构?
  • 网络应用优化——时延与带宽
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 正则表达式小结
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​一些不规范的GTID使用场景
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)STL算法之元素计数
  • (done) 两个矩阵 “相似” 是什么意思?
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十三)Flask之特殊装饰器详解
  • (五)MySQL的备份及恢复
  • (一)WLAN定义和基本架构转
  • .bashrc在哪里,alias妙用
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net CF下精确的计时器
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core跨平台微服务学习资源
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Head First设计模式]策略模式
  • [IE编程] IE中使网页元素进入编辑模式
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [LeetCode 127] - 单词梯(Word Ladder)
  • [node]Node.js 模块系统
  • [NOIP2014普及组]子矩阵
  • [Redis]Redis高级特性的配置及使用