crf++ 里的特征模板

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

一:

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

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

    83 引用 • 37 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 641 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 7 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 734 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 529 关注
  • Swift

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

    36 引用 • 37 回帖 • 530 关注
  • 资讯

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

    55 引用 • 85 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 478 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 211 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 586 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 20 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 3 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    567 引用 • 3532 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 86 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    407 引用 • 1246 回帖 • 583 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    32 引用 • 130 回帖 • 3 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 625 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 599 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 17 关注