crf++ 里的特征模板

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

一:

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 引用 • 3455 回帖 • 161 关注
  • crf
    1 引用
  • 机器学习

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

    83 引用 • 37 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • TextBundle

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

    1 引用 • 2 回帖 • 82 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 507 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 531 关注
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    88 引用 • 139 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 55 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 1 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 267 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 1 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 760 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 3 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 489 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 57 关注
  • danl
    165 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖 • 1 关注
  • GitHub

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

    210 引用 • 2040 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 3 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 3 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • AWS
    11 引用 • 28 回帖 • 11 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 2 关注