命名实体识别模型-中文
1、针对于中国法律起诉文书进行实体识别
2、使用bert-base-chinese预训练模型进行多任务学习(实体任务、角色任务)
3、进行多任务联合优化,实体级别评估、
4、最大支持512token
5、数据集:6.11G,46w条记录
6、提取步骤
(1)将起诉状按照诉讼请求、事实理由相关近义词进行拆分成3部分,第一部分为当事人信息,第二部分为诉讼请求,第三部分为事实与理由,然后将第一部分输入给模型进行抽取
(2)抽取结果如下所示:{"原告": [{"企业名称": "xxx有限公司", "法定代表人": "xxx", "统一社会信用代码": "912xxxxxxx", "地址": "日喀则市武侯区马家桥54号"}, {"身份": "代理人", "姓名": "雷某某", "职业": "系xx环保科技员工", "联系方式": "149xxxxxxx"}], "被告": [{"企业名称": "xxxx有限公司", "法定代表人": "盛xx", "统一社会信用代码": "919xxxxxxxx", "地址": "深圳市科尔特工人花园街87号"}]}
7、使用
#初始化模型和tokenizer
tokenizer = BertTokenizerFast.from_pretrained(MODEL_NAME)
# 添加自定义词汇
tokenizer.add_tokens(['X', '身份证', '号码'])
# 加载配置文件
model_config = BertConfig.from_pretrained(MODEL_NAME)
model = BertForEntityAndRoleRecognition(model_config, num_labels=len(LABELS), num_roles=len(ROLES),alpha=ALPHA)
8、BertForEntityAndRoleRecognition类源码如下:
class BertForEntityAndRoleRecognition(BertForTokenClassification): def init(self, config, num_labels, num_roles,alpha): super().init(config) self.num_labels = num_labels # 用于实体标签的数量 self.num_roles = num_roles # 用于角色分类的数量 self.alpha = alpha # 联合损失函数中实体损失的权重
# 实体分类器
self.entity_classifier = torch.nn.Linear(config.hidden_size, num_labels)
self.role_classifier = torch.nn.Linear(config.hidden_size, num_roles) # 角色分类层
def forward(self, input_ids, attention_mask=None, token_type_ids=None, labels=None, role_labels=None,entity_weight=None,role_weight = None, **extra_args):
# 通过 BERT 获得隐藏层输出
outputs = self.bert(input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
sequence_output = outputs[0] # [batch_size, seq_length, hidden_size]
# 实体分类 logits
logits = self.entity_classifier(sequence_output) # [batch_size, seq_length, num_labels]
# 角色分类 logits
role_logits = self.role_classifier(sequence_output) # [batch_size, seq_length, num_roles]
# 初始化总损失
total_loss = None
if labels is not None:
logits_flat = logits.view(-1, self.num_labels) # [batch_size * seq_length, num_labels]
labels_flat = labels.view(-1) # [batch_size * seq_length]
loss_fc = CrossEntropyLoss(entity_weight).to(self.device)
entity_loss = loss_fc(logits_flat, labels_flat)
# 如果总损失未初始化,则将实体损失赋值给总损失
total_loss = self.alpha * entity_loss
# 如果提供了角色标签,计算角色分类损失
if role_labels is not None:
role_logits_flat = role_logits.view(-1, self.num_roles) # [batch_size * seq_length, num_roles]
role_labels_flat = role_labels.view(-1) # [batch_size * seq_length]
# 使用角色标签权重,如果没有提供权重,则为None
role_loss_fc = CrossEntropyLoss(role_weight).to(self.device)
role_loss = role_loss_fc(role_logits_flat, role_labels_flat)
# 将角色损失加到总损失中
if total_loss is not None:
total_loss += (1 - self.alpha) * role_loss
else:
total_loss = (1 - self.alpha) * role_loss
return total_loss, logits, role_logits
@property
def device(self):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
return device
- Downloads last month
- 18
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support