实体关系抽取——CRF++

2024-09-04 18:38
文章标签 关系 crf 实体 抽取

本文主要是介绍实体关系抽取——CRF++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CRF++是CRF算法的一个实现。
它最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。

  • crf
    首先需要一些预备知识,如对crf中转移特征和位置特征的理解。
  1. 首先需要知道我们的观测序列x即输入的句子是完全已知的,可以得到任意位置的观测值,特征也是从观测序列中得出。所以在李航的统计学习方法中,特征函数的形式是:t(yi-1,yi,x),这里x即观测序列,y是标注(状态)序列。
  2. 需要知道在CRF中,使用的特征函数是已知的(如用crf++的特征模板来得到特征函数),模型训练的参数只是各特征的权重(如统计学习方法中的11.4节,条件随机场的学习算法)。
  • 特征模板
    特征模板就是为了生成特征函数。在crf++中有unigram和bigram两种模板。首先看训练文件格式:
    这里写图片描述
    这里每一列是一个特征(比如这里第一列是句子本身的特征(一个个字),第二列是词性特征,第三列是output tags,即标注序列,姑且也看做一个特征),特征可以自己去选择。下面是unigram特征模板格式:
    这里写图片描述
    最前面的U00是特征模板序号,%x[#,#]里面的两个数字分别是训练文件的行下标和列下标。
    首先需要明白crf++中的特征函数是遍历每个位置去生成特征函数的。行坐标为0代表当前遍历到的位置,[0,0]就代表当前位置的第一列。那么crf++遍历每一个位置时,会查看此位置前一个位置(-1,0)和前两个位置(-2,0)和后一个位置(1,0)和后两个位置(2,0),这是U00,U01,U02,U03,U04所规定的。至于后面几个特征函数,比如U05,它把前面的几个位置合起来看。上图即是当前位置是“新”时产生的特征。假设只使用U01这一个特征模板,则会生成如下图所示的特征函数(假设当前位置为“新”):
    这里写图片描述
    即每个位置的特征(feature)只看它前一个,func2的意思就是如果当前的真实标记为I,前一个位置(的第一个特征)是“日”,则返回1,这也符合训练集的标注。但有意思的是,crf++不仅会产生训练集中存在的特征比如func1,还会产生一系列训练集中不存在的特征,比如func1,当前标记为B,前一个位置特征为“日”时也会返回1,这不符合训练集的真实标注。事实上,crf++针对每个特征模板,在每个位置生成L个特征函数,L是标签个数(这里我们用B,I两个)。那么不符合训练集的特征,就需要特征函数的权重来决定(比如权重为负,那么虽然返回1,但是缺减少了最后的得分。)
    所以假如有n个unigram特征模板,m个位置(句子长度),L个标签个数,就会产生n*m*L个特征函数,即做笛卡尔积。可见训练过程中每句话产生的特征函数个数和n和m和L有关,且数量很多。
    这里再讲一下U05-U09的组合特征,千万注意虽说是组合特征,但他们同样属于位置特征函数,而非转移特征函数,因为还是只考虑当前位置的标签yi,只是x的特征的组合,所以区别转移特征函数和位置特征函数是依据y而不是观测序列x。比如对于U05,它生成的一个特征函数为(假设当前位置为“新”):
    func1 = if(output = I,and feature = “U05:每/日/新”) return 1 else return 0
    即当前位置输出标签为I,并且当前位置为新,前一个位置是日,前两个位置是每,则输出1。

下面讲解bigram特征模板。如果说unigram是为了生成crf中的位置特征函数s(yi,x),那么bigram特征模板就是为了生成crf中的转移特征函数t(yi-1,yi,x)
生成的特征函数类似于:
if(preoutput = I,and output = B ,and feature = "B05:每/日/新") return 1 else return 0即如果当前位置的标签是B,前一位置的标签是I,并且观测序列中前两个位置,前一个位置和当前位置是每/日/新时,返回1。
即crf++中的bigram还考虑了当前状态yi和之前的状态yi-1。
bigram中,对于每个特征模板,会生成L*L*m个特征函数,L是标签个数,m是位置个数(句子长度),那么对于n个特征模板,会产生n*L*L*m个特征函数,即也是做笛卡尔积。可见bigram比unigram的复杂度高很多。

stanford nlp其实也是基于特征模板去做的。特征有FeatureFactory来产生。里面每增加一个特征,就会多出很多特征模板,计算复杂度是呈指数增长的。同样是在一个位置生成很多特征模板,然后与label做笛卡尔积生成特征函数。

参考:
1.https://www.zhihu.com/question/20279019
2.http://www.52nlp.cn/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%85%A5%E9%97%A8%E4%B9%8B%E5%AD%97%E6%A0%87%E6%B3%A8%E6%B3%954
3.李航《统计学习方法》第11章

这篇关于实体关系抽取——CRF++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136712

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这

c++ 和C语言的兼容性关系

C++ 和 C 语言有很高的兼容性,但也存在一些差异和限制。下面是它们的兼容性关系的详细介绍: 兼容性 C++ 是 C 的超集: C++ 语言设计为兼容 C 语言的语法和功能,大部分 C 代码可以在 C++ 编译器中编译运行。 标准库兼容性: C++ 标准库包含了 C 标准库的内容,如 stdio.h、stdlib.h、string.h 等头文件,但 C++ 的标准库也提供了额外的功能,如

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

file-max与ulimit的关系与差别

http://zhangxugg-163-com.iteye.com/blog/1108402 http://ilikedo.iteye.com/blog/1554822

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,

SpringDataJPA系列(7)Jackson注解在实体中应用

SpringDataJPA系列(7)Jackson注解在实体中应用 常用的Jackson注解 Springboot中默认集成的是Jackson,我们可以在jackson依赖包下看到Jackson有多个注解 一般常用的有下面这些: 一个实体的示例 测试方法如下: 按照上述图片中的序号做个简单的说明: 1处:指定序列化时候的顺序,先createDate然后是email