人民网2022赛题1-训练一个对话生成模型

需要登录后才允许下载文件包。登录
合集:AI案例-NLP-传媒业
赛题:2022人民网人工智能算法大赛-赛题1-训练一个对话生成模型
官网:https://app.people.cn/h5/detail/normal/5015943150896128
数据发布方:人民网
AI问题:文本生成
数据集:对话数据集
数据集价值:训练一个对话生成模型,自动生成一符合话题场景的回复内容。
解决方案:基于百度中文对话模型PLATO-Mini,根据给定的数据集,训练一个对话生成模型,基于文本内容自动生成自然流畅、信息丰富、符合话题场景的回复内容。

一、赛题描述

简介

为推进人工智能领域的学术交流、人才培养、技术发展,鼓励广大学生积极学习和研发符合我国主流价值观的优秀算法,2022年11-12月举办“2022人民网人工智能算法大赛”,赛事由人民网股份有限公司主办,传播内容认知全国重点实验室承办。赛题包括:

  • 赛题一:对话生成
  • 赛题二:微博话题识别
  • 赛题三:微博流行度预测
  • 赛题四:微博转发行为预测
  • 赛题五:社交媒体机器人识别

赛题一:对话生成

对话生成是自然语言处理中一个重要的研究领域,具有广阔的应用前景。随着深度学习和大规模预训练模型能力的提升,对话生成任务在社交媒体领域,特别是以文字为主要输出形式的媒体上,有了更大落地应用的可能性。此任务提供微博对话数据集,每条数据主要包含微博文本内容,以及微博对应的回复。参赛选手需要根据给定的数据集,训练一个对话生成模型,可以生成自然流畅、信息丰富,符合话题场景的回复内容。

二、数据集内容

训练集

训练集:train_data.csv,共有三个字段,每个字段以\t划分:

1)text: 微博文本正文
2)comment: 回复文本内容
3)weibo_id:微博文本ID

数据样例:

1)【#张帅首进辛辛那提网球公开赛16强#】中国球员张帅17日在女子网球协会辛辛那提公开赛第二轮比赛中,以6:3和6:4击败俄罗斯球员亚历山德洛娃,职业生涯首次打进该赛事16强。接下来,中国“金花”将面对2号种子、爱沙尼亚球员康塔维特,争夺一张四分之一决赛门票。
2)恭喜🎉🎉🎉🎉继续加油!
3)19051

1)【#女孩被困12楼外平台消防员翻窗救援#】近日,山东聊城,一名16岁女孩为捡帽子,被困在12楼外的平台上,无法自行脱困。消防员赶到后,翻窗跳跃到平台上,利用板带固定住被困女孩后,将其成功转移到安全区域。 新华社的微博视频
2)这,自己咋过去?怎么想的?
3)19052

测试集

测试集:test_A.csv,共有两个字段,每个字段以\t划分,用于客观测试:

1)weibo_id:微博ID
2)text:微博文本正文

数据样例:

1)19052 
2)【#女孩被困12楼外平台消防员翻窗救援#】近日,山东聊城,一名16岁女孩为捡帽子,被困在12楼外的平台上,无法自行脱困。消防员赶到后,翻窗跳跃到平台上,利用板带固定住被困女孩后,将其成功转移到安全区域。 新华社的微博视频

1)19074
2)【#云南森林消防员到家睡得有多香#】今天凌晨4点,云南首批432名指战员圆满完成重庆扑救山火任务,平安回到云南森林消防总队训练大队,倒头就睡,睡得特别香!网友:#全网都在围观消防员睡觉#(云南日报) 新华社的微博视频

测试的目标是:根据微博文本正文,机器自动生成回复文本。

数据集版权许可协议

GPL2
人民网

三、解决方案样例

PLATO-Mini模型

PLATO-Mini 是百度 PaddleNLP 团队推出的轻量级中文对话生成模型,基于 PLATO(Pretrained Dialogue Generation Model)架构优化而来,专为中文对话任务设计,适用于开放域聊天、任务型对话等场景。基础模型基于 Transformer 的编码器-解码器结构。训练数据采用海量中文对话数据(社交媒体、论坛、客服日志等)。

关键技术包括:

  • Masked Language Modeling (MLM):学习语言表示。
  • Response Generation:通过序列到序列(Seq2Seq)生成回复。
  • 情感和一致性控制:优化回复的自然度和相关性。

安装

参考文章《安装Paddle系列深度学习框架》。

CPU版本

使用conda安装paddlepaddle==3.0.0b2;使用pip安装paddlenlp==3.0.0b0。

conda install paddlepaddle==3.0.0b2 -c paddle
pip install paddlenlp==3.0.0b0

检查:

(paddle3-cpu) C:\Users\86138>conda list paddle
# packages in environment at D:\App-Data\conda3\envs\paddle3-cpu:
#
# Name                   Version                   Build Channel
paddle2onnx               1.3.1                   pypi_0   pypi
paddlefsl                 1.1.0                   pypi_0   pypi
paddlenlp                 3.0.0b0                 pypi_0   pypi
paddlepaddle             3.0.0b2         py312_cpu_windows   paddle

GPU版本

基于CUDA11.8为例,使用conda安装paddlepaddle-gpu==3.0.0b2;使用pip安装 paddlenlp==2.6.1:

conda install paddlepaddle-gpu==3.0.0b1 paddlepaddle-cuda=11.8 -c paddle -c nvidia
pip install paddlenlp==2.6.1 # 稳定版本

验证:

python -c "import paddlenlp;print(paddlenlp.__version__)"
2.6.1.post

源码逻辑

源码:PeopleNet2022-1-Dialogue-Generation.ipynb 为基线版本。

1、导入库

import paddle
import paddlenlp
from paddlenlp import Taskflow
import pandas as pd

2、读入训练数据集

import pandas as pd
train_data = pd.read_csv('train_data.csv', sep='\t')
test_data = pd.read_csv('test_A.csv', sep='\t')
train_data.sample(2)

3、分析数据集概况

了解数据集中text字段关于长度/len方面的分布情况。默认包括以下统计量:

  • count:非空值的数量。
  • mean:平均长度。
  • std:标准差(反映长度的离散程度)。
  • min/max:最短/最长文本的长度。
  • 25%/50%/75%:四分位数(中位数等)。
train_data['text'].apply(len).describe()

输出:

count    285891.000000
mean       203.050110
std         156.178596
min           4.000000
25%         137.000000
50%         165.000000
75%         224.000000
max       3266.000000
Name: text, dtype: float64

了解数据集中comment字段关于长度/len方面的分布情况。

train_data['comment'].apply(len).describe()

输出:

count    285891.000000
mean         19.030508
std         18.287211
min           6.000000
25%           9.000000
50%         13.000000
75%         22.000000
max         265.000000
Name: comment, dtype: float64

4、文本摘要大模型生成对话

from paddlenlp import Taskflow
text_summarization = Taskflow("text_summarization")
print(text_summarization(["中国球员张帅17日在女子网球协会辛辛那提公开赛第二轮比赛中,以6:3和6:4击败俄罗斯球员亚历山德洛娃,职业生涯首次打进该赛事16强。"]))

这段代码使用了 PaddleNLP 的 Taskflow 模块来实现 文本摘要(Text Summarization) 任务。

输出:[‘# 2012年中国# # 张帅# 首进16强’]

5、开放域对话大模型

利用中文对话模型PLATO-Mini生成评论对话。

  • 导入和初始化:这里使用了PaddleNLP的Taskflow功能,初始化了一个对话模型。
  • from jieba import analyse:从jieba库中导入analyse模块,用于后续的关键词提取。
  • 数据准备:将训练数据按照’text’列分组,并将每组的’comment’列转换为列表形式。
  • 初始化了对话生成和问题生成两个模型。
  • 循环处理前5条微博。对于每条微博,代码会输出:
    • 原始微博文本
    • 前10条评论(使用set去重)
    • 对话模型生成的回复
    • 基于微博文本生成的问题
    • 微博文本的摘要
from paddlenlp import Taskflow
dialogue = Taskflow("dialogue")

# 从jieba库中导入analyse模块,用于后续的关键词提取。
from jieba import analyse
# 数据准备:将训练数据按照'text'列分组,并将每组的'comment'列转换为列表形式。
train_data_index = train_data.groupby('text')['comment'].apply(list)
# 初始化了对话生成和问题生成两个模型。
dialogue = Taskflow("dialogue")
question_generation = Taskflow("question_generation")

for weibo_text in train_data_index.index[:5]:
   print('\n【微博原文】:', weibo_text)
   print('【微博评论】:', set(train_data_index.loc[weibo_text][:10]))
   print('「对话模型」:', dialogue([weibo_text])[0])
   print('「问题生成」:', question_generation([{"context": weibo_text, "answer": analyse.extract_tags(weibo_text)[0]}])[0])
   print('「文本摘要」', text_summarization([weibo_text])[0])

输出:

【微博原文】: #00后已成医美消费主力军#【#如何看待暑假青少年整容热#背后,谁在贩卖“容貌焦虑”?】据了解,许多青少年都面临着不同程度的“容貌焦虑”。有调查显示,如今每到寒暑假、毕业季,都会出现学生扎堆整容的现象,“00后”们已成为医美消费的主力军。近日,记者尝试在多个社交、短视频App上搜索发现,“暑假整容”“暑假变美”“暑假变瘦”等,都是近一个月的热门话题。(法治日报)央视新闻的微博视频
【微博评论】: {'成龙都开双眼皮呢,看脸时代', '咱口袋没钱的只能多开开美颜', '00后都已经二十多岁了别什么都扯上00后啊', '从来没喜欢过网红锥子脸,前女友都是圆脸微胖', '多宣传点正能量吧', '脸上动刀还是要慎重', '但是实话实说,当代社会,颜值红利真的太多了。长得好看的人就是有优势。', '过去还讲究女大十八变,现在倒好直接拔苗助长', '对拉个双眼没什么意见,但是要磨骨啥的我真的不行', '社会审美导致的'}
「对话模型」: 你也知道呀!
「问题生成」: 什么时候整容最火
「文本摘要」

【微博原文】: #1.2元进价土豆卖2元拟罚30万#【1.2元进的土豆卖2元!黑龙江大庆拟对经营者罚30万】8月20日,市市场监督管理局执法人员在检查中发现,农批城内王三土豆经营部存在哄抬物价违法行为。经查,该经营部进价1.2元/斤的土豆,售价从1.4元/斤涨至2元/斤,最高进销差价率达66.66%。执法人员认为,王三土豆经营部利用其经营规模优势,借疫情哄抬物价,严重扰乱市场经营秩序,情节恶劣,根据《中华人民共和国价格法》和《价格违法行为行政处罚规定》,拟对经营者的违法行为处以30万元罚款。 1.2元进的土豆卖2元!黑龙江大庆拟对经营者罚30万
【微博评论】: {'魔幻新闻大赏', '敢不敢把这股劲头用在医院上?医院的药片几块钱成本敢卖到几千敢不敢查?', '各大景区的物价关注一下', '这个罚法,先查一下和知名网店和超市吧,通常加价100%的。', '开始收刮民脂民膏了。', '大庆物价太便宜了吧,卖2元就是哄抬物价?我们这没有低于2元的菜!', '资本家看了都泪流满面:还是你们会玩!', '为啥这个报道缺斤少两呢,摊主卖了4000斤,而且他是批发,到了消费者手里多少钱。不能为了报道而隐瞒事实。', '没感觉特别贵啊,你要是1.2元进的卖5元钱那是哄抬物价,这还可以吧', '只敢欺负老百姓,一斤挣8毛钱还算多吗?'}
「对话模型」: 第三分报告。第1程制第2份报告,农批捕捕捕逃逃逃逃逃捕逃逃逃逃逃逃逃嫌疑人逃逃嫌疑人!
「问题生成」: 1.2元买多少土豆
「文本摘要」 1.2元/斤的“大大大方方”

【微博原文】: #102岁外婆害羞说泡泡吹大了#【#火遍全网的表情包外婆害羞了#】几日前,浙江诸暨,102岁外婆看到外孙秒变惊喜表情包的视频火遍全网,深受网友们的喜爱。102岁外婆的后续来了!她说,“我现在精神蛮痛快的,小辈对我蛮好的。”网友:外婆四代同堂好幸福,祝福外婆身体健康!(美丽浙江) 新华社的微博视频
【微博评论】: {'也希望我奶奶能活到一百多岁,说我调皮。可她已经离开三年了,好想奶奶', '真好,祝外婆健康长寿,想自己外婆了', '祝外婆永远健康长寿', '老人长寿源于家和子孝', '外婆的发量真令人羡慕', '哈哈哈,好可爱', '好幸福、祝老人长寿', '希望我也能活到100岁', '希望奶奶健健康康的', '好可爱的老奶奶哦!'}
「对话模型」: 外婆好,你的外婆是在新华社做的视频吗?
「问题生成」: 102岁外婆害羞了是谁
「文本摘要」 “大大大方方”

【微博原文】: #11岁哥哥捐髓救4岁弟弟#【#11岁哥哥捐髓救弟弟成功后紧紧相拥#】近日,浙江杭州,4岁弟弟得了白血病,11岁哥哥毫不犹豫捐造血干细胞救弟弟。手术成功后,弟弟见到哥哥开心地手舞足蹈,哥哥迫不及待一把将其抱起。网友:兄弟俩满眼都是彼此! 新华社的微博视频
【微博评论】: {'小小孩子受苦了 以后要健健康康的', '为哥俩点赞祝福!我家11岁哥哥和4岁弟弟还在打架😤', '希望健康,顺丰', '我记得有个哥哥得了白血病弟弟不愿捐的新闻', '弟弟小腿蹦哒的,是真的开心', '祝一切平安顺遂!', '相扶相持一起长大', '好哥哥!!真感动 看得我热泪盈眶', '真是幸运的宝贝', '愿早日康复,做健康幸福的好兄弟!'}
[2025-06-19 14:56:23,714] [ WARNING] - `max_length` will be deprecated in future releases, use `max_new_tokens` instead.
[2025-06-19 14:56:23,714] [ WARNING] - `min_length` will be deprecated in future releases, use `min_new_token` instead.
「对话模型」: 我也喜欢看这个视频,你是怎么知道这个视频的?
[2025-06-19 14:56:30,245] [ WARNING] - `max_length` will be deprecated in future releases, use `max_new_tokens` instead.
「问题生成」: 哥哥捐髓救四岁弟弟
[2025-06-19 14:56:34,568] [ WARNING] - `max_length` will be deprecated in future releases, use `max_new_tokens` instead.
[2025-06-19 14:56:34,568] [ WARNING] - `min_length` will be deprecated in future releases, use `min_new_token` instead.
「文本摘要」 4岁男孩“““小小小年”“大大大年”

【微博原文】: #12人自发为爱心补给站添水#【#市民自发为爱心冰柜添水200多箱#】近日,浙江慈溪,爱心人士放置“爱心补给站”,为环卫工人等一线工作者提供免费水,陆续有人自发来添加瓶装水。“爱心补给站”发起人曾先生说,刚开始是想为大家提供便利,后来好几家店加入进来,看到满满的冰柜心里挺感动的。(美丽浙江) 新华社的微博视频
【微博评论】: {'人间自有真情在', '浙江是个暖人的省份', '真是人和人怎么差这么多,好人都在放进去,坏人偷6箱', '环卫工人真的好辛苦', '前面是偷水的视频这个就', '人间处处有真情!', '素质真高!!', '中国人的质朴和善良 和谐社会真的很美', 'love is in the air.人民善良朴实', '如果放在我的城市 很多老年人大概率会无限白嫖'}
「对话模型」: 我也看过这个视频,感觉好感人。
「问题生成」: 杭州有多少人为冰柜添水
「文本摘要」 # 今日头条#

6、测试输出

输出测试数据集评论对话结果

weibo_number = 0  # number of weibo
for row in test_data.values:
   if len(row[1]) > 0:
       test_data.at[weibo_number, 'dialog'] = dialogue([row[1]])[0]
   
   weibo_number += 1

test_data.to_csv('test_A_output.csv', sep='\t')

输出数据样例:

1)44    
2)19108
3)【#重庆娃儿骑摩托车硬核运送救火物资#】8月22日,重庆因高温发生山火。由于当地地势陡峭,依靠人力很难将救援物资运上山,多名小伙骑摩托车赶来帮忙。参与物资运送的小伙子中,有不少是周边群众,也有专程赶来的专业车手。#救火物资难上山重庆娃儿骑着摩托来了#(新华每日电讯) 新华社的微博视频
4)这是重庆的一个小地名,我也是听别人提起过,然后才想到这个名字。

根据第3个字段也就是文本内容,第4个字段为机器自动生成的符合话题场景的回复内容。

四、获取案例套装

需要登录后才允许下载文件包。登录

发表评论