任务描述
对文本内容完成实体抽取,建立不同实体之间的联系
输入句子文本
输出主体(model_s)、输出与该主体有关的一切客体(model_o)
例如主体为百日咳,客体就为症状、病因、相关疾病等
text = '据报道称,新冠肺炎患者经常会发热、咳嗽,少部分患者会胸闷、乏力,其病因包括: 1.自身免疫系统缺陷\n2.人传人。' # content是输入的一段文字 res = medical_re.get_triples(text, model4s, model4po) print(json.dumps(res, ensure_ascii=False, indent=True))
针对输入的文本建立以下的关系:
运行demo发生报错
OSError: Incorrect path_or_model_id: '../Model_name/13B_base_hf'. Please provide either the path to a local folder or the repo_id of a model on the Hub.
是因为写地址的时候需要用\\不然\t\n之类的会读取异常
关系抽取模型
主文件下面的model_re文件
(核心)DataLoader处理的输入和标签
预处理完的数据
是一个列表,列表中每个元素可以看作是字典,共两个key("text","spo_list(主体-分类-客体)*n")
以下是用于训练的数据 :
generator的迭代对象
对预处理的训练数据self.data继续处理成两个模型的输入和标签:
self.data包含文本,以及spos_list(若干主体-分类-客体)
提取的标签作用如下:
1.找主体,需要模型判断出主体的start和end
2.找客体,需要模型判断出客体属于哪一类别并且找出start和end
Yield
batch_token_ids ‘text’的ID,batch=1,max_length=256
batch_mask_ids, 注意力mask,标注textID中padding的字符
batch_segment_ids, 标注text文本中句子属于第几句,此任务text中只有一句
batch_subject_labels 对于每一个text字符中属于主体的起始或终止的标签
batch_subject_ids, 标记主体的起始位置和终止位置
batch_object_labels,每个字符在对应类别上的属于客体的起始和结束的标记
模型训练过程
model_s
判断主体的模型:
model4s(batch_token_ids(文本), batch_mask_ids, batch_segment_ids)
输出:batch_subject_labels_pred(文本每个词属于strat,end的概率), hidden_states
标签:batch_subject_labels
hidden,每个词的768维度向量
output
output = self.sigmoid(self.linear(self.dropout(hidden_states))).pow(2)
sigmoid的作用是把特征向量映射到0-1之间,对每个词预测为start和end的概率
与标签计算损失
model_o
根据前面的model的输出的隐藏状态(每个词的特征向量)来判断每个词可能的分类
判断客体的模型
model4po(hidden_states(来自model_s的隐藏状态), batch_subject_ids(主体的strat,end), batch_mask_ids)
输出:batch_object_labels_pred(每个词对应23个分类的客体的start和end的概率)
标签:batch_object_labels
问题:做出分类的依据是客体和主体的关系,但是前面模型输出的hidden是各个词的特征
解决:按照batch_mask_ids找到主体的start和end的特征,然后把每个词的特征都和这两特征相加(用一个linear肯定更好),这时候每个词的特征都包含自己和主体的信息, 送入线性层再套一个sigmoid就能变成分类概率了。