tplinker plus

#笔记tplinker+plus
1、确定输入数据X,和要得到的输出Y
2、把相应的X和Y都转换成相应的模型输入格式的数字id
[(12, 23, 15), (28, 32, 0), (12, 28, 18), (23, 32, 19)]
常用的格式是一个字符的id,这个是字符对组成的id而已~~~~
3、定义好模型和损失函数架构
4、喂入数据开始训练

输入的还是原始的数据,在输入模型得到结果之后,进行强行转换成相应的长度,以好跟标签做运算比对
tplinker plus_第1张图片
通过这个转换成序列对长度
tplinker plus_第2张图片

就是一个多标签的分类而已,对应的类别位置置为1,长度就是整个序列对的长度,矩阵里面的值也是从左往右,从上往下一次递增的到序列最大长度
tplinker plus_第3张图片

1-4都是输入的类型,4是偏移量可能是子词,5是tag的id,主实体的头尾实体类型、客实体的头尾实体类型、主客实体头关系类型、主客实体尾关系类型
在这里插入图片描述

tplinker plus

https://blog.csdn.net/weixin_42223207/article/details/116425447?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164195568516780265422553%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164195568516780265422553&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-116425447.pc_search_result_cache&utm_term=TPLinker_plus&spm=1018.2226.3001.4187

https://blog.csdn.net/stay_foolish12/article/details/119142193?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164195568516780265422553%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164195568516780265422553&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-6-119142193.pc_search_result_cache&utm_term=TPLinker_plus&spm=1018.2226.3001.4187
handshaking decoder (tplinker plus)
解码过程包括抽取实体和关系,这里考虑了实体的type,解码过程如下:
(1) 根据handshaking kernel的结果得到所有handshaking tagging的结果,即[(start, end, idstag)]
(2) 根据得到的handshaking tagging的结果解码得到EH-TO-ET,即(entity_start, entity_end, entity_type),同时构建head_ind2entities字典,字典的key是entity_head index,value 是entity token span
(3) 根据得到的handshaking tagging的结果解码得到ST-TO-OT或者OT-TO-ST,即(sub_tail, obj_tail, rel_type)

(4) 根据handshaking tagging的结果解码得到SH-TO-OH,ST-TO-OT, sub_head, obj_head, rel_type, 验证sub_head,obj_head是否在head_ind2entities中,如果sub_head, obj_head在head_ind2entities中,验证(sub_tail, obj_tail, rel_type)是否在(3)中的结果,如果在,则返回关系三元组

为什么TPLinker不适合直接用在NER上,而要用TPLinker_plus?

个人理解:讨论这个问题就要先了解最初的TPLinker设计模式,除了HandShaking外,作者还预定义了三大种类型ent, head_rel, tail_rel,每个类型下又有子类型,ent:{“O”:0,“ENT-H2T”:1}, head_rel:{“O”:0, “REL-SH2OH”:1, “REL-OH2SH”:2}, head_tail:{“O”:0, “REL-ST2OT”:1, “REL-OT2ST”:2}。在模型实际做分类时,三大类之间是独立的。以head_rel为例,其原数据整理得y_true矩阵shape为(batch_size, rel_size, shaking_seq_len),这里rel_size即有多少种关系。模型预测的结果y_pred矩阵shape为(batch_size, rel_size, shaking_seq_len, 3)。
可以想象,这样的y_true矩阵已经很稀疏了,只有0,1,2三种标签。而如果换做NER,这样(batch_size, ent_size, shaking_seq_len)的矩阵将更加稀疏(只有0,1两种标签),对于一个(ent_size,shaking_seq_len)的矩阵来说,可能只有1至2个地方为1,这将导致模型无限地将预测结果都置为0,从而学习失败(事实实验也是这样)。
作者在TPLinker中是如何解决这一问题的呢?其实作者用了个小trick回避了这一问题,具体做法是不再区分实体的类型,将所有实体都看作是DEFAULT类型,这样就把y_true压缩成了(batch_size,shaking_seq_len),降低了矩阵的稀疏性。作者对于这一做法的解释是"Because it is not necessary to recognize the type of entities for the relation extraction task since a predefined relation usually has fixed types for its subject and object.",即实体类别信息对关系抽取不太重要,因为每种关系某种程度上已经预定义了实体类型。综上,如果想直接把TPLinker应用到NER上是不合适的。

而TPLinker_plus改变了这一做法,他不再将ent, head_rel, tail_rel当做三个独立任务,而是将所有的关系与标签组合,形成一个大的标签库,只用一个HandShaking矩阵表示句子中的所有关系。举个例子,假设有以下3个关系(或实体类型):主演、出生于、作者,那么其与标记标签EH-ET,SH-OH,OH-SH,ST-OT,OT-ST组合后会产生15种tag,这极大地扩充了标签库。相应的,TPLinker_plus的输入也就变成了(batch_size,shaking_seq_len,tag_size)。这样的改变让矩阵中的非0值相对增多,降低了矩阵的稀疏性。(这只是一方面原因,更加重要原因的请参考问题2)

TPLinker_plus还做了哪些优化?

任务模式的转变:从问题1最后的结论可以看出,TPLinker_plus扩充标签库的同时,也将模型任务由原来的多分类任务转变成了多标签分类任务,即每个句子形成的shaking_seq可以出现多个的标签,且出现的数量不确定。形如
设句子的seq_len=10,那么shaking_seq=55
标签组合有8种tag_size=8
[
[0,0,1,0,1,0,1,0],
[1,0,1,0,0,0,0,1],

# 剩下的53行
]
损失函数:对于多标签分类问题,原本的损失函数不再适用。作者使用了一种新的损失函数,关于这个损失函数原理,可以参考苏神的文章将“softmax+交叉熵”推广到多标签分类问题 (先点个star再走呀)
TPLinker-NER中几个关键词怎么理解?

对于一个text中含有n个token的情况

shaking_matrix:n*n的矩阵,若shaking_maxtrix[i][j]=1表示从第i个token到第j个token为一个实体。(实际用到的只有上三角矩阵,以为实体的起始位置一定在结束位置前。)
matrix_index:上三角矩阵的坐标,(0,0),(0,1),(0,2)…(0,n-1),(1,1),(1,2)…(1,n-1)…(n-1,n-1)。
shaking_index:上三角矩阵的索引,长度为 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1),即[0,1,2,…,n(n+1)/2 - 1]
shaking_ind2matrix_ind:将索引映射到矩阵坐标,即[(0,0),(0,1),…,(n-1,n-1)]
matrix_ind2shaking_ind:将坐标映射到索引,即
[[0, 1, 2, …, n-1],
[0, n, n+1, n+2, …, 2n-2]

[0, 0, 0, …, n(n+1)/2 - 1]]
spot:一个实体对应的起止span和类型id,例如实体“北京”在矩阵中起始位置在7,终止位置在9,类型为LOC"(id:3),那么其对应spot为(7, 9, 3)。

你可能感兴趣的:(NLP实战项目,笔记,NLP基础知识,其他)