关于数据部分在这里:

陈丹琦 关系抽取 数据部分https://blog.csdn.net/holasyb/article/details/121549733?spm=1001.2014.3001.5501这篇聊一聊实体抽取部分的网络模型。

    def run_batch(self, samples_list, try_cuda=True, training=True):# convert samples to input tensorstokens_tensor, attention_mask_tensor, bert_spans_tensor, spans_mask_tensor, spans_ner_label_tensor, sentence_length = self._get_input_tensors_batch(samples_list, training)output_dict = {'ner_loss': 0,}if training:self.bert_model.train()ner_loss, ner_logits, spans_embedding = self.bert_model(input_ids = tokens_tensor.to(self._model_device),spans = bert_spans_tensor.to(self._model_device),spans_mask = spans_mask_tensor.to(self._model_device),spans_ner_label = spans_ner_label_tensor.to(self._model_device),attention_mask = attention_mask_tensor.to(self._model_device),)output_dict['ner_loss'] = ner_loss.sum()output_dict['ner_llh'] = F.log_softmax(ner_logits, dim=-1)else:self.bert_model.eval()with torch.no_grad():ner_logits, spans_embedding, last_hidden = self.bert_model(input_ids = tokens_tensor.to(self._model_device),spans = bert_spans_tensor.to(self._model_device),spans_mask = spans_mask_tensor.to(self._model_device),spans_ner_label = None,attention_mask = attention_mask_tensor.to(self._model_device),)_, predicted_label = ner_logits.max(2)predicted_label = predicted_label.cpu().numpy()last_hidden = last_hidden.cpu().numpy()predicted = []pred_prob = []hidden = []for i, sample in enumerate(samples_list):ner = []prob = []lh = []for j in range(len(sample['spans'])):ner.append(predicted_label[i][j])# prob.append(F.softmax(ner_logits[i][j], dim=-1).cpu().numpy())prob.append(ner_logits[i][j].cpu().numpy())lh.append(last_hidden[i][j])predicted.append(ner)pred_prob.append(prob)hidden.append(lh)output_dict['pred_ner'] = predictedoutput_dict['ner_probs'] = pred_proboutput_dict['ner_last_hidden'] = hiddenreturn output_dict

_get_input_tensors_batch 函数:将输入的数据进一步处理,输出的结果均为Tensor

tokens_tensor:tokens 在词典中的 id,shape :[batch ,max_len]

attention_mask_tensor:attention mask,或者叫 segment_mask,用于区分padding,shape :[batch ,max_len]

bert_spans_tensor:span 起始 index,结尾 index,和长度,shape :[batch, span_num, 3]

spans_mask_tensor:span 的 mask,和长度,shape :[batch, span_num]

spans_ner_label_tensor:span 的 label,和长度,shape :[batch, span_num]

sentence_length:输入长度

#####################################################################

class BertForEntity(BertPreTrainedModel):def __init__(self, config, num_ner_labels, head_hidden_dim=150, width_embedding_dim=150, max_span_length=8):super().__init__(config)self.bert = BertModel(config)self.hidden_dropout = nn.Dropout(config.hidden_dropout_prob)self.width_embedding = nn.Embedding(max_span_length+1, width_embedding_dim)self.ner_classifier = nn.Sequential(FeedForward(input_dim=config.hidden_size*2+width_embedding_dim, num_layers=2,hidden_dims=head_hidden_dim,activations=F.relu,dropout=0.2),nn.Linear(head_hidden_dim, num_ner_labels))self.init_weights()def _get_span_embeddings(self, input_ids, spans, token_type_ids=None, attention_mask=None):sequence_output, pooled_output = self.bert(input_ids=input_ids, token_type_ids=token_type_ids, attention_mask=attention_mask)sequence_output = self.hidden_dropout(sequence_output)"""spans: [batch_size, num_spans, 3]; 0: left_ned, 1: right_end, 2: widthspans_mask: (batch_size, num_spans, )"""spans_start = spans[:, :, 0].view(spans.size(0), -1)spans_start_embedding = batched_index_select(sequence_output, spans_start)spans_end = spans[:, :, 1].view(spans.size(0), -1)spans_end_embedding = batched_index_select(sequence_output, spans_end)spans_width = spans[:, :, 2].view(spans.size(0), -1)spans_width_embedding = self.width_embedding(spans_width)# Concatenate embeddings of left/right points and the width embeddingspans_embedding = torch.cat((spans_start_embedding, spans_end_embedding, spans_width_embedding), dim=-1)"""spans_embedding: (batch_size, num_spans, hidden_size*2+embedding_dim)"""return spans_embeddingdef forward(self, input_ids, spans, spans_mask, spans_ner_label=None, token_type_ids=None, attention_mask=None):spans_embedding = self._get_span_embeddings(input_ids, spans, token_type_ids=token_type_ids, attention_mask=attention_mask)ffnn_hidden = []hidden = spans_embeddingfor layer in self.ner_classifier:hidden = layer(hidden)ffnn_hidden.append(hidden)logits = ffnn_hidden[-1]if spans_ner_label is not None:loss_fct = CrossEntropyLoss(reduction='sum')if attention_mask is not None:active_loss = spans_mask.view(-1) == 1active_logits = logits.view(-1, logits.shape[-1])active_labels = torch.where(active_loss, spans_ner_label.view(-1), torch.tensor(loss_fct.ignore_index).type_as(spans_ner_label))loss = loss_fct(active_logits, active_labels)else:loss = loss_fct(logits.view(-1, logits.shape[-1]), spans_ner_label.view(-1))return loss, logits, spans_embeddingelse:return logits, spans_embedding, spans_embedding

init:增加一个 span 长度的 embedding

首先,使用 bert 进行编码,然后根据 span_tensor 将每一个 span 的首尾字向量取出来,根据长度获取 span 长度的 embedding,将首尾字向量和长度 embedding 拼接到一起,于是将获得一个 shape 为 batch * spans_num * (word_embed_len * 2 + width_embed_len) 的张量,最后分类层,每一个 span 都有 label + 1 种可能。

loss:CrossEntropyLoss

关系分类待续

陈丹琦 关系抽取 2020 sota ner相关推荐

  1. 学习陈丹琦关系抽取pipeline Pure

    关系抽取两大主流方式:joint,pipline.区别是实体识别和关系分类两个任务是否公用参数.今天学了陈丹琦博士的Pure模型.主要内容如下: 1.实体抽取和关系预测用分开用两个模型 2.实体前后拼 ...

  2. ACL 2020今日放榜,779篇论文被接收,姚班校友陈丹琦首日演讲

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI ACL 2020,今天终于放榜啦! 今年的ACL总共有3088篇投稿,大会接收了779篇论文,其中长论文571篇.短论文208篇,接受率2 ...

  3. 2020亚马逊研究奖公布:陈怡然、陈丹琦、吴佳俊等获奖,华人占比三分之一

    来源:机器之心 编辑:蛋酱.陈萍 年度总获奖人数翻番,32 位华人学者入选,2020 年亚马逊研究奖已经正式公布. 近日,2020 年度亚马逊研究奖(ARA,Amazon Research Award ...

  4. 绝了!关系抽取新SOTA

    作者 | Nine 整理 | NewBeeNLP 关系抽取目前的算法大概可以分为以下几种: pipeline approach:先抽实体,再判关系,比如陈丹琦的<A Frustratingly ...

  5. 《NEURAL READING COMPREHENSION AND BEYOND》解读(陈丹琦博士论文)

    之前在听standford的cs224n自然语言处理课程的时候,就有一段是请陈丹琦来这边讲她最近的一些工作,我记得还是在embedding上的进展.听的时候,就觉得像是一个中国小姐姐,后面在这篇爆款博 ...

  6. 清华姚班校友陈丹琦斩获2022斯隆奖!「诺奖风向标」27位华人学者入选

      视学算法报道   编辑:桃子 拉燕 [新智元导读]刚刚,有「诺奖风向标」之称的斯隆研究奖公布了最新获奖名单.今年,共有118名学者当选.值得一提的是,清华姚班毕业的华人科学家陈丹琦位列其中. 刚刚 ...

  7. 清华姚校友陈丹琦斩获2022斯隆奖!博士论文是近十年最热之一!共计27位华人入选...

    来源:新智元 有「诺奖风向标」之称的斯隆研究奖公布了最新获奖名单. 今年,共有118名学者获斯隆研究奖,华人学者占27席.他们将获得75000美元,这笔款项可在两年的时间内用于支持其研究的任何费用. ...

  8. 斯坦福大学陈丹琦等人解读机器阅读最新进展:超越局部模式匹配

    来源:AI 科技评论 不久前,斯坦福大学的计算机科学博士陈丹琦的一篇长达 156 页的毕业论文<Neural Reading Comprehension and Beyond>成为「爆款文 ...

  9. 清华姚班陈丹琦等27位华人学者获奖,斯隆奖2022年获奖名单颁布!

    整理 | 于轩 出品 | 程序人生 (ID:coder _life) 近日,素有"诺奖风向标"之称的斯隆研究奖颁布了2022年获奖名单.斯隆研究奖于1955年设立,每年颁发一次,旨 ...

最新文章

  1. oracle修改时区无效,Oracle 时区问题
  2. STL中的lower_bound() 和 upper_bound()
  3. 【高级数据结构】并查集
  4. C#一个事件中调用另一个事件
  5. 十二届 - CSU 1803 :2016(同余定理)
  6. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...
  7. 关于计算机网络与应用的相关片,网络技术与应用作业.doc
  8. nodejs 中http请求头,响应头
  9. 一个人有没有大数据思维,主要体现在哪两个方面?
  10. windows 10 Office 2016 安装
  11. 图像标签制作工具之labelImg-windows的安装与使用
  12. SuiteCRM图片上传(自定义控制器)
  13. 2016安卓手机安全隐私之对比与分析
  14. 蓝牙音频编码简介 - SBC、AAC、AptX、LDAC、LHDC
  15. Vue框架学习笔记一
  16. VB定义字符串数组并赋值
  17. linux安装android x86_64,在VirtualBox上安装Android-X86
  18. python常用的软件有哪些_Python编程常用软件有哪些?
  19. 京东app连接电脑上访问突然跳转不到电脑版网页
  20. [循证理论与实践] Meta分析系列之五:贝叶斯 Meta 分析与 WinBUGS 软件

热门文章

  1. PHP 图片上传 图片压缩
  2. 用词袋(bag of word)实现场景识别
  3. app间共享(交互)方法
  4. Win10自带相机找不到代码0xA00F4244?这里有九条解决方法
  5. 北航计算机控制系统实验报告,北航计算机控制系统实验报告..doc
  6. 让数码管比段生成器去见鬼吧
  7. 办公族如何防治鼠标手?
  8. 【例3.10】简单计算器
  9. 1 根文件系统 简单来说,(根文件系统)
  10. html前端的几种加密/解密方式