最近GPT非常火热,于是突发奇想能不能用自己和朋友聊天的数据训练一个对话机器人,不过因为自己第一次做这方面的内容,所以过程可能不是最优的方案
第一步:获取数据集
这里选用的QQ聊天 ,QQ聊天数据有加密。之前看见一篇博客说可以直接在电脑导出txt数据,但鉴于自己的聊天记录在手机上且手机未root,所以这里选择用MUMU模拟器。全过程可以直接参考:安卓QQ聊天记录导出、备份完全攻略 - roadwide - 博客园 (cnblogs.com)。这里写一下我用这个教程导出的过程,供参考。
登入QQ,把聊天记录先全部备份到电脑。再备份到MUMU模拟器的QQ上面。左下角三条横杠打开,选择聊天记录备份与恢复
记得先获取模拟器root权限,网易MuMu怎么开启root权限-百度经验 (baidu.com)
然后在MUMU模拟器上确认聊天记录已全部转移后,点开系统应用--》文件管理器-->/data/data/com.tencent.mobileqq/databases 里面的你的QQ号.db,然后根据大佬的python脚本处理.db文件。
第二步:处理QQ文本
我们获取的文件格式包括QQ号,日期, 时间等等,需要将它拆成一段段的对话以供训练,就自己写了个python代码处理原始文本文件:
#import pandas as pd
from datetime import datetime
path1="xb/data.txt"#处理前原文件地址
path2="xb/dstdata.txt"#处理后中间文件地址
path3="xb/dstdata1.txt"#最终地址
# Open file
fileHandler2= open (path2, "w",encoding='utf-8')
fileHandler2.write("")
fileHandler2.close()
fileHandler = open (path1, "r",encoding='utf-8')
dstfile = open(path2,'a',encoding='utf-8')
# Get list of all lines in file
listOfLines = fileHandler.readlines()
# Close file
fileHandler.close()
lastline=""
name = ""
last_name=""
olddate=""
for i,line in enumerate(listOfLines):
if(listOfLines[i][:5]=='2018-'or listOfLines[i][:5]=='2019-'or listOfLines[i][:5]=='2020-' or listOfLines[i][:5]=='2021-'or listOfLines[i][:5]=='2022-'or listOfLines[i][:5]=='2023-'):
#date = line.split(' ')[-3]
#time = line.split(' ')[-2]
#print(line.split(' ')[-3])
date=datetime.strptime(line.split(' ')[-3]+' '+line.split(' ')[-2],'%Y-%m-%d %H:%M:%S')
name=line.split(' ')[-1]
if listOfLines[i+1]=='':
olddate=date
print("jump")
#last_name=name
continue
if olddate=="":
olddate=date
delta=date-olddate
#print(delta.total_seconds()/3600)
if delta.total_seconds()/3600>=1.5:#聊天间隔超过1.5小时的视为不同对话
olddate=date
text=listOfLines[i+1].replace('\n','')
dstfile.write('\n\n'+text)
last_name=name
continue
if(name==last_name):
flag=1
else:
flag=0
last_name=name
#print(name)
#continue
if(flag==1):
text=listOfLines[i+1].replace('\n','')
dstfile.write(' '+text)
#multiLine+=(' '+line)
else:
text=listOfLines[i+1].replace('\n','')
dstfile.write('\n'+text)
#import pandas as pd
from datetime import datetime
import re
# Open file
fileHandler3= open (path2, "w",encoding='utf-8')
fileHandler3.write("")
fileHandler3.close()
fileHandler = open (path2, "r",encoding='utf-8')#原地址
dstfile = open(path3,'a',encoding='utf-8')#目的地址
# Get list of all lines in file
listOfLines = fileHandler.readlines()
# Close file
fileHandler.close()
lastline=""
name = ""
last_name=""
olddate=""
for i,line in enumerate(listOfLines):
if line.lstrip()=='':
dstfile.write("\n\n")
continue
line2=line.lstrip()
text = re.sub(r"([\u4e00-\u9fa5a-zA-Z0-9])(\s+)([\u4e00-\u9fa5a-zA-Z0-9])",r'\1,\3',line2)
#text=line2.replace(' ',',')
dstfile.write(text)
第三步:训练机器人
这里我们已经有自己的训练数据了,可以直接参考yangjianxin1/GPT2-chitchat: GPT2 for Chinese chitchat/用于中文闲聊的GPT2模型(实现了DialoGPT的MMI思想) (github.com)
我们生成的txt放在里面替换data/train.txt,其他跟着训练流程走就行
注意,我的数据处理没有降噪,可以加上去掉红包,表情,图片,QQ语音等内容提高对话质量,对话聊天数据太少的也可以加上一些其他语料训练。
此外,可能是我的数据质量,训练时间等等不够,机器人主要只记住聊天常说的几句话,虽然勉强能对话但是有肉眼可见的傻