科大讯飞2021中文成语填空挑战赛

摘要:

合集:AI案例-NLP-传媒业
赛题:ChatGPT生成文本检测器
主办方:科大讯飞 x Datawhale
主页:https://challenge.xfyun.cn/topic/info?type=text-detector&ch=j4XWs7V
AI问题:文本生成
数据集:数据集为中文作文样本,其中从互联网上采集得到了真实作文,并且使用ChatGLM-6B生成了部分作文。
数据集价值:构建一个文本分类模型,以区分真实对话和由ChatGPT生成的对话文本。
解决方案:TF-IDF、逻辑回归模型

一、赛题描述

背景

近年来人工智能在自然语言处理领域取得了巨大的进展。其中一项引人注目的技术是生成模型,如OpenAI的GPT-3.5。这类模型通过学习大量的文本数据,具备了生成高质量文本的能力,从而引发了一系列关于文本生成真实性的讨论。

正因为生成模型的迅猛发展,也引发了一个新的挑战,即如何区分人类编写的文本与机器生成的文本。传统上,我们借助语法错误、逻辑不连贯等特征来辨别机器生成的文本,但随着生成模型的不断改进,这些特征变得越来越难以区分。因此,为了解决这一问题,研究人员开始探索使用NLP文本分类技术来区分人类编写的文本和机器生成的文本。

任务

本赛题旨在构建一个文本分类模型,以区分真实对话和由ChatGPT生成的对话文本。在给定的数据集中,包含了一系列真实对话和ChatGPT生成的对话样本,参赛选手需要设计并训练一个模型,使其能够准确地将这两种类型的对话进行分类。

二、数据集描述

数据说明

赛题训练集案例如下:

字段
text海外市场的本土网游企业也在崛起,这一点在越南等东南亚市场表现尤其明显,越南本土游戏公司[MASK][MASK][MASK][MASK],再加上更多的中国企业瞄准这一市场,竞争更加激烈。
candidate张王赵李,海不波溢,七男八婿,异军突起
label异军突起

训练集5w条数据,测试集1w条数据。测试集中label字段为空,需要选手预测。

数据集版权许可协议

BY-NC-SA 4.0
https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans

三、解决方案样例

工作原理介绍

`hfl/chinese-xlnet-base 是 Hugging Face 社区提供的 ​中文预训练语言模型,基于 Google 的 ​XLNet 架构优化,专为中文文本设计。以下是详细介绍:

1、模型简介

  • 开发者:Hugging Face 团队与哈尔滨工业大学(HFL)合作优化。
  • 架构:基于 ​XLNet​(Transformer + CNN 的混合架构),结合自回归(Auto-Regressive)和自注意力(Self-Attention)机制。
  • 定位:中文领域的通用预训练模型,适用于多种 NLP 任务(如文本分类、问答、摘要)。

2、XLNet 的核心架构

XLNet 是 Google 在 2019 年提出的通用语言模型,结合了 自回归(AR) 和 自编码(AE) 模型的优势,核心创新如下:

(1) 排列语言建模(Permutation Language Modeling, PLM)

  • 传统 BERT 的缺陷: BERT 使用掩码语言建模(MLM),但 [MASK] 符号在微调时不会出现,导致预训练-微调不一致。
  • XLNet 的解决方案: 通过 排列组合 所有可能的词序,模型在预测某个词时能看到所有位置的上下文(双向),但依然保持自回归的生成式训练。 举例: 句子 "A B C D" 的排列可能是 "B A C D",模型在预测 "C" 时已见过 "B""A"(但顺序随机)。

(2) 双流自注意力(Two-Stream Self-Attention)

  • 问题:在排列语言建模中,模型需要知道当前预测的位置(避免信息泄漏)。
  • 解决方案:
    • 内容流注意力:正常处理词的内容(类似 Transformer)。
    • 查询流注意力:仅访问位置信息,不泄露当前词内容。 作用:确保模型在预测第 i 个词时,只能使用前 i-1 个词的信息。

(3) 集成 Transformer-XL 的优点

  • 片段递归机制:缓存前一片段的隐藏状态,解决长文本依赖问题。
  • 相对位置编码:替换绝对位置编码,提升泛化能力。

3、XLNet 与 BERT 的关键区别

特性XLNetBERT
训练目标排列语言建模 (PLM)掩码语言建模 (MLM)
上下文依赖双向 + 自回归仅双向
掩码符号[MASK],更贴近真实数据依赖 [MASK]
长文本处理支持(Transformer-XL 机制)有限
典型应用生成任务、填空、分类分类、标注任务

运行环境

开发包版本
python3.12.3
sklearn-compat0.1.3
torch2.5.1
transformers4.49.0
datasets2.19.1

模型部署路径为:./model/chinese-xlnet-base

处理流程

源码:NLP_Chinese_Idioms_Filling.ipynb。这个代码是一个基于 chinese-xlnet-base 模型的中文成语填空任务的实现,主要分为数据预处理、模型训练和预测三个部分。

  • 任务目标:给定一个句子和四个候选成语,模型需要选择最合适的成语填入句子中的空缺位置。
  • 模型架构:基于 XLNetForMultipleChoice 的多选分类模型。
  • 数据格式:输入:句子(sent1)、问题描述(sent2)和四个候选成语(ending0 到 ending3)。输出:选择正确的成语(标签为 0 到 3)。

(1) 参数配置

  • ModelArguments:定义模型相关参数,如模型路径、缓存目录等。model_name_or_path = “./model/chinese-xlnet-base”  # 模型路径
  • DataTrainingArguments:定义数据路径和预处理参数。train_file = “./data/new_train.csv”  # 训练数据路径
    validation_file = “./data/new_valid.csv”  # 验证数据路径
    max_seq_length = 200  # 输入序列的最大长度
  • TrainingArguments:定义训练超参数(如学习率、批次大小等),通过 HfArgumentParser 解析。

(2) 数据加载与预处理

  • 数据加载
    • 从 CSV 文件加载数据集,分为训练集、验证集和测试集。
    datasets = load_dataset(“csv”, data_files={“train”: train_file, “validation”: validation_file, “test”: test_file})
  • 数据预处理
    • 将句子和候选成语拼接成模型输入格式。
    • 使用 tokenizer 对文本进行编码,生成 input_idsattention_mask
    def preprocess_function(examples):
       first_sentences = [[context] * 4 for context in examples[“sent1”]]
       second_sentences = [[f”{examples[‘sent2’][i]} {examples[end][i]}” for end in [“ending0”, “ending1”, “ending2”, “ending3”]] for i in range(len(examples[“sent2”]))]
       # Tokenize 并生成模型输入

(3) 模型初始化

  • 加载预训练的 chinese-xlnet-base 模型和分词器:model = AutoModelForMultipleChoice.from_pretrained(“./model/chinese-xlnet-base”)
    tokenizer = AutoTokenizer.from_pretrained(“./model/chinese-xlnet-base”)
  • 注意:如果模型缺少某些层(如 logits_proj),会提示需要微调。

(4) 训练与评估

  • 训练器 (Trainer)
    • 封装了训练循环、评估和预测功能。
    • 支持从检查点恢复训练。
    trainer = Trainer(
       model=model,
       args=training_args,
       train_dataset=tokenized_datasets[“train”],
       eval_dataset=tokenized_datasets[“validation”],
       data_collator=data_collator,
       compute_metrics=compute_metrics,
    )
  • 评估指标:准确率(Accuracy)。def compute_metrics(eval_predictions):
       predictions, labels = eval_predictions
       preds = np.argmax(predictions, axis=1)
       return {“accuracy”: (preds == labels).mean()}

(5) 预测与输出

  • 对测试集生成预测结果,并保存为 CSV 文件:predictions = trainer.predict(test_dataset).predictions
    preds = np.argmax(predictions, axis=1)
    with open(“test_results.csv”, “w”) as f:
       for pred in preds:
           f.write(f”{candidates[pred]}\\n”)

运行结果

初始化训练状态:

  • 拷贝文件 trainer_state.json 到模型文件目录:model/chinese-xlnet-base,该文件用于跟踪训练状态。设置global_step=0,epoch=0.0。
  • 删除训练输出目录 trainer_output
***** Train results *****
epoch = 3.0
total_flos = 66768261840000.0
train_loss = 0.0
train_runtime = 0.0139
train_samples_per_second = 10780.979
train_steps_per_second = 1509.337

***** Eval results *****
epoch = 3.0
eval_accuracy = 0.8399999737739563
eval_loss = 0.4880923330783844
eval_runtime = 65.1531
eval_samples_per_second = 0.767
eval_steps_per_second = 0.107

输出:test_results.csv

label
舆死扶伤
名列前茅
无所事事
如火如荼
夜以继日
紧锣密鼓
...

源码开源协议

GPL-v3

四、获取案例套装

需要登录后才允许下载文件包。登录

发表评论