0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

命名实体识别实践 - CRF

深度学习自然语言处理 来源:ChallengeHub 作者:致Great 2022-03-24 13:42 次阅读

1

条件随机场-CRF

CRF,英文全称为Conditional Random Field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。

较为简单的条件随机场是定义在线性链上的条件随机场,称为线性链条件随机场(linear chain conditional random field)。

线性链条件随机场可以用于序列标注等问题,需要解决的命名实体识别(NER)任务正好可通过序列标注方法解决。

a98099ce-a359-11ec-952b-dac502259ad0.png

在条件概率模型P(Y|X)中,Y是输出变量,表示标记序列(或状态序列),X是输入变量,表示需要标注的观测序列。

训练时,利用训练数据集通过极大似然估计或正则化的极大似然估计得到条件概率模型p(Y|X);
预测时,对于给定的输入序列x,求出条件概率p(y|x)最大的输出序列y

利用线性链CRF来做实体识别的时候,需要假设每个标签 的预测同时依赖于先前预测的标签 和 的词语输入序列,如下图所示a999a4dc-a359-11ec-952b-dac502259ad0.png每个 NER标签仅依赖于其直接前前继和后继标签以及 x

CRF是一种选择因子的特定方式,换句话说,就是特征函数。定义因子的 CRF 方法是采用实值特征函数 与参数 和 的线性组合的指数,下面是特征函数与权重参数在时间步上是对应的:

关于Linear-chain CRF的训练推导,可以查看文章:条件随机场CRF(一)从随机场到线性链条件随机场

2

实践1:基于CRF++实现NER

CRF++简介

CRF++是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具,采用C++语言编写而成。其最重要的功能我认为是采用了特征模板。这样就可以自动生成一系列的特征函数,而不用我们自己生成特征函数,我们要做的就是寻找特征,比如词性等。a9b5538a-a359-11ec-952b-dac502259ad0.png官网地址:http://taku910.github.io/crfpp/

安装

CRF++的安装可分为Windows环境和Linux环境下的安装。关于Linux环境下的安装,可以参考文章:CRFPP/CRF++编译安装与部署 。在Windows中CRF++不需要安装,下载解压CRF++0.58文件即可以使用

a9d1495a-a359-11ec-952b-dac502259ad0.png

训练语料创建

在训练之前需要将标注数据转化为CRF++训练格式文件:

分两列,第一列是字符,第二例是对应的标签,中间用 分割。

比如标注方案采用BISO,效果如下:

a9efe72a-a359-11ec-952b-dac502259ad0.png

模板

模板是使用CRF++的关键,它能帮助我们自动生成一系列的特征函数,而不用我们自己生成特征函数,而特征函数正是CRF算法的核心概念之一。一个简单的模板文件如下:aa0ca608-a359-11ec-952b-dac502259ad0.png在这里,我们需要好好理解下模板文件的规则。T**:%x[#,#]中的T表示模板类型,两个"#"分别表示相对的行偏移与列偏移。一共有两种模板:aa273c0c-a359-11ec-952b-dac502259ad0.png

训练

crf_learn-f3-c4.0-m100templatetrain.datacrf_model>train.rst

其中,template为模板文件,train.data为训练语料,-t表示可以得到一个model文件和一个model.txt文件,其他可选参数说明如下:

-f,–freq=INT使用属性的出现次数不少于INT(默认为1)

-m,–maxiter=INT设置INT为LBFGS的最大迭代次数(默认10k)

-c,–cost=FLOAT设置FLOAT为代价参数,过大会过度拟合(默认1.0)

-e,–eta=FLOAT设置终止标准FLOAT(默认0.0001)

-C,–convert将文本模式转为二进制模式

-t,–textmodel为调试建立文本模型文件

-a,–algorithm=(CRF|MIRA)选择训练算法,默认为CRF-L2

-p,–thread=INT线程数(默认1),利用多个CPU减少训练时间

-H,–shrinking-size=INT设置INT为最适宜的跌代变量次数(默认20)

-v,–version显示版本号并退出

-h,–help显示帮助并退出

输出信息

iter:迭代次数。当迭代次数达到maxiter时,迭代终止

terr:标记错误率

serr:句子错误率

obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成

diff:与上一个对象值之间的相对差。当此值低于eta时,训练完成

预测

在训练完模型后,我们可以使用训练好的模型对新数据进行预测,预测命令格式如下:

crf_test-mcrf_modeltest.data>test.rstt

-m model表示使用我们刚刚训练好的model模型,预测的数据文件为test.data> test.rstt 表示将预测后的数据写入到test.rstt 中。aa465aa6-a359-11ec-952b-dac502259ad0.png

3

实践2:基于sklearn_crfsuite实现NER

sklearn_crfsuite简介

sklearn-crfsuite是基于CRFsuite库的一款轻量级的CRF库。该库兼容sklearn的算法,因此可以结合sklearn库的算法设计实体识别系统。sklearn-crfsuite不仅提供了条件随机场的训练和预测方法还提供了评测方法。

https://sklearn-crfsuite.readthedocs.io/en/latest/#

aa5dd37a-a359-11ec-952b-dac502259ad0.png

安装:pip install sklearn-crfsuite

特征与模型创建

特征构造:aa777b72-a359-11ec-952b-dac502259ad0.png模型初始化

crf_model=sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100,
all_possible_transitions=True,verbose=True)
crf_model.fit(X_train,y_train)

完整代码如下:

importre
importsklearn_crfsuite
fromsklearn_crfsuiteimportmetrics
importjoblib
importyaml
importwarnings

warnings.filterwarnings('ignore')



defload_data(data_path):
data=list()
data_sent_with_label=list()
withopen(data_path,mode='r',encoding="utf-8")asf:
forlineinf:
ifline.strip()=="":
data.append(data_sent_with_label.copy())
data_sent_with_label.clear()
else:
data_sent_with_label.append(tuple(line.strip().split("")))
returndata

defword2features(sent,i):
word=sent[i][0]

features={
'bias':1.0,
'word':word,
'word.isdigit()':word.isdigit(),
}
ifi>0:
word1=sent[i-1][0]
words=word1+word
features.update({
'-1:word':word1,
'-1:words':words,
'-1:word.isdigit()':word1.isdigit(),
})
else:
features['BOS']=True

ifi>1:
word2=sent[i-2][0]
word1=sent[i-1][0]
words=word1+word2+word
features.update({
'-2:word':word2,
'-2:words':words,
'-3:word.isdigit()':word1.isdigit(),
})

ifi>2:
word3=sent[i-3][0]
word2=sent[i-2][0]
word1=sent[i-1][0]
words=word1+word2+word3+word
features.update({
'-3:word':word3,
'-3:words':words,
'-3:word.isdigit()':word1.isdigit(),
})

ifi< len(sent)-1:
        word1 = sent[i+1][0]
        words = word1 + word
        features.update({
            '+1:word': word1,
            '+1:words': words,
            '+1:word.isdigit()': word1.isdigit(),
        })
    else:
        features['EOS'] = True

    if i < len(sent)-2:
        word2 = sent[i + 2][0]
        word1 = sent[i + 1][0]
        words = word + word1 + word2
        features.update({
            '+2:word': word2,
            '+2:words': words,
            '+2:word.isdigit()': word2.isdigit(),
        })

    if i < len(sent)-3:
        word3 = sent[i + 3][0]
        word2 = sent[i + 2][0]
        word1 = sent[i + 1][0]
        words = word + word1 + word2 + word3
        features.update({
            '+3:word': word3,
            '+3:words': words,
            '+3:word.isdigit()': word3.isdigit(),
        })

    return features

def sent2features(sent):
    return [word2features(sent, i) for i in range(len(sent))]


def sent2labels(sent):
    return [ele[-1] for ele in sent]
train=load_data('data/train.txt')
valid=load_data('data/train.txt')
test=load_data('data/train.txt')
print(len(train),len(valid),len(test))

sample_text=''.join([c[0] for c in train[0]])
sample_tags=[c[1] for c in train[0]]
print(sample_text)
print(sample_tags)


X_train = [sent2features(s) for s in train]
y_train = [sent2labels(s) for s in train]

X_dev = [sent2features(s) for s in valid]
y_dev = [sent2labels(s) for s in valid]
# **表示该位置接受任意多个关键字(keyword)参数,在函数**位置上转化为词典 [key:value, key:value ]
crf_model = sklearn_crfsuite.CRF(algorithm='lbfgs',c1=0.25,c2=0.018,max_iterations=100,
                                 all_possible_transitions=True,verbose=True)
crf_model.fit(X_train, y_train)

训练效果如下:

labels=list(crf_model.classes_)
labels.remove("O")
y_pred=crf_model.predict(X_dev)
metrics.flat_f1_score(y_dev,y_pred,
average='weighted',labels=labels)
sorted_labels=sorted(labels,key=lambdaname:(name[1:],name[0]))
print(metrics.flat_classification_report(
y_dev,y_pred,labels=sorted_labels,digits=3
))
aa8c45de-a359-11ec-952b-dac502259ad0.png

完整代码 https://www.heywhale.com/home/competition/6216f74572960d0017d5e691/content/

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    3140

    浏览量

    48672
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28316

原文标题:命名实体识别实践 - CRF

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    自然语言基础技术之命名实体识别相对全面的介绍

    早期的命名实体识别方法基本都是基于规则的。之后由于基于大规模的语料库的统计方法在自然语言处理各个方面取得不错的效果之后,一大批机器学习的方法也出现在命名实体识别任务。
    的头像 发表于 04-17 10:12 4911次阅读
    自然语言基础技术之<b class='flag-5'>命名实体</b><b class='flag-5'>识别</b>相对全面的介绍

    HanLP分词命名实体提取详解

    可能词) 5.极速词典分词(速度快,精度一般) 6.用户自定义词典 7.标准分词(HMM-Viterbi) 命名实体识别 1.实体机构名识别(层叠HMM-Viterbi) 2.中国人名
    发表于 01-11 14:32

    Hanlp分词之CRF中文词法分析详解

    ;);System.out.println(wordList);不传入模型路径时将默认加载配置文件指定的模型。词性标注CRF词性标注器的训练与加载与中文分词类似,对应CRFPOSTagger。命名实体识别
    发表于 02-18 15:28

    基于结构化感知机的词性标注与命名实体识别框架

    `上周就关于《结构化感知机标注框架的内容》已经分享了一篇《分词工具Hanlp基于感知机的中文分词框架》,本篇接上一篇内容,继续分享词性标注与命名实体识别框架的内容。词性标注训练词性标注是分词后紧接着
    发表于 04-08 14:57

    HanLP-命名实体识别总结

    的中国人名自动识别研究》,大家可以百度一下看看 地名识别 理论指导文章为:《基于层叠隐马尔可夫模型的中文命名实体识别》 机构名识别 机构名的
    发表于 07-31 13:11

    基于神经网络结构在命名实体识别中应用的分析与总结

    近年来,基于神经网络的深度学习方法在自然语言处理领域已经取得了不少进展。作为NLP领域的基础任务—命名实体识别(Named Entity Recognition,NER)也不例外,神经网络结构在
    的头像 发表于 01-18 09:24 4617次阅读
    基于神经网络结构在<b class='flag-5'>命名实体</b><b class='flag-5'>识别</b>中应用的分析与总结

    思必驰中文命名实体识别任务助力AI落地应用

    随着人工智能从感知智能向认知智能发展,语言理解和知识挖掘研究不断深入,事实和常识知识愈发重要。智能问答、对话、推理、推荐等应用均需要丰富的知识作为基础支撑,而命名实体识别作为文本中重要的知识获取手段
    的头像 发表于 02-22 18:27 1857次阅读

    新型中文旅游文本命名实体识别设计方案

    传统基于词向量表示的命名实体识别方法通常忽略了字符语义信息、字符间的位置信息,以及字符和单词的关联关系。提出一种基于单词字符引导注意力网络( WCGAN)的中文旅游命名实体识别方法,利
    发表于 03-11 11:26 24次下载
    新型中文旅游文本<b class='flag-5'>命名实体</b><b class='flag-5'>识别</b>设计方案

    命名实体识别的迁移学习相关研究分析

    命名实体识别(NER)是自然语言处理的核心应用任务之一。传统和深度命名实体识别方法严重依赖于大量具有相同分布的标注训练数据,模型可移植性差。然而在实际应用中数据往往都是小数据、个性化数
    发表于 04-02 15:15 8次下载
    <b class='flag-5'>命名实体</b><b class='flag-5'>识别</b>的迁移学习相关研究分析

    基于字语言模型的中文命名实体识别系统

    命名实体识别(NER)旨在识别出文本中的专有名词,并对其进行分类。由于用于监督学习的训练数据通常由人工标主,耗时耗力,因此很难得到大规模的标注数据。为解决中文命名实体
    发表于 04-08 14:36 14次下载
    基于字语言模型的中文<b class='flag-5'>命名实体</b><b class='flag-5'>识别</b>系统

    基于神经网络的中文命名实体识别方法

    在基于神经网络的中文命名实体识别过程中,字的向量化表示是重要步骤,而传统的词向量表示方法只是将字映射为单一向量,无法表征字的多义性。针对该问题,通过嵌入BERT预训练语言模型,构建BERT-
    发表于 06-03 11:30 3次下载

    关于边界检测增强的中文命名实体识别

    引言 命名实体识别(Named Entity Recognition,NER)是自然语言处理领域的一个基础任务,是信息抽取等许多任务的子任务,旨在识别非结构化文本中属于预先定义的类别的命名实体
    的头像 发表于 09-22 16:05 3058次阅读

    命名实体识别实践 - CRF

    CRF,英文全称为Conditional Random Field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。
    的头像 发表于 03-24 13:42 1454次阅读

    基于序列标注的实体识别所存在的问题

    实体识别通常被当作序列标注任务来做,序列标注模型需要对实体边界和实体类别进行预测,从而识别和提取出相应的
    的头像 发表于 07-28 11:08 1740次阅读

    什么是嵌套实体识别

    嵌套命名实体识别命名实体识别中的一个颇具挑战的子问题。我们在《实体识别LEAR论文阅读笔记》与
    的头像 发表于 09-30 15:19 1766次阅读