命名实体识别模型-中文

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