- NLP
- 人工智能
- 深度学习
【免费下载链接】ParlAI
A framework for training and evaluating AI models on a variety of openly available dialogue datasets.
本文围绕 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.py | CNNDMTeacher数据解析与对话格式封装 |
二、数据自动构建:build.py 的下载与分片机制
与 ParlAI 中大多数任务一致,cnn_dm的数据不需要手工准备,运行时会通过 parlai/tasks/cnn_dm/build.py 自动完成下载与构建。
2.1 数据源与完整性校验
build.py中的RESOURCES列表定义了 8 个待下载文件,分为两类:
原始语料(Google Drive 托管,.tgz压缩包):
| 文件 | 用途 |
|---|---|
cnn_stories.tgz | CNN 新闻故事语料(SHA-256:e8fbc002...cb200) |
dm_stories.tgz | Daily Mail 新闻故事语料(SHA-256:ad690100...47e) |
官方切分 URL 列表(来自 abisee/cnn-dailymail 仓库,明文.txt):
| 文件 | 用途 |
|---|---|
cnn_wayback_training_urls.txt/validation/test | CNN 三组切分对应的文章 URL |
dailymail_wayback_training_urls.txt/validation/test | Daily 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>.story、dailymail/stories/<sha1>.story),按data_type = ['train', 'valid', 'test']依次追加写入train.txt、valid.txt、test.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 标识
id为cnn_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.
相关推荐
ParlAI 中的 Twitter 闲聊任务:从数据构建管线到 Teacher 加载的完整实践指南
ParlAI 中的 Twitter 闲聊任务:从数据构建管线到 Teacher 加载的完整实践指南 导读 Twitter 任务(Task: Twitter)是
NLP人工智能深度学习ParlAI 中的 bAbI 任务完全指南:从 1k/10k 数据加载、Teacher 实现到多任务训练
ParlAI 中的 bAbI 任务完全指南:从 1k/10k 数据加载、Teacher 实现到多任务训练 导读 本文围绕 parlai/tasks/babi/R
NLP人工智能深度学习cordova-icon源码解析:从XML解析到ImageMagick的图标生成原理
cordova icon源码解析:从XML解析到ImageMagick的图标生成原理 cordova icon是一款为Cordova项目提供自动图标大小调整功能
NLP人工智能深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考