基于 LlamaFactory 微调大模型的实体识别的评估实现

文章目录

介绍

使用 LlamaFactory 结合开源大语言模型实现文本分类:从数据集构建到 LoRA 微调与推理评估.https://blog.csdn.net/sjxgghg/article/details/144290200

在前文的文本分类评估中,已经介绍了主要的框架,故在大模型微调的流程框架方面本文不再赘述。

实体数据集格式

下述是实体识别评估的一条数据示例:

json 复制代码
{
	"prompt": "从以下政府文本中,提取指定的实体类别,并按照JSON格式输出结果。  xxx", 	 
	"predict": "\n```json\n{\n  \"行政区划和地理实体\": [],\n  \"政府机构和组织\": [],\n  ...  \"特定术语和关键词\": [\"改革创新\", \"体制机制障碍\", \"行政管理体制\", \"城乡一体化发展机制\"]\n}\n```", 
	"label": "```json\n{\n  \"行政区划和地理实体\": [],\n  \"政府机构和组织\": [] ...,\n  \"特定术语和关键词\": [\"改革创新发展\", \"高质量发展\", \"高品质生活\", \"体制机制障碍\"]\n}\n```"
	...
}

让大模型按照json格式输出。字典的键是实体的类别名,字典的值是一个列表其中包含所有该类别的所有预测结果。

实体识别评估代码

python 复制代码
import os
import re
import json
from dataclasses import dataclass

@dataclass
class EvalNode:
    # 默认值
    predict_right_num: int = 0
    predict_num: int = 0
    label_num: int = 0

    @property
    def accuracy(self):
        return self.predict_right_num / (self.predict_num + 1e-6)

    @property
    def recall(self):
        return self.predict_right_num / (self.label_num + 1e-6)

    @property
    def f1(self):
        return 2 * self.accuracy * self.recall / (self.accuracy + self.recall + 1e-6)

@dataclass
class NEREvaluate:
    ent_class: list[str]
    input_file: str
    avg_accuracy: int = 0
    avg_recall: int = 0
    avg_f1: int = 0
    predict_error: int = 0

    def __post_init__(self):
        self._evaluate_by_jsonl()

    def _evaluate_by_jsonl(self):

        with open(self.input_file, "r", encoding="utf-8") as f:
            self.total_ent = {ent: EvalNode() for ent in self.ent_class}

            for line in f:
                data = json.loads(line)

                # 大模型采取的是序列到序列到文本生成,不能转换为字典的数据跳过即可
                try:
                    matches = re.search("\{.*?\}", data["predict"], re.DOTALL)
                    if matches:
                        predict = eval(matches.group(0))
                except:
                    self.predict_error += 1
                    predict = {ent: [] for ent in self.ent_class}

                try:
                    # 防止label出错
                    matches = re.search("\{.*?\}", data["label"], re.DOTALL)
                    if matches:
                        labels = eval(matches.group(0))
                except:
                    continue

                # 每个不同的实体类别单独计数
                for ent_name in self.ent_class:
                    label_set = set(labels.get(ent_name, []))
                    predict_set = set(predict.get(ent_name, []))
                    self.total_ent[ent_name].predict_right_num += len(
                        label_set & predict_set
                    )
                    self.total_ent[ent_name].predict_num += len(predict_set)
                    self.total_ent[ent_name].label_num += len(label_set)

        for ent in self.ent_class:
            self.avg_accuracy += self.total_ent[ent].accuracy
            self.avg_recall += self.total_ent[ent].recall
            self.avg_f1 += self.total_ent[ent].f1

        self.avg_accuracy = self.avg_accuracy / len(self.ent_class)
        self.avg_recall = self.avg_recall / len(self.ent_class)
        self.avg_f1 = self.avg_f1 / len(self.ent_class)

下述是实体的类别:

python 复制代码
ENT_CLASS = [
    "行政区划和地理实体",
	...
    "特定术语和关键词",
]
bash 复制代码
ner_eval = NEREvaluate(
        ENT_CLASS, "xxx/generated_predictions.jsonl")
    )

for key, item in ner_eval.total_ent.items():
    print(key, item.f1)

输出评估结果:

python 复制代码
行政区划和地理实体 0.6292412411907403
人物与职务 0.45714235316380664
...
特定术语和关键词 0.29256472295174

accuracy 、recall 与 f1 均进行了计算,大家参考代码自行查看与输出即可。

在评估大模型生成的实体时,只有大模型把实体的边界完全预测正确,才认为预测对。

相关推荐
wan5555cn29 分钟前
文字生视频的“精准”代码设定的核心原则本质是最小化文本语义与视频内容的KL散度
人工智能·笔记·深度学习·音视频
deepdata_cn5 小时前
开源混合专家大语言模型(DBRX)
人工智能·语言模型
点云SLAM7 小时前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
Learn Beyond Limits8 小时前
Transfer Learning|迁移学习
人工智能·python·深度学习·神经网络·机器学习·ai·吴恩达
程序员三明治8 小时前
三、神经网络
人工智能·深度学习·神经网络
fsnine10 小时前
深度学习——残差神经网路
人工智能·深度学习
和鲸社区11 小时前
《斯坦福CS336》作业1开源,从0手搓大模型|代码复现+免环境配置
人工智能·python·深度学习·计算机视觉·语言模型·自然语言处理·nlp
THMAIL12 小时前
深度学习从入门到精通 - LSTM与GRU深度剖析:破解长序列记忆遗忘困境
人工智能·python·深度学习·算法·机器学习·逻辑回归·lstm
Gyoku Mint12 小时前
NLP×第六卷:她给记忆加了筛子——LSTM与GRU的贴靠机制
人工智能·深度学习·神经网络·语言模型·自然语言处理·gru·lstm
ningmengjing_13 小时前
理解损失函数:机器学习的指南针与裁判
人工智能·深度学习·机器学习