NLP——序列标注之命名实体识别

1.概述

序列标注包括自然语言处理中的分词,词性标注,命名实体识别,关键词抽取,词义角色标注等。解决方案是NN模型(神经网络模型)+CRF

命名实体识别(Named Entity Recognition,简称NER)是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、日期、时间、百分数、货币等。这里就需要理解句子的词性

词性是词汇的语法属性,是连接词汇到句法的桥梁,一个词的词性与它在句子中的成分密切相关。在传统语法学中,汉语句子主要分为主语、谓语、宾语、定语、状语、补语6个成分。词性分为名词、动词、代词、形容词、数量词、副词等。

例:游泳是一种很好的健身运动

在NLP任务中,中文分词、词性标注、组块标注、浅层语法分析等任务,标记和切分观察序列都是序列结构,解决此类问题的模型基本是概率图模型中的序列算法,这一系列问题通常称为标记序列学习或序列学习。任务的顺序是命名实体识别->词性标注->语义组块标注。但从算法应用策略的复杂性而言,命名实体识别是最复杂的序列标注任务。

词性标注常用算法:最大熵

词性标注常用工具:stanfordNLP

序列标签分成两个部分,第一部分是IOB表示法(或BIO表示法),B代表当前词在一个组块的开始,I代表在当前词在一个组块中,O代表当前词不在任意一个组块中。另一个变种,start/end表示法:

  • B代表当前词在一个组块的开始
  • I代表在当前词在一个组块内部
  • E代表在当前词在一个组块终结
  • O代表当前词不在任意一个组块中
  • S代表在当前词是一个组块,该组块只有一个词

例如:(快递信息识别)张三18625584663广东省深圳市南山区学府路东百度国际大厦(P代表人名,T是电话号,A是地址,A1是省,A2是市,A3是区,A2是街道(详细地址))

文本符号
张三P
18625584663T
广东省A1
深圳市A2
南山区A3
学府路东百度国际大厦A4

用BIO表示法:

从语言分析的全过程来看,命名实体识别属于中文分词中未登录词识别的范畴,也是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。

2.相关算法

2.1 概率图模型

概率图模型分为贝叶斯网络和马尔科夫网络,贝叶斯网络是有向图结构,马尔科夫网络是无向图结构。概率无向图模型又称为马尔科夫随机场,是无向图表示的联合概率分布。

定义:设有联合概率分布P(Y),由无向图G=(V,E)表示,在图G中,结点表示随机变量,边表示随机变量之间的依赖关系。如果联合概率分布P(Y)满足成对、局部和全局马尔科夫性,就成次联合概率分布为概率无向图模型。

  • 成对:有两个结点u,v,对应的随机变量是Yu,Yv,其他结点为Yo,在Yo的条件下随机变量Yu,Yv是条件独立
  • 局部:有一个结点v,其它与v有边相连的集合是w,其他结点是o,则在Yw的条件下Yv,Yo是独立的
  • 全局:结点集合A,B在无向图G中被集合C分开的任意结点集合,则在Yc条件下Ya,Yb条件独立

2.2 条件随机场

在条件概率模型P(Y|X)中,Y是输出变量(表示标记序列),X是输入变量(需要标注的序列),学习时,通过极大似然估计得出条件概率模型,预测时,对于给定的输入序列x,求出条件概率最大的输出序列y。

CRF定义:设X和Y是随机变量,P(Y|X)是给定X的条件下Y的条件概率分布,若随机变量Y构成了一个由无向图G=(V,E)表示的马尔科夫随机场,即

P(Y_{v}|X,Y_{w},w\neq v)=P(Y_{v}|X,Y_{w},w\sim v)

w\neq v是除v以外的其他结点,w\sim v在无向图中与v有边连接的所有结点w。称P(Y|X)为条件随机场。

linear chain CRF定义:设X,Y是线性链表示的随机变量序列,在X的条件下,Y的条件概率分布构成条件随机场,即满足马尔科夫性

P(Y_{i}|X,Y_{1},...Y_{i-1},Y_{i+1},...,Y_{n})=P(Y_{i}|X,Y_{i-1},Y_{i+1})

序列标注任务除了长句子以外,还有标签之间的依赖性需要关注。与简单的分类任务不同,命名实体识别是需要获取标签之间的依赖关系,例如张三(P-B,P-I)是人名,且张和三存在依赖关系。

如下图,CRF是属于概率图模型,绿点是输入(GRU的输出),红点是输出,点和点之间的边分为两类,一类是x和y之间的连线,表示其相关性,另一类是相邻y之间的相关性。

 

3.算法包

3.1 词性标注和NER

#词性标注
import nltk
pos = nltk.word_tokenize(text)
pos_ = nltk.pos_tag(pos)
for i in pos_:print(''.join(i))
pos__ = nltk.ne_chunk(pos_, binary=True)
for j in pos_:print(''.join(j))

3.2 CRF

在paddlenlp中,实现线性链条件随机场。

4.实现(快递单信息提取)

(1)读取数据,并将数据转换成paddle可以接受的模型数据

from paddle.utils.download import get_path_from_url
URL = "https://paddlenlp.bj.bcebos.com/paddlenlp/datasets/waybill.tar.gz"
get_path_from_url(URL,"./")for i, line in enumerate(open('data/train.txt')):if 0 < i < 5:print ('%d: ' % i, line.split()[0])print ('   ', line.split()[1])

数据集格式:

(2)转换paddle数据集格式

  • 定义trans_func(),直接用map映射,或者是在dataLoader时作为函数传入。

直接map映射,对数据执行convert_example函数里边的操作。

 

通过partial操作,partial除了函数外,还需指定函数中的参数(tokenizer,max_seq_length),此处函数只做对比,仅参考。

最终将数据转换成有特征和标签的train、dev数据,或只有特征的test数据,快递单信息识别是获取到了快递单信息词向量列表(token_ids),词向量长度(len(token_ids)),标签列表(label_ids)。

  • 定义dataLoader

对数据进行转换,相关函数有Pad(对数据进行填充),Stack(对数据进行堆叠),Tuple,对上述过程的2个特征信息,1个标签信息进行转换。

还可以进行随机采样,这里有两种采样方式,在CPU中,使用paddle.io.BatchSampler,在GPU中,使用paddle.io.DistributedBatchSampler。

if mode == 'train' and use_gpu:sampler = paddle.io.DistributedBatchSampler(dataset=dataset, batch_size=batch_size, shuffle=True)
else:shuffle = True if mode == 'train' else Falsesampler = paddle.io.BatchSampler(dataset=dataset, batch_size=batch_size, shuffle=shuffle)

然后转换成DataLoader。

 dataloader = paddle.io.DataLoader(dataset,batch_sampler=sampler, #随机采用return_list=True,collate_fn=batchify_fn #数据转换)

(3)定义模型(包括模型定义、模型优化、损失函数计算等)

此处选择的模型是Bi-GRU+CRF,其中GRU的输出是CRF的输入。

模型其他参数:

ChunkEvaLluator函数是集成了precision、recall和f1的评价指标,常用于序列标记任务。

模型训练、预测、评估不做讲述!!!

具体代码实现:https://aistudio.baidu.com/aistudio/projectdetail/2042911

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言验证6174数学问题

有意思的数学问题任意4位不完全一样的数字&#xff0c;能组合出的最大数字减去能组合出的最小数字&#xff0c;得到一个新的数字(3位数补0&#xff09;&#xff0c;重复以上操作&#xff0c;不超过7个循环&#xff0c;必然得到一个数&#xff1a;6174这个问题是之前发布的文章&…

Cortex-M3工作模式与异常

Cortex-M3工作模式与异常 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、工作模式 线程模式和手柄模式。 当处理器处在线程状态下时&#xff0c;既可以使用特权级&#xff0c;也可以使用用户级&#xff1b;另一方面&#xff0c; handler模式总是特…

自己动手实现一个malloc内存分配器 | 30图

对内存分配器透彻理解是编程高手的标志之一。如果你不能理解malloc之类内存分配器实现原理的话&#xff0c;那你可能写不出高性能程序&#xff0c;写不出高性能程序就很难参与核心项目&#xff0c;参与不了核心项目那么很难升职加薪&#xff0c;很难升级加薪就无法走向人生巅峰…

机器学习面试——分类算法SVM

1、什么是硬间隔和软间隔&#xff1f; 当训练数据线性可分时&#xff0c;通过硬间隔最大化&#xff0c;学习一个线性分类器&#xff0c;即线性可分支持向量机。 当训练数据近似线性可分时&#xff0c;引入松弛变量&#xff0c;通过软间隔最大化&#xff0c;学习一个线性分类器…

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、NVIC概览 ——嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问&#xff0c;除了包含控制寄存器和中断处理的控制逻辑之外&#xff0c; NVIC 还包含了 MPU、 S…

VS 2005 或 VS 2008 在安装VSS 2005后,看不到源代码管理的解决办法

昨天有朋友在重新安装VS 2008后&#xff0c;再安装VSS 2005&#xff0c;安装好后在文件菜单中找不到“源代码管理”的菜单项&#xff0c;后来经朋友告知&#xff0c;是开发工具的默认选项设置问题。打开开发工具&#xff0c;“工具”--“选项”&#xff1a;&#xff08;如图&am…

代码里-3gt;gt;1是-2但3gt;gt;1是1,-3/2却又是-1,为什么?

之前群里有个同学向大家提出了类似这样的问题。随后这位同学公布了答案&#xff1a;右移运算是向下取整&#xff0c;除法是向零取整。这句话对以上现象做了很好的总结&#xff0c;可是本质原因是什么呢&#xff1f;我一直以为-3>>1的结果是-1。所以打算思考一下这个问题。…

机器学习面试——逻辑回归和线性回归

1、什么是广义线性模型&#xff08;generalize linear model&#xff09;&#xff1f; 普通线性回归模型是假设X为自变量&#xff0c;Y为因变量&#xff0c;当X是一维的&#xff0c;y是一维的&#xff0c;共进行n次观测&#xff0c;则 其中&#xff0c;w是待估计的参数&#x…

STM32开发环境

STM32开发环境 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、MDK安装 MDK 是一个集代码编辑&#xff0c;编译&#xff0c;链接和下载于一体的集成开发环境&#xff08; KDE &#xff09;。MDK 这个名字我们可能不熟悉&#xff0c;但说到 KEIL …

机器学习面试——XGBoost,GBDT,RF(上)

1、常见的集成思想 bagging&#xff1a;基学习器之间并行训练&#xff0c;且学习器之间没有依赖&#xff0c;像是集体决策的过程&#xff0c;每个个体都进行单独学习&#xff0c;再通过投票的方式做最后的集体决策。常见的算法有随机森林 boosting&#xff1a;基学习器之间串…

听说有人不了解柔性数组

1 引言 定长数组包在平时的开发中&#xff0c;缓冲区数据收发时&#xff0c;如果采用缓冲区定长包&#xff0c;假定大小是 1k&#xff0c;MAX_LENGTH 为 1024。结构体如下&#xff1a;// 定长缓冲区 struct max_buffer {int len;char data[MAX_LENGTH]; };数据结构的大小 &…

Transformer模型拆解分析

资源来自&#xff1a;DataWhale 学习资料 最近看了DataWhale 的Transformer图解&#xff0c;突然对Transformer的结构图有了更加清晰的理解&#xff0c;特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成&#xff0c;模型的具体实现是model变量里边&#xff0…

设计模式学习笔记六:.NET反射工厂

1&#xff0e; 简述 通过前面的学习&#xff0c;我们以传统的方式实现了简单工厂&#xff0c;工厂方法和抽象工厂&#xff0c;但是有些场合下如此处理&#xff0c;代码会变得冗余并且难以维护。假设我们要创建交通工具。可以是汽车&#xff0c;火车&#xff0c;轮船等&#xff…

在unity 中,使用http请求,下载文件到可读可写路径

在这里我用了一个线程池&#xff0c;线程池参数接收一个带有object参数的&#xff0c;无返回值的委托 &#xff0c;下载用到的核心代码&#xff0c;网上拷贝的&#xff0c;他的核心就是发起一个web请求&#xff0c;然后得到请求的响应&#xff0c;读取响应的流 剩下的都是常见的…

在tinyalsa上抓取音频

我们经常会遇到这样的问题&#xff0c;应用读取到的音频有问题&#xff0c;需要在tinyalsa里面读取音频来确认是底层音频有问题&#xff0c;还是应用处理之后存在的问题。所以&#xff0c;这个patch就出现了代码的逻辑很简单&#xff0c;主要是在pcm_read的时候&#xff0c;同时…

STM32——GPIO(1)

STM32——GPIO 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 【对单片机的操作就是控制IO口】 一、GPIO&#xff08;通用输入输出口&#xff09; 1、选定需要的引脚&#xff08;对应哪一个IO口&#xff09;&#xff1b; 2、配置需要的功能&#xf…

【opencv学习笔记八】创建TrackBar轨迹条

createTrackbar这个函数我们以后会经常用到&#xff0c;它创建一个可以调整数值的轨迹条&#xff0c;并将轨迹条附加到指定的窗口上&#xff0c;使用起来很方便。首先大家要记住&#xff0c;它往往会和一个回调函数配合起来使用。先看下他的函数原型&#xff1a; int createTra…

父母悄悄给自己买房,我很生气,要怎么调整心态?

——问题我是独生子&#xff0c;今年满24岁刚上研一&#xff08;普通211&#xff09;。家庭四川小城市&#xff0c;情况一般&#xff0c;父母二人体制内月薪总计一万元以内&#xff0c;家里积蓄20W-30W&#xff0c;公积金情况不清楚。从小母子关系比较僵硬&#xff0c;母亲小学…

语音处理入门——语音的声学处理

语音的声学处理通常称为特征提取或者信号分析&#xff0c;特征是表示语音信号的一个时间片的矢量。常见的特征类型有LPC&#xff08;线性预测编码&#xff09;特征和PLP&#xff08;感知线性预测编码&#xff09;&#xff0c;该特征称为声谱特征&#xff0c;使用形成波形的不同…

基础呀基础,用二极管防止反接,你学会了吗?

使用新的电源&#xff0c;第一次给设备供电时&#xff0c;要特别注意电源的正负极性标注。比如电源适配器&#xff0c;铭牌上面有标注插头的极性。这个符号说明插头的里面是正极&#xff0c;外面是负极&#xff0c;即“内正外负”。但是也有反过来的&#xff0c;下面这款是“内…