摘要:
合集: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 的关键区别
特性 | XLNet | BERT |
---|---|---|
训练目标 | 排列语言建模 (PLM) | 掩码语言建模 (MLM) |
上下文依赖 | 双向 + 自回归 | 仅双向 |
掩码符号 | 无 [MASK] ,更贴近真实数据 | 依赖 [MASK] |
长文本处理 | 支持(Transformer-XL 机制) | 有限 |
典型应用 | 生成任务、填空、分类 | 分类、标注任务 |
运行环境
开发包 | 版本 |
---|---|
python | 3.12.3 |
sklearn-compat | 0.1.3 |
torch | 2.5.1 |
transformers | 4.49.0 |
datasets | 2.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 文件加载数据集,分为训练集、验证集和测试集。
- 数据预处理:
- 将句子和候选成语拼接成模型输入格式。
- 使用
tokenizer
对文本进行编码,生成input_ids
和attention_mask
。
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
):- 封装了训练循环、评估和预测功能。
- 支持从检查点恢复训练。
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