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

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用