crf++ 里的特征模板

本贴最后更新于 2169 天前,其中的信息可能已经时移世异

一:

Unigram 和 Bigram 模板分别生成 CRF 的状态特征函数S_l(y_i,x,i) 和转移特征函数t_k(y_{i-1},y_i,x,i) 。其中 y_i 是标签, x 是观测序列, i 是当前节点位置。每个函数还有一个权值,具体请参考 CRF 相关资料。

crf++ 模板定义里的 %x[row,col],即是特征函数的参数x

举个例子。假设有如下用于分词标注的训练文件:


北 N B
京 N E
欢 V B
迎 V M
你 N E

其中第 3 列是标签,也是测试文件中需要预测的结果,有 BME 3 种状态。第二列是词性,不是必须的。

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

1、Unigram 类型
每一行模板生成一组状态特征函数,数量是 LN 个,L 是标签状态数。N 是此行模板在训练集上展开后的唯一样本数,在这个例子中,第一列的唯一字数是 5 个,所以有 LN = 3*5=15。

例如:U01:%x[0,0],生成如下 15 个函数:


func1 = if (output = B and feature=U01:"北") return 1 else return 0
func2 = if (output = M and feature=U01:"北") return 1 else return 0
func3 = if (output = E and feature=U01:"北") return 1 else return 0
func4 = if (output = B and feature=U01:"京") return 1 else return 0
...
func13 = if (output = B and feature=U01:"你") return 1 else return 0
func14 = if (output = M and feature=U01:"你") return 1 else return 0
func15 = if (output = E and feature=U01:"你") return 1 else return 0

这些函数经过训练后,其权值表示函数内文字对应该标签的概率(形象说法,概率和可大于 1)。

又如 U02:%x[-1,0],训练后,该组函数权值反映了句子中上一个字对当前字的标签的影响。

2、Bigram 类型

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

生成函数类似于:

func1 = if (prev_output = B and output = B and feature=B01:"北") return 1 else return 0

这样,每行模板则会生成 LLN 个特征函数。经过训练后,这些函数的权值反映了上一个节点的标签对当前节点的影响。

 

每行模版可使用多个位置。例如:U18:%x[1,1]/%x[2,1]

字母 U 后面的 01,02 是唯一 ID,并不限于数字编号。如果不关心上下文,甚至可以不要这个 ID。

二:

根据 CRF++ 包中给出的例子可以较为清楚的知道有那些模板构建方法。模板构建分为两类,一类是 Unigram 标注,一类是 Bigram 标注。 
Unigram 模板是比较常用的模板,这类模板提取的信息较为全面,组成的模板数量也比较多;Bigram 模板比较简单,一般是当前词和前面一个词的自动组合生成的 Bigram 特征集合。 
主要介绍 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] 

这是 CRF++ 例子中给出的模板,一共有 9 个模板,先看第一个模板,表示当前词和前面的第二个词组成的特征,以‘小明今天穿了一件红色上衣’为例,符合 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 

其中 output=B 指的是当前词(字)的预测标记,也就是’今‘的预测标记,每个模板会把所有可能的标记输出都列一遍,然后通过训练确定每种标记的权重,合理的标记在训练样本中出现的次数多,对应的权重就高,不合理的标记在训练样本中出现的少,对应的权重就少,但是在利用模板生成转移特征函数是会把所有可能的特征函数都列出来,由模型通过训练决定每个特征的重要程度。 

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

得到三个特征函数之后当前这个字’今‘的特征函数利用第一个模板就得到全不了,然后扫描下一个字‘天‘,以’天‘字作为当前字预测这个字的标记 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 

特征函数中的 feature 指的是当前词的-2 位置对应的词或对应的词的特征,因为在这里没有其他特征了,所以用字本身做特征,有的会有词性,那 feature 就会是’明‘这个字对应的词性而不是字本身了。 
这个 feature 的作用就是确定模板所确定的当前词和临近词

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 201 关注
  • crf
    1 引用
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖 • 2 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 45 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 584 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 402 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 10 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 383 关注
  • 倾城之链
    23 引用 • 66 回帖 • 138 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 74 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 70 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 85 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 3 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 684 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 153 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1792 回帖 • 7 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    25 引用 • 83 回帖