自然语言处理-应用场景-聊天机器人(二):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

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别