如何将TensorFlow CNN/DailyMail数据集转为Pandas DataFrame并修复报错
修复方案
报错根因
tfds.as_dataset()返回的是tf.data.Dataset子类(此处为预取优化后的PrefetchDataset),本身不支持按字段名索引,直接用train_dataset['article']取值必然触发下标错误。- 你后续拿到的带
b前缀的输出,是TFDS默认将文本以bytes格式存储在样本中,需要解码为utf-8格式的普通字符串。
完整可运行代码
先补充遗漏的pandas导入,再按如下逻辑改写:
import pandas as pd import tensorflow_datasets as tfds # 加载数据集(直接用tfds.load比手动初始化builder更简洁,效果完全一致) train_dataset, test_dataset = tfds.load( name="cnn_dailymail", split=["train", "test"], shuffle_files=False ) # 手动遍历提取,方便自定义处理逻辑 text_list = [] summary_list = [] # 使用as_numpy_iterator遍历,直接拿到样本的numpy/bytes格式数据 for sample in train_dataset.as_numpy_iterator(): # 对bytes类型的文本做utf-8解码 text_list.append(sample["article"].decode("utf-8")) summary_list.append(sample["highlights"].decode("utf-8")) # 构造DataFrame reviews = pd.DataFrame({"Text": text_list, "Summary": summary_list}) print(reviews.head())
简化写法
TFDS内置了直接转DataFrame的工具,会自动完成bytes解码,不需要手动遍历:
# 直接转成DataFrame后重命名列即可 reviews = tfds.as_dataframe(train_dataset).rename( columns={"article": "Text", "highlights": "Summary"} ) print(reviews.head())
注意点
- 原代码中遗漏了
import pandas as pd,直接运行会报pandas未定义的错误,一定要补导入。 - 你之前拿到的
b"xxx"格式输出,经过上述解码步骤后会变成不带前缀的正常字符串,符合后续Transformer训练的输入要求。 - CNN/DailyMail本身是英文新闻数据集,解码后得到的英文文本是数据集的原始内容,符合该数据集的训练要求,不需要额外翻译。如果你的下游任务需要中文输出,再单独对接翻译模块即可。
内容的提问来源于stack exchange,提问作者user15519339
相关产品推荐
相关产品推荐

