赞
踩
最近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语音等内容提高对话质量,对话聊天数据太少的也可以加上一些其他语料训练。
此外,可能是我的数据质量,训练时间等等不够,机器人主要只记住聊天常说的几句话,虽然勉强能对话但是有肉眼可见的傻
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。