ParlAI 中的 CNN/DM 摘要任务:从数据构建到 Teacher 实现的完整解析
2026/9/24 16:40:41 网站建设 项目流程
  • NLP
  • 人工智能
  • 深度学习

【免费下载链接】ParlAI

A framework for training and evaluating AI models on a variety of openly available dialogue datasets.

项目地址:https://gitcode.com/gh_mirrors/pa/ParlAI
点击查看免费下载

本文围绕 ParlAI 任务库中的cnn_dm(CNN/Daily Mail 摘要生成)任务展开,系统梳理该数据集在框架中的接入方式:包括自动下载与分片构建脚本、以摘要为标签的 Teacher 数据解析逻辑,以及其作为 DecaNLP 十项任务之一的多任务定位。读完本文,你将掌握如何通过一条命令行加载该任务、理解其底层数据管线,并能在 ParlAI 中直接复用它进行摘要模型的训练与评估。

一、任务概述:来自 CNN 与 Daily Mail 的摘要数据集

cnn_dm是 ParlAI 内置任务之一,其官方描述为:

Dataset collected from CNN and the Daily Mail with summaries as labels, Implemented as part of the DecaNLP task. Downloaded from https://cs.nyu.edu/~kcho/DMQA/

即:这是一个从 CNN 与英国《每日邮报》(Daily Mail)新闻语料中收集的数据集,以人工撰写的摘要(highlights)作为标签,属于 DecaNLP 基准任务的组成部分,原始数据由纽约大学 Karl Moritz Hermann 等人发布的 QA 数据集(DMQA)演变而来。

在 ParlAI 的任务注册表 parlai/tasks/task_list.py 中,它被登记为:

{ "id": "cnn_dm", "display_name": "CNN/DM Summarisation", "task": "cnn_dm", "tags": ["decanlp"], "description": "Dataset collected from CNN and the Daily Mail with summaries as labels, Implemented as part of the DecaNLP task." }

任务目录本身只有三个文件(parlai/tasks/cnn_dm/):

文件职责
README.md任务说明与标签(#cnn_dm#All#decanlp
build.py数据下载、校验与训练/验证/测试分片构建
agents.pyCNNDMTeacher数据解析与对话格式封装

二、数据自动构建:build.py 的下载与分片机制

与 ParlAI 中大多数任务一致,cnn_dm的数据不需要手工准备,运行时会通过 parlai/tasks/cnn_dm/build.py 自动完成下载与构建。

2.1 数据源与完整性校验

build.py中的RESOURCES列表定义了 8 个待下载文件,分为两类:

原始语料(Google Drive 托管,.tgz压缩包)

文件用途
cnn_stories.tgzCNN 新闻故事语料(SHA-256:e8fbc002...cb200
dm_stories.tgzDaily Mail 新闻故事语料(SHA-256:ad690100...47e

官方切分 URL 列表(来自 abisee/cnn-dailymail 仓库,明文.txt

文件用途
cnn_wayback_training_urls.txt/validation/testCNN 三组切分对应的文章 URL
dailymail_wayback_training_urls.txt/validation/testDaily Mail 三组切分对应的文章 URL

每个DownloadableFile都带有 SHA-256 校验值,下载后自动校验,确保数据完整性;zipped=False的 URL 列表文件以明文方式直接落盘。

2.2 分片文件(.txt)的生成:URL → SHA1 哈希映射

构建的核心技巧在于用 URL 的 SHA1 哈希作为文件名索引,这是 CNN/DM 原始语料(.story 文件)的经典命名约定。build.py中对应的逻辑为:

for url in urls_file: file_name = hashlib.sha1(url.strip().encode('utf-8')).hexdigest() split_file.write("cnn/stories/{}.story\n".format(file_name))

即:对 URL 列表中的每一行计算 SHA1,拼出相对路径(如cnn/stories/<sha1>.storydailymail/stories/<sha1>.story),按data_type = ['train', 'valid', 'test']依次追加写入train.txtvalid.txttest.txt三个分片文件。最终每个分片就是一行一个.story文件路径,供 Teacher 逐行读取。

整个过程封装在build(opt)中:

def build(opt): dpath = os.path.join(opt['datapath'], 'CNN_DM') if not build_data.built(dpath, version_string=version): # 下载 RESOURCES 中全部文件 for downloadable_file in RESOURCES: downloadable_file.download_file(dpath) # 由 URL 列表生成 train/valid/test 三个 .txt 分片 ... build_data.mark_done(dpath, version_string=version)

下载目录为{opt['datapath']}/CNN_DM,并以mark_done打上完成标记,避免重复构建。所有文件 I/O 均通过PathManager完成,兼容本地与远程文件系统。

三、Teacher 实现:agents.py 的解析与对话封装

任务的数据读取逻辑集中在 parlai/tasks/cnn_dm/agents.py 的CNNDMTeacher中,它继承自DialogTeacher(来自 parlai/core/teachers.py),把每条样本组织成标准的「text + label」对话形式。

3.1 数据路径与 datatype 适配

class CNNDMTeacher(DialogTeacher): def __init__(self, opt, shared=None): self.dt = opt.get('datatype', 'train').split(':')[0] self.id = 'cnn_dm' self.datapath = os.path.join(opt['datapath'], 'CNN_DM') opt['datafile'] = self._path(opt) super().__init__(opt, shared)
  • Teacher 标识idcnn_dm
  • _path()中调用build(opt)确保数据就绪,再根据datatype的第一段(train/valid/test,冒号前的部分,忽略:ordered:stream等修饰符)拼出对应分片文件{datapath}/CNN_DM/{dt}.txt

3.2 摘要标签的解析:@highlight 标记

.story原文格式中,新闻正文与摘要之间以@highlight行分隔,其后为多条摘要要点。setup_data的解析逻辑为:

for line in story_file: line = _fix_missing_period(line.strip()) if line == "": continue if line.startswith("@highlight"): is_highlight = True continue if is_highlight: highlights.append(line) else: article.append(line)

即:@highlight之前的所有行归入article(新闻正文),之后的行归入highlights(摘要标签),空行直接跳过。

_fix_missing_period是一个值得注意的预处理细节:若一行既非空、非@highlight、且末尾字符不属于END_TOKENS. ! ? ... '" ’ ” )`),则自动补一个句号,保证句子边界完整:

END_TOKENS = ['.', '!', '?', '...', "'", "`", '"', u'\u2019', u'\u201d', ")"] if "@highlight" in line or line == "" or line[-1] in END_TOKENS: return line return line + "."

3.3 对话格式:统一的问句与 NFKC 归一化

每条样本最终组织为:

self.question = 'What is the summary?' text = (unicodedata.normalize('NFKC', ' '.join(article)) + '\n' + self.question) label = [unicodedata.normalize('NFKC', ' '.join(highlights))] yield ((text, label, None, None), new_episode)
  • text:新闻正文 + 换行 + 固定问句What is the summary?(为对齐 DecaNLP 的问答式任务格式而设计);
  • label:多条摘要要点用空格拼接成单一字符串标签;
  • NFKC 归一化:统一全角/半角与兼容字符,避免编码噪声影响训练;
  • 每篇故事作为一个独立 episode(new_episode = True),各样本之间无上下文关联。

文件缺失时(EnvironmentError)会跳过该样本并计数,读取结束后打印统计:

{} stories added, {} stories missing.

最后DefaultTeacher直接继承CNNDMTeacher,作为 ParlAI 的默认任务入口。

四、命令行加载与使用

4.1 快速查看数据

使用 ParlAI 的display_data脚本即可查看该任务的样本格式(首次运行会自动触发下载与构建):

python -m parlai.scripts.display_data -t cnn_dm # 指定切分(valid / test)或随机打乱 python -m parlai.scripts.display_data -t cnn_dm -dt valid python -m parlai.scripts.display_data -t cnn_dm -dt train:shuffle

输出中每条样本的text为新闻正文加问句,labels即为摘要。任务在框架中的完整注册入口位于 parlai/tasks/tasks.py 与 parlai/tasks/task_list.py。

4.2 训练与评估

该任务可直接接入标准训练管线,例如用 Transformer 生成式模型训练摘要模型:

python -m parlai.scripts.train_model \ -t cnn_dm \ -m transformer/generator \ --model-parallel True \ -bs 16 \ -lr 1e-5 \ --optimizer adam \ --embedding-size 512 \ --n-layers 8 \ --ffn-size 2048 \ --n-heads 16 \ --variant xlm \ --activation gelu \ -vp 5 \ -vmt ppl \ -vmm min \ -veps 1 \ --validation-max-examples 100 python -m parlai.scripts.eval_model -t cnn_dm -dt test -mf <模型路径>

需要注意的是,cnn_dm目录本身只提供 Teacher(数据层),不附带预训练模型权重或评测脚本;摘要质量评估(如 ROUGE)需在外部对模型输出计算。

五、在 DecaNLP 多任务基准中的角色

cnn_dm是 DecaNLP 基准的十项任务之一。在 parlai/tasks/decanlp/agents.py 中可以看到完整任务清单:

decanlp_tasks = [ 'squad', # 抽取式问答 'iwslt14', # 机器翻译 'cnn_dm', # 摘要生成 'multinli', # 自然语言推理 'sst', # 情感分类 'qasrl', # 语义角色标注 'qazre', # 关系抽取 'woz', # 任务型对话 'wikisql', # 文本转 SQL 'mwsc', # 指代消解 ]

DecaNLP 的设计思想是把这些异构 NLP 任务统一转化为「问题 + 上下文 → 答案」的问答形式,因此cnn_dm的样本才会被构造成正文 + What is the summary?的结构。CnnDmTeacher在 DecaNLP 中只是对cnn_dm.DefaultTeacher的透明包装:

class CnnDmTeacher(cnn_dm.DefaultTeacher): pass

若要在多任务模式下联合训练,直接使用decanlp任务即可:

python -m parlai.scripts.display_data -t decanlp -dt valid python -m parlai.scripts.train_model -t decanlp -m transformer/generator ...

六、小结

cnn_dm任务在 ParlAI 中的实现脉络清晰:build.py负责从 Google Drive 与官方 URL 列表自动拉取语料,以URL 的 SHA1 哈希生成三切分索引文件并做完整性校验;agents.py则通过DialogTeacher.story原文解析为「正文 + 问句 → 摘要标签」的标准对话样本,包含@highlight切分、缺失句号补齐与 NFKC 归一化等细节处理。它既是独立的摘要生成任务,也是 DecaNLP 多任务基准的关键组成,可直接通过-t cnn_dm-t decanlp加载训练,是研究新闻摘要与多任务学习的便捷入口。

  • NLP
  • 人工智能
  • 深度学习

【免费下载链接】ParlAI

A framework for training and evaluating AI models on a variety of openly available dialogue datasets.

项目地址:https://gitcode.com/gh_mirrors/pa/ParlAI
点击查看免费下载
上一篇:KMS智能激活工具:Windows和Office永久激活的终极解决方案
下一篇:3步完成B站视频下载:专业工具助你轻松获取大会员4K高清资源

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询