🚩🚩🚩Hugging Face 实战系列 总目录
有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Jupyter Notebook中进行
本篇文章配套的代码资源已经上传
文本摘要建模实战1 之 数据清洗
文本摘要建模实战2 之 Tokenizer处理
1 任务概述
1.1 任务概述
- 摘要任务要去解决一个什么事情呢
- 就是输入一个文章,输出一个总结归纳性的文字或者标题
- 输入也是文本,输出也是文本的text-to-text任务
- 对原本的文本进行精简,输入长文本,输出短文本
- 用一个长文本生成一个标题,用一个标题生成一个长文本,都是文本摘要建模的任务
1.2 数据与任务解析
数据下载链接,也可以通过代码中加载
这个数据集也是Hugging Face内置的数据集,这个数据集有多个语言版本,我们选中文的就好:
这个数据中我们主要关注两个字段:(review_body和review_title),其他的我们暂时不需要用,这个数据中body就是我们的输入,title就是我们的标签输出
1.3 数据展示
from datasets import load_dataset
chinese_dataset = load_dataset("A:/amazon_reviews_multi")
chinese_dataset
- 从datasets 模块导入load_dataset方法
- 从本地路径加载数据
- 打印出数据
DatasetDict({
train: Dataset({
features: [‘id’, ‘text’, ‘label’, ‘label_text’],
num_rows: 200000
})
validation: Dataset({
features: [‘id’, ‘text’, ‘label’, ‘label_text’],
num_rows: 5000
})
test: Dataset({
features: [‘id’, ‘text’, ‘label’, ‘label_text’],
num_rows: 5000
})
})
这个数据集中,数据是比较大的,因为包含了各种各样的数据,训练集达到 了20万,验证测试都是5千
def show_samples(dataset, num_samples=3, seed=40):
sample = dataset["train"].shuffle(seed=seed).select(range(num_samples))
for example in sample:
print(f"\n'>> Title: {example['review_title']}'")
print(f"'>> Review: {example['review_body']}'")
show_samples(chinese_dataset)
- 展示样本函数
- 从训练集中展示选取3条数据样本
- 遍历取出样本
- 打印标题
- 打印长文本
‘>> Title: 重修版的结局’ ’
‘>> Review:’
重修版的结局还是跟原版没什么很大出入…虽然说把原来伏笔用上句式古风可是结局感觉给人有点仓促’
‘>> Title: 盗版书!!!’
‘>> Review:’
这是盗版书,中间翻不开,胶装在一起的,如果想要翻开看全图,书都要撕掉的感觉,装订特别烂,我才翻了几次就有掉页的趋势,后悔后悔’
‘>> Title: 一分钱一分货’ ‘>> Review: 除了便宜真没什么好的,即便4档面包靠里一面还是会胡,设7档有什么意义。’
2 数据预处理
2.1 查看所有类别
- 数据种类挺多的,咱们训练次数比较少,就选一个类别的
- 先转换成pandas格式来统计
- 书比较多,数据还算可以,咱们就用书的来玩
chinese_dataset.set_format("pandas")#格式转pnadas,这点用着还挺方便
chinese_df = chinese_dataset["train"][:]#对训练数据统计
# 前20个类别的数量
chinese_df["product_category"].value_counts()[:20]
- 格式转pnadas,这点用着还挺方便
- 取出训练数据
- 对训练数据进行各个列的值进行统计,打印统计结果
book 63058
digital_ebook_purchase 19006
apparel 11804
shoes 9877
beauty 9401
kitchen 9170
home 8222
other 7525
grocery 7425
wireless 6432
baby_product 6172
drugstore 6072
sports 6015
pc 4821
toy 3670
home_improvement 3239
watch 3133
electronics 3059
luggage 2984
office_product 2855
Name: product_category, dtype: int64
很明显书占的最多,就只要书这个类别了,看看转换成pandas数据格式后的数据展示,前五条:
2.2 只要书这个类别
def filter_books(example):
return ( example["product_category"] == "book")
chinese_dataset.reset_format()
chinese_dataset = chinese_dataset.filter(filter_books)
show_samples(chinese_dataset)
- 过滤类别的函数
- 返回只要书的类别
- 首先转换为 Hugging Face要求的数据格式
- 把选用类别的函数给到它
- 再用展示样本的函数进行展示
打印结果:
’ Title: 非常推荐!’
‘>> Review: 一本从教育学角度考察慕课发展的书 对理清慕课发展历程非常有帮助!’
‘>> Title: 唠叨’
‘>> Review: 一个人的碎碎念,就是没地方唠叨了,全跑书里来喋喋不休’
‘>> Title: 心碎’
‘>> Review:
只有一层塑料袋装着,到的时候皱皱巴巴不成样子,我的地图啊,亚马逊你让我太失望了(还跟那么多书一起买的,包装都没有),心碎’
这种方法是huggingface推荐的,感觉我先pandas处理好再转换成Hugging Face的数据格式也可以
看一下筛选后的数据维度:
chinese_dataset
DatasetDict({
train: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 63058
})
validation: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 1563
})
test: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 1567
})
})
现在我们训练集只有6万条数据了,验证测试都是1500条多
2.3 标签处理
- 过滤掉标签太短的,这样不利于建模
- 我们希望预测出来的结果别就两个字
books_dataset = chinese_dataset.filter(lambda x: len(x["review_title"]) > 4)
标签必须要大于4个词的数据我们才要
再看一下我们的数据
books_dataset
DatasetDict({
train: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 36452
})
validation: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 902
})
test: Dataset({
features: [‘review_id’, ‘product_id’, ‘reviewer_id’, ‘stars’, ‘review_body’, ‘review_title’, ‘language’, ‘product_category’],
num_rows: 904
})
})