代码编织梦想

如何使用uer做多分类任务

语料集下载
在这里插入图片描述
找到这里点击即可
里面是这有json文件的
在这里插入图片描述
因此我们对此要做一些处理,将其转为tsv格式

# -*- coding: utf-8 -*-
import json
import csv
import chardet

# 检测文件编码
def detect_encoding(file_path):
    with open(file_path, 'rb') as f:
        raw_data = f.read()
    return chardet.detect(raw_data)['encoding']

# 输入文件名
input_file = './datasets/iflytek/train.json'
# 输出文件名
output_file = './datasets/iflytek/train.tsv'

# 检测输入文件的编码格式
file_encoding = detect_encoding(input_file)

# 打开输入的 JSON 文件和输出的 TSV 文件
with open(input_file, 'r', encoding=file_encoding) as json_file, open(output_file, 'w', newline='', encoding='utf-8') as tsv_file:
    # 准备 TSV 写入器
    tsv_writer = csv.writer(tsv_file, delimiter='\t')

    # 写入表头(列表['label', 'label_des', 'sentence']中要注意根据json文件中的键值做更换)
    tsv_writer.writerow(['label', 'label_des', 'sentence'])

    # 逐行读取 JSON 文件
    for line in json_file:
        try:
            # 解析每一行的 JSON 数据
            json_data = json.loads(line.strip())
            # 写入到 TSV 文件中,(列表['label', 'label_des', 'sentence']中要注意根据json文件中的键值做更换)
            tsv_writer.writerow([json_data['label'], json_data['label_des'], json_data['sentence']])
        except json.JSONDecodeError as e:
            print(f"无法解析的行: {line.strip()}")
            print(f"错误信息: {e}")

print(f"JSON 文件已成功转换为 TSV 文件,输入文件编码: {file_encoding}")

接着呢要把所有tsv文件的sentence表头名改成text_a,不然运行uer框架会报错,原因请看源代码逻辑

def read_dataset(args, path):
    dataset, columns = [], {}
    with open(path, mode="r", encoding="utf-8") as f:
        for line_id, line in enumerate(f):
            if line_id == 0:
                for i, column_name in enumerate(line.rstrip("\r\n").split("\t")):
                    columns[column_name] = i
                continue
            line = line.rstrip("\r\n").split("\t")
            tgt = int(line[columns["label"]])
            if args.soft_targets and "logits" in columns.keys():
                soft_tgt = [float(value) for value in line[columns["logits"]].split(" ")]
            if "text_b" not in columns:  # Sentence classification.
                text_a = line[columns["text_a"]]
                src = args.tokenizer.convert_tokens_to_ids([CLS_TOKEN] + args.tokenizer.tokenize(text_a) + [SEP_TOKEN])
                seg = [1] * len(src)
            else:  # Sentence-pair classification.
                text_a, text_b = line[columns["text_a"]], line[columns["text_b"]]
                src_a = args.tokenizer.convert_tokens_to_ids([CLS_TOKEN] + args.tokenizer.tokenize(text_a) + [SEP_TOKEN])
                src_b = args.tokenizer.convert_tokens_to_ids(args.tokenizer.tokenize(text_b) + [SEP_TOKEN])
                src = src_a + src_b
                seg = [1] * len(src_a) + [2] * len(src_b)

            if len(src) > args.seq_length:
                src = src[: args.seq_length]
                seg = seg[: args.seq_length]
            if len(src) < args.seq_length:
                PAD_ID = args.tokenizer.convert_tokens_to_ids([PAD_TOKEN])[0]
                src += [PAD_ID] * (args.seq_length - len(src))
                seg += [0] * (args.seq_length - len(seg))
            if args.soft_targets and "logits" in columns.keys():
                dataset.append((src, tgt, seg, soft_tgt))
            else:
                dataset.append((src, tgt, seg))

    return dataset

这里规定好了表头名只有label,text_a,text_b
搞完之后进入训练代码,我的显存只有16G,因此

python finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_roberta_wwm_large_seq512_model.bin --vocab_path models/google_zh_vocab.txt --config_path models/bert/large_config.json --train_path datasets/iflytek/train.tsv --dev_path datasets/iflytek/dev.tsv --output_model_path models/iflytek_classifier_model.bin --epochs_num 3 --batch_size 16 --seq_length 128

在这里插入图片描述
在这里插入图片描述
这里可以看到只有61.49的正确率,其实是因为显存还不够,训练不了那么大的,标准的参数应该设置为batch_size=32 seq_length=256
有能力的可以更改参数进行训练
接着来预测

python inference/run_classifier_infer.py --load_model_path models/iflytek_classifier_model.bin --vocab_path models/google_zh_vocab.txt --config_path models/bert/large_config.json --test_path datasets/iflytek/test.tsv --prediction_path datasets/iflytek/prediction.tsv --seq_length 256 --labels_num 119

在这里插入图片描述
最后自行查看预测效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_62115482/article/details/140233859

python 多分类情感_大神教程干货:使用BERT的多类别情感分析!(附代码)-爱代码爱编程

使用BERT轻松快速地实现针对Yelp评论的多类别文本情感分析。在本文中,我们将使用BERT在Yelp评论上开发多类文本分类。 BERT概述 BERT是用于通用“语言理解” 的深度双向表示模型,可从左至右和从右至左学习信息。BERT是从BooksCorpus(800M字)和English Wikipedia(25亿字)中提取的未标记数据进行预训练的

快速上手UER-py-爱代码爱编程

快速上手UER-py 1.前言2.书评分类(BERT模型) 1.前言 预训练已经成为自然语言处理任务的重要组成部分,为大量自然语言处理任务带来了显著提升。 UER-py(Universal Encoder Representations)是一个用于对通用语料进行预训练并对下游任务进行微调的工具包。UER-py遵循模块化的设计原则。通过模块的组

UER-py快速上手-爱代码爱编程

快速上手UER 模型及数据集书评语料MLM目标任务LSTM(代替transformer)ELMo微调GatedCNN模型分类任务上交叉验证 模型及数据集 我们首先使用BERT模型和豆瓣书评分类数据集。我们在书评语料上对模型进行预训练,然后在书评分类数据集上对其进行微调。这个过程有三个输入文件:书评语料,书评分类数据集和中文词典。 模型链接:U

序列标注任务-爱代码爱编程

目录 基本概念序列标注常见序列标注任务NERPOSChunk一个NER任务需要安装的库数据加载数据预处理微调预训练模型参考 基本概念 序列标注 序列标注可以认为是token级别的文本分类。 常见序列标注任务 NER NER(Named-entity recognition) :分辨出文本中的名词和实体是 person人名, organ

文本分类方案,飞浆paddlenlp涵盖了所有-爱代码爱编程

文章目录 1.前言2.核心技术2.1 文本分类方案全覆盖2.1.1 分类场景齐全2.1.2 多方案满足定制需求方案一:预训练模型微调方案二:提示学习方案三:语义索引 2.2 更懂中文的训练基座

【hugging face】使用hugging face模型:nlp任务的强大工具_hugging face gtp2-爱代码爱编程

使用Hugging Face模型:NLP任务的强大工具 Hugging Face是一个知名的自然语言处理(NLP)模型和工具库,它提供了各种预训练的NLP模型,使NLP任务更容易实现。本文将介绍如何使用Hugging Fa

昇思25天学习打卡营第9天|应用实践之基于mindspore实现的红酒分类实验-爱代码爱编程

基本介绍         今日要学习的是使用KNN算法进行红酒分类,实践是基于MindSpore平台的,采用模式识别著名的数据集之一,Wine Data Set数据集。今日所学习的并不难,KNN是一个很成熟的算法了,网上教程很多,使用MindSpore的API可以很快速的搭建出KNN算法,而且数据集无需做额外的处理,简单可视化一下,划分一下数据即可,最后

【som神经网络的数据分类】som神经网络的数据分类的一个小案例-爱代码爱编程

【SOM神经网络的数据分类】SOM神经网络的数据分类的一个小案例 注:本文仅作为自己的学习记录以备以后复习查阅 一 概述 自组织特征映射网络(Self-Organizing Feature Map, SOM)也叫做

探索uer-爱代码爱编程

探索UER-py:一个强大的预训练语言模型库 项目简介 是由DIIR实验室开源的一个Python实现的预训练语言模型集合,旨在为自然语言处理(NLP)研究者和开发者提供便利的工具和资源。该项目的目标是让研究人员能够快速尝