TPlinker解读

TPLinker是一种用于关系抽取的模型,它通过三个步骤进行Tagging:EH-TO-ET,SH-to-OH,ST-to-OT。模型结构简单,通过encoder和全连接层处理token对。训练数据包括text、id、relation_list和entity_list。预测三元组涉及实体和关系的匹配解码。训练时需处理输入数据如batch_input_ids、batch_attention_mask等,并调整参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:
关系抽取之TPLinker解读加源码分析
TPLinker 实体关系抽取代码解读
实体关系联合抽取:TPlinker
TPLinker中文注释版

Tagging

TPLinker模型需要对关系三元组(subject, relation, object)进行手动Tagging,过程分为三部分:
(1)entity head to entity tail (EH-TO-ET)
(2)subject head to object head (SH-to-OH)
(3)subject tail to object tail (ST-to-OT)
标记示例见下图,EH-TO-ET用紫色表示,SH-to-OH用红色表示,ST-to-OT用蓝色表示。

  • 其中紫色标签代表实体的头尾关系,红色标签代表 subject 和 object 两个实体的头部关系,蓝色标签代表 subject 和 object 两个实体的尾部关系,因为三种关系可能重叠,所以三种标签是存在于不同的矩阵,这里为了便于阐述,才放在一起。
  • 因为实体尾部不可能出现在头部之前,所以紫色标签是不可能出现在下三角区的,那么这样标就有点浪费资源,我们可以舍弃掉下三角区域;但是红标和蓝标可能出现在下三角区域,因此,我们可以把下三角区域的值映射到上三角,并标记为2
  • 标记方案如图:

模型框架

模型比较简单,整个句子过一遍 encoder,然后将 token 两两拼接输入到一个全连接层,再激活一下输出作为 token 对的向量表示,最后对 token 对进行分类即可。换句话说,这其实是一个较长序列的标注过程。

预测三元组

将模型对应的输出结果与输入的text进行匹配,解码出所需要的三元组。
通常先进行实体抽取得到字典D(key是实体头部,value是实体尾部)。
通过解码ST-to-OT关系得到有关系的两个实体的尾部,构建为字典E
通过解码SH-to-OH关系得到有关系的两个实体的头部,然后结合字典D,可以得到后续两个实体尾部。判断这两个实体尾部在不在字典E里面,如果在就是成功抽取了一条三元组。

训练数据的格式:

{"text": "In Queens , North Shore Towers , near the Nassau border , supplanted a golf course , and housing replaced a gravel quarry in Douglaston .", 

"id": "valid_0", 

"relation_list": 
[{"subject": "Douglaston", 
  "object": "Queens", 
  "subj_char_span": [125, 135], 
  "obj_char_span": [3, 9], 
  "predicate": "/location/neighborhood/neighborhood_of", 
  "subj_tok_span": [26, 28], 
  "obj_tok_span": [1, 2]}, 
 {"subject": "Queens", "object": "Douglaston", "subj_char_span": [3, 9], "obj_char_span": [125, 135], "predicate": "/location/location/contains", "subj_tok_span": [1, 2], "obj_tok_span": [26, 28]}], 
 
"entity_list": 
[{"text": "Douglaston", 
"type": "DEFAULT", 
"char_span": [125, 135], 
"tok_span": [26, 28]}, 
{"text": "Queens", "type": "DEFAULT", "char_span": [3, 9], "tok_span": [1, 2]}, 
{"text": "Queens", "type": "DEFAULT", "char_span": [3, 9], "tok_span": [1, 2]}, 
{"text": "Douglaston", "type": "DEFAULT", "char_span": [125, 135], "tok_span": [26, 28]}]}

训练数据的最外层有4个主键:

  • “text”:输入数据的文本
  • “id”:输入数据的id
  • “relation_list”:输入数据文本当中存在的关系。
  • “entity_list”:输入数据文本当中存在的实体。

模型所需要的输入数据

  1. 其中作为输入的有:
  • batch_input_ids:是单词在词典中的编码
  • batch_attention_mask:指定对哪些词进行self - Attention操作
  • batch_token_type_ids:区分两个句子的编码(上句全为0,下句全为1)
  1. 其中作为模型输出的标签来辅助更新权重的有:
  • batch_ent_shaking_tag:token的【起始位置,尾部位置,实体标签】
  • batch_head_rel_shaking_tag:【关系类别,实体_1 头部,实体_2头部,关系标签a】
  • batch_tail_rel_shaking_tag:【关系类别,实体_1 尾部,实体_2尾部,关系标签b】

根据模型所需要输入的数据对训练数据进行一系列的处理。
调整训练时的参数去训练自己的数据。
调整输入输出为自己喜欢的样式。

### TPLinker与GPLinker在命名实体识别中的对比 #### 工作原理差异 TPLinker是一种用于联合抽取关系的方法,通过构建头尾实体之间的链接来实现关系提取。这种方法能够有效地捕捉实体间的复杂关联,并且利用深度学习模型进行特征表示的学习[^1]。 相比之下,GPLinker则采用了图神经网络的思想,在处理命名实体识别任务时表现尤为突出。GPLinker不仅关注单个词语级别的标签分配,还特别强调句子内部不同位置之间可能存在联系的建模。具体来说,该方法会在输入序列之上建立一个完全连接的无向图,其中节点代表各个token,边权重反映了两两token间是否存在某种特定类型的依存关系的可能性。这种设计使得GPLinker可以在更广泛的上下文中理解文本结构,从而提高NER性能[^2]。 #### 实现方式的不同之处 对于TPLinker而言,其实现主要集中在定义合理的评分函数以评估候选实体对作为实际关系实例的概率。这涉及到精心设计损失函数以及正负样本采样策略等方面的工作。此外,由于其核心在于发现并标记出文档内的所有潜在实体提及及其相互作用模式,因此往往需要较为复杂的后处理逻辑来解析最终输出结果。 而GPLinker则是基于Transformer架构进行了扩展改进,引入了全局指针机制(Global Pointer),可以直接预测任意两个字符跨度是否构成给定类别下的实体边界。这种方式简化了很多传统pipeline NER流程里繁琐的数据预处理环节,同时也让模型更容易捕获长距离依赖关系。更重要的是,借助于自注意力机制的强大表达能力,即使面对非常规格式化程度较低甚至存在噪声干扰的真实场景下也能保持良好泛化特性。 ```python import torch from transformers import BertModel, BertTokenizer class GPLinker(torch.nn.Module): def __init__(self, config): super().__init__() self.bert = BertModel.from_pretrained('bert-base-chinese') # Define other layers here... def forward(self, input_ids, attention_mask=None, token_type_ids=None): outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids) sequence_output = outputs.last_hidden_state # Process the output further to predict entity boundaries using global pointers... model = GPLinker(config={}) tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') text = "这是一个测试例子" inputs = tokenizer(text, return_tensors="pt") with torch.no_grad(): predictions = model(**inputs) print(predictions) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值