自然语言处理-应用场景-聊天机器人(二):Seq2Seq【CHAT/闲聊机器人】--> BeamSearch算法预测【替代 “维特比算法” 预测、替代 “贪心算法” 预测】

本文主要是介绍自然语言处理-应用场景-聊天机器人(二):Seq2Seq【CHAT/闲聊机器人】--> BeamSearch算法预测【替代 “维特比算法” 预测、替代 “贪心算法” 预测】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在项目准备阶段我们知道,用户说了一句话后,会判断其意图,如果是想进行闲聊,那么就会调用闲聊模型返回结果。

目前市面上的常见闲聊机器人有微软小冰这种类型的模型,很久之前还有小黄鸡这种体验更差的模型

常见的闲聊模型都是一种seq2seq的结构。

一、准备训练数据

单轮次的聊天数据非常不好获取,所以这里我们从github上使用一些开放的数据集来训练我们的闲聊模型

数据地址:https://github.com/codemayq/chaotbot_corpus_Chinese

主要的数据有两个:

  1. 小黄鸡的聊天语料:噪声很大
    在这里插入图片描述
  2. 微博的标题和评论:质量相对较高
    在这里插入图片描述
    在这里插入图片描述

二、数据的处理和保存

由于数据中存到大量的噪声,可以对其进行基础的处理,然后分别把input和target使用两个文件保存,即input.txt文件中的第N行为“问”,target.txt文件中的第N行为“答”

  • 会把“以单个字分词后的句子”作为特征值、目标值(存放在input_word.txt、target_word.txt),
  • 把“以词语分词后的句子”作为特征值、目标值(存放在input.txt、target.txt)

1、小黄鸡的语料的处理

def format_xiaohuangji_corpus(word=False):"""处理小黄鸡的语料"""if word:corpus_path = "./chatbot/corpus/xiaohuangji50w_nofenci.conv"input_path = "./chatbot/corpus/input_word.txt"output_path = "./chatbot/corpus/output_word.txt"else:corpus_path = "./chatbot/corpus/xiaohuangji50w_nofenci.conv"input_path = "./chatbot/corpus/input.txt"output_path = "./chatbot/corpus/output.txt"f_input = open(input_path,"a")f_output = open(output_path,"a")pair = []for line in tqdm(open(corpus_path),ascii=True):if line.strip() == "E":if not pair:continueelse:assert len(pair) == 2,"长度必须是2"if len(pair[0].strip())>=1 and len(pair[1].strip())>=1:f_input.write(pair[0]+"\n")f_output.write(pair[1]+"\n")pair = []elif line.startswith("M"):line = line[1:]if word:pair.append(" ".join(list(line.strip())))else:pair.append(" ".join(jieba_cut(line.strip())))

详细版:

"""
处理闲聊机器人的语料
"""
import re
from utils import cut
from tqdm import tqdmdef clean_line(line):"""处理句子中的标点符号"""line = re.sub("\^.*?\^","\^***\^",line)line = re.sub("\(.*?\)","\(***\)",line)result = []  #【【】,【】,[word,True,False],[word,True]】temp =""for word in line:if word.isalpha() or word.isdigit():if len(temp)>0:result.append([temp,True])temp = "" #如果temp里面只有一个字符result.append([word,False])else:temp += wordif len(temp) > 0:result.append([temp, True])#把result中第二个位置为True的进行替换if result[0][-1]:result = result[1:]#经过上一步后,有可能为空列表if len(result)>0:if result[-1][-1]:result = result[:-1]+[["。",False]]final_result = []for i in result:if i[-1]: #为标点的情况if "!" in i[0] or "!" in i[0]:final_result.append(["!",False])elif "…" in i[0]:final_result.append(["…", False])else:final_result.append([",",False])else:final_result.append(i)return "".join([i[0] for i in final_result])def clean_group(group):"""清理group中的输出:param group: [q,a]:return: [q,a]/bool"""#判断句子是否为纯标点英文数字,或者是其他的语言--》判断一句话中是否有中文if not re.findall("[\u4e00-\u9fa5]",group[0]):return Falseif not re.findall("[\u4e00-\u9fa5]",group[1]):return False#问题中包含`笑话`两个字的if re.findall("笑话|糗百|运势|运程",group[0]):return False#处理连续的多个标点group[0] = clean_line(group[0])group[1] = clean_line(group[1])#小黄鸡,小通group[0] = re.sub("小通|鸡鸡","小智",group[0]).strip()group[1] = re.sub("小通|鸡鸡","小智",group[1]).strip()#判断句子是否为空if len(group[0])<1 or len(group[1])<1:return Falsereturn groupdef save_group(group,fq,fa,by_word):"""保存问答对"""fq.write(" ".join(cut(group[0],by_word=by_word))+"\n")fa.write(" ".join(cut(group[1],by_word=by_word))+"\n")def process_xiaohuangji(by_word,fq,fa):data_path = "./corpus/classify/小黄鸡未分词.conv"groups = []  #[[q,a],[q,a],[q,a]]group = []bar = tqdm(open(data_path).readlines(),desc="小黄鸡数据读取...")for line in bar:if line.startswith("E"):if group:groups.append(group)group = []elif line.startswith("M"):group.append(line[1:].strip())if group:groups.append(group)for group in tqdm(groups,desc="小黄鸡数据保存..."):  #一个group就是一个问答对group = clean_group(group)if not group:continue# print("q:",group[0])# print("a:",group[1])# print("*"*30)save_group(group,fq,fa,by_word)def start_process(by_word=True):fq = open("./corpus/chatbot/input.txt","a")	# 特征值保存路径fa = open("./corpus/chatbot/target.txt","a") # 目标值保存路径process_xiaohuangji(by_word,fq,fa)if __name__=="__main__":start_process()

2、微博语料的处理

def format_weibo(word=False):"""微博数据存在一些噪声,未处理:return:"""if word:origin_input = "./chatbot/corpus/stc_weibo_train_post"input_path = "./chatbot/corpus/input_word.txt"origin_output = "./chatbot/corpus/stc_weibo_train_response"output_path = "./chatbot/corpus/output_word.txt"else:origin_input = "./chatbot/corpus/stc_weibo_train_post"input_path = "./chatbot/corpus/input.txt"origin_output = "./chatbot/corpus/stc_weibo_train_response"output_path = "./chatbot/corpus/output.txt"f_input = open(input_path,"a")f_output = open(output_path, "a")with open(origin_input) as in_o,open(origin_output) as out_o:for _in,_out in tqdm(zip(in_o,out_o),ascii=True):_in = _in.strip()_out = _out.strip()if _in.endswith(")") or _in.endswith("」") or _in.endswith(")"):_in = re.sub("(.*)|「.*?」|\(.*?\)"," ",_in)_in = re.sub("我在.*?alink|alink|(.*?\d+x\d+.*?)|#|】|【|-+|_+|via.*?:*.*"," ",_in)_in = re.sub("\s+"," ",_in)if len(_in)<1 or len(_out

这篇关于自然语言处理-应用场景-聊天机器人(二):Seq2Seq【CHAT/闲聊机器人】--> BeamSearch算法预测【替代 “维特比算法” 预测、替代 “贪心算法” 预测】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128866

相关文章

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或