基于paddlehub的粉圈微博生成
一-前言
灵感来源于中文互联网中的大量垃圾信息与“僵尸粉”,以及大量的粉丝打榜内容。
在自然语言处理的帮助下,我们是否可以创造出能自主行动,甚至与真人用户互动的虚拟用户?人们能否识别ta是人还是ai?会与ta讨论、甚至争斗吗?
本项目以某明星的粉丝为例,尝试生成粉圈微博,并在微博上回复他人,观察人类用户的回复。
希望能将本项目作为一种尝试,引起更多人对社交媒体的反思。
- 输入:话题,如[XX电视剧],[XX晚安]
- 输出:对应话题的粉圈微博
Github地址: https://github.com/sunyuqian1997/ghost-on-web
二-模型简介
ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。此外, ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。ernie_gen module是一个具备微调功能的module,可以快速完成特定场景module的制作。
https://www.paddlepaddle.org.cn/hubdetail?name=ernie_gen&en_category=TextGeneration
三-安装环境
! pip install xlrd
! pip install paddlehub==1.8.0
! pip install paddle-ernie==0.0.4.dev1
四-准备数据集
我们使用Weibo-spider爬取了约1w条该明星的粉丝微博,并整理成“话题-正文”的格式。
Ernie-gen要求的格式为"序号\t输入文本\t标签",因此我们按要求处理.xlsx格式的文件,生成数据与验证集。
import pandas as pd
#xlsx数据格式:标签/内容
df = pd.read_excel("train(1).xlsx")
Keys = df["label"].values
Txts = df["text_a"].values
with open("train.txt", "w") as f:
for i, k in enumerate(Keys):
t = Txts[i]
f.write("{}\t{}\t{}\n".format(i, k, t))
df = pd.read_excel("dev.xlsx")
Keys = df["label"].values
Txts = df["text_a"].values
with open("dev.txt", "w") as f:
for i, k in enumerate(Keys):
t = Txts[i]
f.write("{}\t{}\t{}\n".format(i, k, t))
五-Finetune并训练
- train_path(str): 训练集路径。
- dev_path(str): 验证集路径。
- save_dir(str): 模型保存以及验证集预测输出路径。
- max_steps(int): 最大训练步数。
- noise_prob(float): 噪声概率,详见ernie gen论文。
- save_interval(int): 训练时的模型保存间隔部署。验证集将在模型保存完毕后进行预测。
- max_encode_len(int): 最长编码长度。
- max_decode_len(int): 最长解码长度。
import paddlehub as hub
!hub install Versailles
module = hub.Module(name="ernie_gen")
#finetune参考:https://aistudio.baidu.com/aistudio/projectdetail/1456984?channelType=0&channel=0
result = module.finetune(
train_path='train.txt',
dev_path='dev.txt',
save_dir="Versailles_param",
max_steps=1500,
noise_prob=0.1,
save_interval=500,
max_encode_len=200,
max_decode_len=200
)
# 将训练参数打包为hub model
module.export(params_path=result['last_save_path'], module_name="Versailles_8", author="lyp")
六- 运行预测
import paddlehub as hub
module = hub.Module(directory="/home/aistudio/Versailles_8/")
test_texts = ['关键词']
results = module.generate(texts=test_texts, use_gpu=True, beam_width=5)
for result in results:
print(result)
七- 微博回复测试
待补充