CRF++模板构建分为两类,一类是Unigram标注,一类是Bigram标注。

Unigram和Bigram模板分别生成CRF的状态特征函数  和转移特征函数  。其中  是标签,  是观测序列,  是当前节点位置。
Bigram 下面只需要加一个B就ok了,其它还是用Unigram模板生成特征。

主要介绍Unigram模板

Unigram

U00:%x[-2,0] 
U01:%x[-1,0] 
U02:%x[0,0] 
U03:%x[1,0] 
U04:%x[2,0] 
U05:%x[-2,0]/%x[-1,0]/%x[0,0] 
U06:%x[-1,0]/%x[0,0]/%x[1,0] 
U07:%x[0,0]/%x[1,0]/%x[2,0] 
U08:%x[-1,0]/%x[0,0] 
U09:%x[0,0]/%x[1,0]

特征模板格式:%x[row,col]。x可取U或B,对应两种类型。方括号里的编号用于标定特征来源,row表示相对当前位置的行,0即是当前行;col对应训练文件中的列。这里只使用第1列(编号0),即文字。

Unigram template:第一个字符是U,这是用于描述unigram feature的模板。每一行%x[#,#]生成一个CRFs中的点(state)函数: f(s, o), 其中s为t时刻的的标签(output),o为t时刻的上下文.

这是CRF++例子中给出的模板,一共有9个模板,先看第一个模板,表示当前词和其前面的第二个词组成的特征,U02表示当前词。

CRF++遍历每一个位置时,会查看此位置前一个位置(-1,0)和前两个位置(-2,0)和后一个位置(1,0)和后两个位置(2,0),这是U00,U01,U02,U03,U04所规定的。至于后面几个特征函数,比如U05,它把前面的几个位置合起来看。

以‘小明今天穿了一件红色上衣’为例,符合CRF++处理格式的这句话应该变成如下形式: 
小 B 
明 I 
今 B 
天 I 
穿 S 
了 S 
一 B 
件 I 
红 B 
色 I 
上 B 
衣 I

假设我们有三个标记tag,B(表示一个词的开头那个字),I(表示一个词的结尾那个字),S(表示单个字的词)。

先看第一个模板U00:%x[-2,0],第一个模板产生的特征如下: 
如果当前词是‘今’,那-2位置对应的字就是‘小’, 
每个特征对应的字如下:

U00:%x[-2,0]=====>小 
U01:%x[-1,0]=====>明 
U02:%x[0,0]=====>今 
U03:%x[1,0]=====>天 
U04:%x[2,0]=====>穿 
U05:%x[-2,0]/%x[-1,0]/%x[0,0]=====>小/明/今 
U06:%x[-1,0]/%x[0,0]/%x[1,0]=====>明/今/天 
U07:%x[0,0]/%x[1,0]/%x[2,0]=====>今/天/穿 
U08:%x[-1,0]/%x[0,0]=====>明/今 
U09:%x[0,0]/%x[1,0]=====>今/天

根据第一个模板U00:%x[-2,0]能得到的转移特征函数如下: 
func1=if(output=B and feature=’U00:小‘ ) return 1 else return 0

func2=if(output=I and feature=’U00:小’) return 1 else return 0 
func3=if(output=S and feature=’U00:小) return 1 else return 0

其中output=B 指的是当前词(字)的预测标记,也就是’今‘的预测标记,每个模板会把所有可能的标记输出都列一遍,然后通过训练确定每种标记的权重,合理的标记在训练样本中出现的次数多,对应的权重就高,不合理的标记在训练样本中出现的少,对应的权重就少。

得到三个特征函数之后当前这个字’‘的特征函数利用第一个模板就全了。然后扫描下一个字‘‘,以’天‘字作为当前字预测这个字的标记tag,同样会得到三个特征函数: 
func4=if(output=B and feature=’U00:明’) return 1 else return 0 
func5=if(output=I and feature=’U00:明’) return 1 else return 0 
func6=if(output=S and feature=’U00:明’) return 1 else return 0

后面U01~U09都会按此方式继续扫描生成特征函数。

func = if(output = B,and feature = “U05:小/明/今”) return 1 else return 0 
即当前位置输出标签为B,并且当前位置为,前一个位置是,前两个位置是,则输出1。

不管以何种方式扫描或者生成模板,最终会生成N*T*M个特征函数,N代表分词中词的个数,T代表分词标注的tag标签(B,I,S等),M代表模板个数。

Bigram类型

与Unigram不同的是,Bigram类型模板生成的函数会多一个参数:上个节点的标签 。

生成函数类似于:

func1 = if (prev_output = B and output = B and feature=B01:"北") return 1 else return 0
这样,每行模板则会生成 L*L*N 个特征函数。经过训练后,这些函数的权值反映了上一个节点的标签对当前节点的影响。

参考链接https://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html

CRF++模板使用(转)的更多相关文章

  1. NLP之CRF应用篇(序列标注任务)

    1.CRF++的详细解析 完成的是学习和解码的过程:训练即为学习的过程,预测即为解码的过程. 模板的解析: 具体参考hanlp提供的: http://www.hankcs.com/nlp/the-cr ...

  2. CRF++ 如何制定自己的特征模板

    工具的简单介绍 对该工具的安装及介绍我这里就不再赘述,请参考官方文档或者国内一些翻译后的中文版.也还比较清楚. 我只介绍一下crf++在命名实体识别中的一些用法,这些都建立在你了解crf++的一些最基 ...

  3. CRF++使用小结

    1. 简述 最近要应用CRF模型,进行序列识别.选用了CRF++工具包,具体来说是在VS2008的C#环境下,使用CRF++的windows版本.本文总结一下了解到的和CRF++工具包相关的信息. 参 ...

  4. 条件随机场CRF简介

    http://blog.csdn.net/xmdxcsj/article/details/48790317 Crf模型 1.   定义 一阶(只考虑y前面的一个)线性条件随机场: 相比于最大熵模型的输 ...

  5. CRF++中文分词使用指南

    http://blog.csdn.net/marising/article/details/5769653 前段时间写了中文分词的一些记录里面提到了CRF的分词方法,近段时间又研究了一下,特把方法写下 ...

  6. 基于条件随机场(CRF)的命名实体识别

    很久前做过一个命名实体识别的模块,现在有时间,记录一下. 一.要识别的对象 人名.地名.机构名 二.主要方法 1.使用CRF模型进行识别(识别对象都是最基础的序列,所以使用了好评率较高的序列识别算法C ...

  7. CRF++使用小结(转)

    1. 简述 近期要应用CRF模型,进行序列识别.选用了CRF++工具包,详细来说是在VS2008的C#环境下,使用CRF++的windows版本号.本文总结一下了解到的和CRF++工具包相关的信息. ...

  8. CRF技能词识别过程

    最近在用CRF做未登录技能词识别,虽然艰难,但是感觉很爽,效率非常高. (1)数据准备: 选取30000行精语料作为训练数据.每一个br作为一条数据.使用已有的技能词典对数据进行无标注分词. (2)训 ...

  9. 长短时记忆网络LSTM和条件随机场crf

    LSTM 原理 CRF 原理 给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型.假设输出随机变量构成马尔科夫随机场(概率无向图模型)在标注问题应用中,简化成线性链条件随机场,对数线性判别 ...

随机推荐

  1. Android Studio- 把项目提交到SVN中操作方法

    第一步 下载SVN,下载完成之后,需要吧command line client tools点击修改安装 然后Crash Reporter点击选择取消安装 如果不进行该操作,则可能在C:\Program ...

  2. 【笔记】sublime 一些常用功能和快捷键

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...

  3. 【明哥报错簿】之 mybatis异常invalid comparison: java.util.Date and java.lang.String

    背景:数据库为postgresql,表字段属性为timestamp格式 原因是mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串''进行对比判断则会引 ...

  4. [一]SpringBoot 之 HelloWorld

    (1)新建一个Maven Java工程 (2)在pom.xml文件中添加Spring BootMaven依赖 2.1在pom.xml中引入spring-boot-start-parent spring ...

  5. MySQL数据库无法远程连接的解决办法

    远程登陆数据库的时候出现了下面出错信息: ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx', 经过今天下午的 ...

  6. 洛谷P4606 [SDOI2018]战略游戏 【圆方树 + 虚树】

    题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情 ...

  7. 洛谷 P2233 [HNOI2002]公交车路线 解题报告

    P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...

  8. Zabbix Agent for Linux部署(四)

    一.环境介绍 二.代理安装 1.将代理程序拷贝至Node1服务器的/usr/src/zabbix3.4.5/目录下 [root@Node3 zabbix3.-.el7.x86_64.rpm zabbi ...

  9. Linux基础-----------nginx安装和nginx web、nginx反向代理、nfs 服务

    作业一:nginx服务1)二进制安装nginx包 yum install epel-release -y 先安装epel-release 再查看yum源中已经安装上了epel相关文件 中间省去了一些安 ...

  10. 初识python版本

    区别一: python2x:源码重复不规范. python3x:重新整理规范了源码. 区别二: python2x: 默认的编码方式ascii,显示中文需要首行添加:#  _*_ encoding: u ...