【NLP】文本生成、文本纠错 代码学习记录

【Huggingface】DataCollatorForSeq2Seq中的pad_to_multiple_of选项 【Huggingface】DataCollatorForSeq2Seq中的pad_to_multiple_of选项 ### 也就是说当pad_to_multiple被设置成None以外的内容时,通常是8或者16,max_label_length会被调节成设置值的整数倍,这样做的目的是方便N卡更高效利用计算能力。 阅读详情

seq2seq-based-CGEC:将语法纠错看作是一个从错误句子翻译为正确句子的过程。

1. 使用argparse模块解析命令行参数和选项

1.1 创建一个解析对象

parser = argparse.ArgumentParser()

1.2 向该对象中添加所需得命令行参数和选项,每一个add_argument方法对应一个参数或选项;

parser.add_argument()

1.3 调用parse_args()方法进行解析使用。

parser.parse_args()

1.4 HfArgumentParser是Transformer框架中的命令行解析工,它是ArgumentParser的子类,用于从类对象中创建解析对象。这里利用HfArgumentParser加载用于构建模型、微调模型的参数。

from transformers import HfArgumentParser

parser = HfArgumentParser((ModelArguments, DataTrainingArguments, Seq2SeqTrainingArguments))
model_args, data_args, training_args = parser.parse_args_into_dataclasses(args_list)

其中,ModelArguments中包含的是关于模型的属性;DataTrainingArguments中包含的是关于微调数据的属性;Seq2SeqTrainingArguments中包含的是模型微调的参数。

2. 设置随机种子seed

def set_seed(seed):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed_all(seed)
        
set_seed(training_args.seed)

3. 加载数据

设置一个data_files对象,同时保存train_file,validation_file,test_file三个文本;通过load_json将data_files中的内容保存至datasets中,使用相应的key(train,validation,test)即可得到训练集、验证集、测试集。

datasets={}
data_files = {}
if data_args.train_file is not None:
    data_files["train"] = data_args.train_file
if data_args.validation_file is not None:
    data_files["validation"] = data_args.validation_file
if data_args.test_file is not None:
    data_files["test"] = data_args.test_file
for key in data_files:
    datasets[key] = load_json(data_files[key])
def load_json(file_path):
    results={'summarization':[],'article':[]}
    with open(file_path,encoding='utf-8') as f:
        content=json.load(f)
        for sample in content:
            results['summarization'].append(sample['summarization'])
            results['article'].append(sample['article'])
        results=Dataset.from_dict(results)
    return results

4. 数据预处理

4.1 在数据预处理阶段,我们使用AutoTokenizer.from_pretrained()方法实例化我们的tokenizer。tokenizer既可以对一个句子进行预处理,也可以对一个句子对进行预处理,经过tokenizer预处理后得到的数据满足预训练模型输入格式。
引申:**AutoTokenizer.from_pretrained(pretrained_model_path)与BertTokenizer.from_pretrained(pretrained_model_path)**的区别在于,AutoTokenizer是通用封装,它会根据载入的预训练模型来适应对应的分词器;而BertTokenizer是基于WordPiece加载BERT分词器。

from transformers import AutoTokenizer, BertTokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)

注意:tokenizer并不涉及将词转化为词向量的过程,仅仅是对纯文本进行分词,并添加[MASK]、[SEP]、[CLS]标记,并转换为字典索引。

4.2 定义数据预处理函数preprocess_function,将原始的训练集、验证集和测试集分别转换为模型能接受的输入格式。这里以文本纠错为例,主要处理两个参数,text_column和summary_column分别对应错误句子和正确句子。

def preprocess_function(examples):
    inputs = examples[text_column]
    targets = examples[summary_column]
    model_inputs = tokenizer(inputs, max_length=data_args.max_source_length, padding=padding, truncation=True)
    
    # Setup the tokenizer for targets
    with tokenizer.as_target_tokenizer():
        labels = tokenizer(targets, max_length=max_target_length, padding=padding, truncation=True)

    model_inputs["labels"] = labels["input_ids"]
    return model_inputs

4.3 接着使用map函数对datasets中的所有样本进行预处理。

train_dataset = train_dataset.map(
        preprocess_function,
        batched=True,
        num_proc=data_args.preprocessing_num_workers,
        remove_columns=column_names,
        load_from_cache_file=not data_args.overwrite_cache,
    )
    
eval_dataset = eval_dataset.map(
        preprocess_function,
        batched=True,
        num_proc=data_args.preprocessing_num_workers,
        remove_columns=column_names,
        load_from_cache_file=not data_args.overwrite_cache,
    )
    
test_dataset = test_dataset.map(
        preprocess_function,
        batched=True,
        num_proc=data_args.preprocessing_num_workers,
        remove_columns=column_names,
        load_from_cache_file=not data_args.overwrite_cache,
    )

4.4 通过DataCollatorForSeq2Seq,构造一个data collator

from transformers import DataCollatorForSeq2Seq

label_pad_token_id = -100 if data_args.ignore_pad_token_for_loss else tokenizer.pad_token_id
data_collator = DataCollatorForSeq2Seq(
    tokenizer,
    model=model,
    label_pad_token_id=label_pad_token_id,
    pad_to_multiple_of=8 if training_args.fp16 else None,
)

5. 定义评估函数

def postprocess_text(preds, labels):
    preds = [pred.strip() for pred in preds]
    labels = [label.strip() for label in labels]
    while '' in preds:
        idx=preds.index('')
        preds[idx]='。'
    return preds, labels
def compute_metrics(eval_preds):
    preds, labels = eval_preds
    if isinstance(preds, tuple):
        preds = preds[0]
    decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)
    if data_args.ignore_pad_token_for_loss:
        # Replace -100 in the labels as we can't decode them.
        labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
    decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
   
    # Some simple post-processing
    decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)
    scores = rouge.get_scores(decoded_preds, decoded_labels,avg=True)

    for key in scores:
        scores[key] = scores[key]['f']*100
    result = scores

    prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]
    result["gen_len"] = np.mean(prediction_lens)
    result = {k: round(v, 4) for k, v in result.items()}
    return result

6. 模型训练和预测

6.1 通过Seq2SeqTrainer初始化一个训练器trainer

from transformers import Seq2SeqTrainer

trainer = Seq2SeqTrainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset if training_args.do_train else None,
    eval_dataset=eval_dataset if training_args.do_eval else None,
    tokenizer=tokenizer,
    data_collator=data_collator,
    compute_metrics=compute_metrics
)

6.2 模型训练

if training_args.do_train:
    train_result = trainer.train()
    trainer.save_model()  # Saves the tokenizer too for easy upload

    metrics = train_result.metrics
    max_train_samples = (
        data_args.max_train_samples if data_args.max_train_samples is not None else len(train_dataset)
    )
    metrics["train_samples"] = min(max_train_samples, len(train_dataset))

    trainer.log_metrics("train", metrics)
    trainer.save_metrics("train", metrics)
    trainer.save_state()

6.3 模型测试

 if training_args.do_predict:
    if training_args.predict_with_generate:
        predictions, labels, metrics = trainer.predict(test_dataset, metric_key_prefix="predict")

        test_preds = tokenizer.batch_decode(
            predictions, skip_special_tokens=True,
        )
        test_preds = ["".join(pred.strip().split()) for pred in test_preds]

        output_test_preds_file = args.predict_file
        with open(output_test_preds_file, "w",encoding='UTF-8') as writer:
            writer.write("\n".join(test_preds))

【说明,本人也是初步分析代码,仅用于记录,帮助自己梳理,以上是我自己理解的过程,如果不对,欢迎批评指正!!大家一起加油哟~】

NLP之文本特征提取详解 深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 一、词袋模型(Bag of Words, BoW) 1、目的 将不定长的文本型数据转化为定长的数值型数据,方便用作机器学习模型的输入 2、主要思想 建立一个词典库,其中包含训练语料库的所有词语,每个词语都对应一个唯一识别的编号,利用one-hot文本来表示;文档的词向量维度与单词向量的维度相同,每个位置的值是对应位置词语在文档中出现的次数。 3、具体算法步骤 (1)对所有文本进行单 阅读详情

相关推荐

大火的自然语言处理 (NLP)是什么东东 ?

自然语言处理 (NLP)是计算机科学的一个分支,更具体地说,是人工智能 (AI)的分支,旨在让计算机能够以与人类大致相同的方式理解文本和语音,大白话讲就是让计算机能听懂人话,能听懂让它干嘛,只有能够理解人类发出的指令才能进行后续的工作。自然语言处理(NLP)是一种将计算语言学(基于规则的人类语言建模)与统计、机器学习和深度学习模型相结合的技术。这些技术使计算机能够理解、感知和满足人类语言的意图,包括文本或语音数据的处理、语言翻译、响应语音命令以及快速总结大量文本。

nochiliyys的博客 1356

transformers DataCollatorForTokenClassification类

在进行NER(实体命名识别)任务时使用的数据收集器,该数据收集器不仅会动态的处理输入的数据,而且会处理数据的标签。参数tokenizer表示用于编码数据的分词器。参数padding表示填充方式,可以为布尔类型、字符串类型或者一个PaddingStrategy对象。当值为布尔类型时,True表示填充至最大序列长度,False表示不填充。当为字符串类型时,"longest"表示填充值最大序列长度,"max_length"表示填充值参数max_length设置的长度,"do_not_pad"表示不填充。参数max

weixin_49346755的博客 1463

nlp 中文文本纠错_小米人工智能部 | 基于BERT的ASR纠错

来源:DataFunTalk作者 | 魏天闻原文链接:请点击文章仅用于学习交流,如有侵权请联系删除导读:小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户query的文本,通常是由ASR系统将用户的语音命令转换而成,但由于技术...

weixin_35172279的博客 1222

【Python基础】parse_args() | HfArgumentParser | 读入json参数文件

parse_args()的使用: 建立解析对象:parser = argparse.ArgumentParser(); 给parser实例添加属性:parser.add_argument('-epoches', type=int, default=15, help='batch size for dataloader'); 增加属性; 通过args = parser.parse_args()把刚才的属性从parser给args,后面直接通过args使用。 import argparse if __na

发现问题,并解决问题,批判性思维 1万+

大语言模型数据处理方法(基于llama模型)

本文使用huggingface方法来构建大模型数据加工方法!当然,这些方法也可以为其它大模型使用!。

weixin_38252409的博客 1307

ChatGLM 源码分析main.py

这个Trainer对象将处理模型的训练和评估。总的来说,这段代码定义了一个脚本,它可以从命令行参数或json文件中获取配置信息,然后加载数据集和预训练模型,对数据进行预处理,并训练或评估模型。最后,如果指定了要进行模型预测,将加载训练过的模型,并使用预处理后的测试数据集对模型进行预测,保存预测结果。然后,如果指定了要进行模型训练,将使用预处理后的训练和评估数据集对模型进行训练,并在训练结束后保存模型。之后,根据模型处于训练、评估还是预测阶段,使用相应的预处理函数处理数据集,并得到预处理后的数据集。

具身机器人和通用AI 2175

文本纠错与BERT的最新结合,Soft-Masked BERT

向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx文本纠错相关资料1.http://www.doc88.com/p-803870892...

datayx的文章 5021

自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错

自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错 目录 自然语言处理NLP之文本摘要、机器翻译、OCR、信息检索、信息抽取、校对纠错 文本摘要 机器翻译 OCR 信息检索 信息抽取 校对纠错(correction) 文本摘要 人类很难手动汇总大型文本文档。文本摘( text summarization)要是NLP为源文档创建简短、准确和流畅的摘要问题。文本摘要有两种基本方法:提取和抽象。前者从原始文本中提取单词和单词短语以创建摘要。后者是学习内部语言表示以生成

data+scenario+science+insight 1238

【ChatGPT原理与应用开发】第四章:文本生成

文本摘要:用精炼的文本来概括整篇文章的大意文本摘要技术🤔实现方法抽取式摘要原文档中提取现成的句子压缩式摘要过滤原文档的冗余信息,压缩文本生成式摘要基于NLG,算法模型根据原文档生成描述基于openai接口的文本摘要🤔通过接口生成文本摘要的方法调用预训练模型基于自定义语料微调CSL摘要数据集论文摘要和标题数据,包含3500条数据标题数据的平均字数为18,字数标准差为4,最大字数为41,最小数字为6。

m0_65787507的博客 1022

深度学习核心技术精讲100篇(二十七)-如何利用NLP技术对ASR的query文本进行预处理纠错?

导读:小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户query的文本,通常是由ASR系统将用户的语音命令转换而成,但由于技术上的原因,这些由ASR生成的文本可能包含错误,继而导致后续的用户意图理解出现偏差。如何利用NLP技术对ASR的query文本进行预处理纠错成了一个亟待解决的问题。 本次分享,将介绍小爱算法团队基于近年来流行的

wenyusuran的专栏 1645

【CODESYS】-软件Bug与处理方法(20240710更)

【CODESYS】-软件Bug与处理方法(不定期更新)

qq_35316470的博客 5186

NLP 文本纠错新方案:Agentic AI + 提示工程的手册实践与效果验证

实验设置:对比传统Seq2Seq模型与新方案,指标包括准确率($ \text{Accuracy} $)和召回率($ \text{Recall} $),定义如下: $$ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}, \quad \text{Recall} = \frac{TP}{TP + FN} $$ 其中$TP$为真阳性(正确修正),$TN$为真阴性,$FP$为假阳性,$FN$为假阴性。:自然语言处理、文本纠错、代理人工智能、指令优化、实践指南。

2501_93895004的博客 825

卡诺图化简法注意事项+竞争冒险知识点总结

今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。

weixin_42415266的博客 1万+

【DataWhale学习笔记-蝴蝶书共读】文本生成

文本摘要任务指的是用精炼的文本来概括整篇文章的大意,使得用户能够通过阅读摘要来大致了解文章的主要内容。抽取式摘要:从原文档中提取现成的句子作为摘要句。压缩式摘要:对原文档的冗余信息进行过滤,压缩文本作为摘要。生成式摘要:基于NLG技术,根据源文档内容,由算法模型自己生成自然语言描述。以下是一个基于mT5模型(T5模型的多语言版)的文本摘要样例。import re# 载入模型。

JeffDing 1200

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3164

蚂蚁金融NLP竞赛——文本语义相似度赛题总结

1前言 许久没有更新博客了,主要是忙于考试周和最近参加的一个蚂蚁金融的NLP比赛——文本语义相似度赛题。话不多说,直奔主题。本篇博客主要记录的是自己入门NLP以来第一次参加NLP性质的赛题的详细解题过程。接下来将分成三个部分进行叙述:赛题描述、解题思路及相关代码实现、赛题总结. 项目代码地址及说明 2赛题描述 说明:问题相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相...

小简铺子 3万+

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1171

毕业设计:Python智能文本校对平台 多格式文本纠错NLP项目 Vue+ElementUI 单条+批量纠错 全栈实现✅

本文介绍了一个基于Paddle框架的智能文本纠错系统。该系统采用Python语言开发,后端使用FastAPI框架,前端采用Vue+ElementUI,结合PaddleNLP和PaddleHub实现多格式文本智能纠错。系统支持文本输入、Word文档和图片三种格式的批量处理,通过OCR技术提取图片文字后,利用预训练模型快速识别并标记错别字、语法错误等。核心功能包括:文本精细分句处理、错误定位与修正标注、历史记录管理、多格式结果输出等。系统采用本地化部署,保障数据隐私安全,处理速度快(单图文字提取<1s,单

q_3375686806的博客 861

【RT-DETR实战】112、NCNN模型转换与层实现支持:从模型文件到推理引擎的硬核实战

本文详细记录了将RT-DETR模型部署到NCNN框架的全过程及关键要点。作者首先遇到MultiHeadAttention等算子不支持的问题,通过ONNX中间转换和自定义层实现解决。文章具体介绍了PyTorch到NCNN的权重转换技巧、模型优化方法(包括量化和线程优化)以及调试经验,强调逐层对比输出、预处理检查和边界情况测试的重要性。最后分享了保持转换流程可复现性的实用建议,指出手动调试虽然耗时但能加深对模型的理解,体现了工程师在解决技术难题时的专业精神与成就感。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 43

1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目

本文介绍如何在 SAP ABAP 事物码 SEGW 里创建 SEGW 项目,使用工具生成 Runtime 运行时需要的资源。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5443

[自然语言处理] 利用pycorrector优化中文文本纠错的实战指南

本文提供了利用pycorrector工具进行中文文本纠错的实战指南。文章详细介绍了该工具在自然语言处理领域的应用,涵盖从快速安装、核心纠错模式(规则与深度学习)解析,到自定义混淆集配置、生产环境部署及性能优化的全流程。通过具体代码示例,帮助开发者高效处理音似、形似及语法错误,提升文本质量与工作效率。

svm4gardener的博客 510

Flutter:如何在Android中实现串口通信调试

本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。

sg_knight的专栏 6098

毕业设计:python多格式文本纠错系统 FastAPI+PaddleNLP Vue前端 文本/文档/图片纠错(源码+文档)✅

毕业设计:python多格式文本纠错系统 FastAPI+PaddleNLP Vue前端 文本/文档/图片纠错(源码+文档)✅

q_3375686806的博客 1578

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于BERT的ASR纠错

基于BERT的ASR纠错 链接:https://pan.baidu.com/s/1meoXKmNpDybyc80G7KBnXA 提取码:4ljr 分享嘉宾:魏天闻 小米人工智能部 导读:小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户query的文本,通常是由ASR系统将用户的语音命令转换而成,但由于技术上的原因,这些由ASR生成的

袁一白的博客 1563

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

语法纠错的研究现状

引言语法纠错(Grammatical Error Correction, GEC)是自然语言处理领域中的一个重要任务,GEC任务要求检测一句话中是否有语法错误,并自动将检测出的语法错误进行纠正,GEC在文本校对、外文学习辅助中都有重要的应用。下面是一个语法纠错任务的示例,在这句话中,加粗的形容词absolute应该修改为副词absolutely。目前语法纠错任务主要是采用类似于机器翻译任务的Seq2Seq框架来实现的。具体来说,输入的错误句子为源语句,输出正确的句子为目标语句。例如下图中,“A B C D”

CSer 4241

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 今天来讲讲 百度网盘下载速度只有几十KB怎么办??
下一篇: 什么是面向对象和面向过程?
123我是木头人
博客等级 码龄9年 67粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123我是木头人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值