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

相关文章

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理