环境:

python3.7~9,chatterbot库

语料库:

中文语料库​github.com/brightmart/nlp_chinese_corpus

可以从我的网盘下:

trained_txt: (我训练时踩坑然后去掉每一步遇到的非法json处理后的txt)

https://www.aliyundrive.com/s/GwtwpfH56fj

原始语料库:

https://pan.baidu.com/s/1cOF_uYC1eymOafeG690H4Q?pwd=y79x​pan.baidu.com/s/1cOF_uYC1eymOafeG690H4Q?pwd=y79x

用的是wiki

chatterbot

pip install ChatterBot==1.0.8

chatterbot可以从这里下(如果pip安装失败的话)

ChatterBot-1.0.8 https://www.aliyundrive.com/s/9TnnaGEAiFB

https://pan.baidu.com/s/1aZatb1Lj8bL42Lex62YEzw?pwd=l00d​pan.baidu.com/s/1aZatb1Lj8bL42Lex62YEzw?pwd=l00d

下载完解压,然后在chatterbot-1.0.8根目录执行

# 1 构建
python setup.py build
# 2 安装
python setup.py install

数据预处理

该语料库的单行是这种结构

{"id": "53", "url": "https://zh.wikipedia.org/wiki?curid=53", "title": "经济学", "text": "经济学\n\n经济学是一门对产品和服务的生产、分配以及消费进行研究的社会科学。西方语言中的“经济学”一词源于古希腊的。\n\n经济学注重的是研究经济行为者在一个经济体系下的行为,以及他们彼此之间的互动。在现代,经济学的教材通常将这门领域的研究分为总体经济学和个体经济学。微观经济学检视一个社会里基本层次的行为,包括个体的行为者(例如个人、公司、买家或卖家)以及与市场的互动。而宏观经济学则分析整个经济体和其议题,包括失业、通货膨胀、经济成长、财政和货币政策等。..."}

而chatterbot需要的数据是一问一答的,为了方便,一问一答放在不同行,所以我们需要提取这个json里的title(问)和text(答)

我一开始是想遍历文件夹(AA~AM)然后发现运行到一半报错(而且好像文件太大没办法一次性搞完),因为它的json里面有一些字符没办法解析(也不知道为啥)然后就一个一个文件夹去遍历,遇到错的就去掉那一行继续遍历……

处理逻辑(可以跳过,直接用我上面分享的trained_txt里的文件训练)

# 文件
import os
# 处理json
import json# wiki_zh下所有子目录名称,用于遍历
# AM目录只有74个文件(wiki_73)
# todo 每次训练完一个文件夹,就把该文件夹名从这里去掉
wiki_c_file_name = ['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM']
path = './wiki_zh/'  # 目录路径
for c_dir_name in wiki_c_file_name:# 拼接 -> ./wiki_zh/AAdir_name = os.path.join(path, c_dir_name)# ./wiki_zh/AA/*files = os.listdir(dir_name)# print(files)for filename in files:if os.path.isfile(os.path.join(dir_name, filename)):# 控制当前训练的文件到精确位置# 1,训练# 2,到了异常的地方就复制 id# 3,ctrl shift f -> id# 4,ctrl x 该id对应的那行,黏贴到桌面的txt# 5,修改文件名 train_before_${id}# 6,修改判断条件 int(data['id']) < ${id}# 7,修改判断条件 int(filename[(wiki + 1):]) < id所在文件的编号wiki = filename.find("_")if (c_dir_name != 'AA'):print(filename)break# 跳过 上一次报错的位置 之前的数据 todo 每次报错重新训练要更改if (int(filename[(wiki + 1):]) < 0):print(filename[(wiki + 1):])continuewith open(os.path.join(dir_name, filename), 'r', encoding='utf-8') as f:# 读取所有内容content = f.read()content = content.replace("\n", '')content = content.replace("\\n", '')while content.find('{"id":') != -1:# 从 {"id": 开始,到 "} 结束 start = content.find('{"id":')end = content.find('"}')print(content[start:(end + 2)])# start到end这段(json) -> 转为json对象 -> 字典json_str = content[start:(end + 2)]json_str = json_str.replace('\\n', '')json_str = json_str.replace('\n', '')# 加载、解析json数据data = json.loads(json_str)# 从原来的文本里去掉start到end的这段content = content[(end + 2):]print(data['text'])# 跳过 上次报错的json的id 之前的数据 todo 每次报错重新训练要更改if (int(data['id']) <= 0):continue# 打开文件,如果不存在则创建, 把训练完的数据保存到txt文件# todo 每次报错把创建的文件改名 train_before_AA_错误的json的id# todo 每次训练完一个文件夹下的所有文件,需要把AA改成下一个要训练的文件夹(AB、AC...)with open('train_before_AA_.txt', 'a', encoding='utf-8') as file:file.write(data['title'] + '\n')file.write(data['text'] + '\n')file.close()f.close()

训练(批量)

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
import ospath = './train_txt/'  # 目录路径
files = os.listdir(path) # 该目录下的子目录s
print(files) # xxx.txt
corpus = []  # 加载的语料,一行问,一行答
for filename in files:if os.path.isfile(os.path.join(path, filename)):print(filename)open_file = os.path.join(path, filename)print(open_file)# 导入语料库file = open(open_file, 'r', encoding='utf-8')print('开始加载语料!')while 1:try:line = file.readline()print(line)if not line:breakcorpus.append(line.strip('\n'))except:passfile.close()
print('语料加载完毕')
my_bot = ChatBot("wiki",database_uri='sqlite:///db.sqlite3')
print('Type something to begin...')
trainer = ListTrainer(my_bot)
print('开始训练!')
# trainer.train(corpus[:10000])
trainer.train(corpus)
print('训练完毕!')

如果批量不行,就单个

trained_txt

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainercorpus = []  # 加载的语料,一行问,一行答
# 导入语料库
# todo 训练完改为下一个文件
file = open('train_txt/train_before_53890.txt', 'r', encoding='utf-8')
print('开始加载语料!')
while 1:try:line = file.readline()print(line.strip('\n'))if not line:breakcorpus.append(line.strip('\n'))except:pass
file.close()
print(corpus)
print('语料加载完毕')
# 使用不同语料+同个数据库训练不会覆盖数据库原有数据
my_bot = ChatBot("wiki", database_uri='sqlite:///db.sqlite3')
print('Type something to begin...')
trainer = ListTrainer(my_bot)
print('开始训练!')
# trainer.train(corpus[:10000])
trainer.train(corpus)
print('训练完毕!')# 测试
# text = input("You: ")
# res = my_bot.get_response(text)
# print(res)

使用flask作为服务器提供服务:

from chatterbot import ChatBot
# flask创建http接口
from flask import Flask, request, jsonify
from flask_cors import CORS# 使用训练好保存了的数据
# 初始模型
my_bot = ChatBot("wiki", database_uri='sqlite:///db.sqlite3')
# flask
app = Flask(__name__)
CORS(app, resources=r'/*')  # 注册CORS, "/*" 允许访问所有api# /api/wiki/q
@app.route("/api/wiki/<q>", methods=['get'])
def wiki_answer_path(q):res = str(my_bot.get_response(q))return jsonify({"res": res}), 200# /api/wiki?q=xxx
@app.route("/api/wiki", methods=['get'])
def wiki_answer_query():# 获取路径参数 ?q=xxxq = request.args.get("q")res = str(my_bot.get_response(q))return jsonify({"res": res}), 200if __name__ == "__main__":app.run(host='0.0.0.0', port=8181)

如果报错需要en,可以从这里下载

链接:https://pan.baidu.com/s/1urcaSqBz3nv2K73naGZV9A?pwd=5ino

补:打包...

wiki语料库训练检索式聊天机器人相关推荐

  1. 【聊天机器人】深度学习构建检索式聊天机器人原理

    一.检索式与生成式聊天机器人对比 1.基于检索的chatterbot 2.基于生成的chatterbot 3.聊天机器人的一些思考: (1)基于检索的chatterbot 根据input和contex ...

  2. 史上最通熟易懂的检索式聊天机器人讲解

    喵喵喵,一不小心又匿了三个月,突然诈尸害不害怕( ̄∇ ̄) 小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的超级火呀 ...

  3. 使用Elasticsearch做一个简易的检索式聊天机器人

    Elasticsearch是一个全文搜索引擎,可以快速地储存.搜索和分析海量数据.它是一个开源的搜索引擎,建立在ApacheLuceneTMApache Lucene^{TM}ApacheLucene ...

  4. 基于规则和检索的聊天机器人引擎

    第一篇传送门:<聊天机器人的发展状况与分类>.在上一篇文章中,介绍了聊天机器人目前的发展.本篇主要介绍基于规则的,检索的聊天机器人引擎 - Bot Engine. 问题域 Speech t ...

  5. 中文检索式问答机器人模型

    检索式问答机器人最典型的一个例子就是FAQ客服机器人. 什么是FAQ呢? 简介:在智能客服的业务场景中,对于用户频繁会问到的业务知识类问题的自动解答(以下简称为FAQ)是一个非常关键的需求,可以说是智 ...

  6. 【ChatGPT】如何通过提示工程(Prompt Engineering)训练你的聊天机器人

    文章目录 如何通过提示工程(Prompt Engineering)训练你的聊天机器人.md salesforce 爱因斯坦 gpt 代码开发实例 Prompt Engineering:提示工程解释 好 ...

  7. 基于检索的聊天机器人的实现

    在文章NLP入门实例推荐中提到,对话系统有两种形式: 基于检索的对话系统 模式:s1,s2–>R,即字符串s1和s2符合一定的规则. 基于生成的对话系统 模式:s1–>s2,即由字符串s1 ...

  8. 深度学习-聊天机器人

    1.聊天机器人的类型 从应用目的或者技术手段进行抽象,可以有以下两种划分方法: 目标驱动(Goal –Driven)VS 无目标驱动(Non-Goal Driven)聊天机器人 目标驱动的聊天机器人指 ...

  9. 11步,教你创建深度学习聊天机器人

    全文共4687字,预计学习时长9分钟 创建一款聊天机器人时,目标应该是令其仅需最少的人类干预甚至无需人类干预.这一目标可通过两种方法实现. 第一种方法是,客服团队接收来自人工智能的建议,以改进客户服务 ...

最新文章

  1. 计算机应用基础是高中吗,职业高中学业水平测试计算机应用基础试卷(A)及答案...
  2. Apache Spark 2.0预览: 机器学习模型持久化
  3. 传统网站性能优化的三种手段
  4. AMDF换成ACF和AMDF合作算法
  5. 【原创】大道五目 Flash版 Demo
  6. Windows系统顽固型文件清除方法
  7. mysql sqlite 分页查询_php基于SQLite实现的分页功能示例
  8. oracle over函数 去重,oracle over结合row_number分区进行数据去重处理
  9. browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...
  10. 设计导航网站|图片各种素材管够,资源丰富设计师懂得
  11. 深入剖析Redis事件驱动
  12. 解决图片三像素的问题
  13. CF1109F Sasha and Algorithm of Silence's Sounds LCT、线段树
  14. 2021-10-22 学习笔记:和弦对照信息表
  15. c语言的缺陷与陷阱,C语言 宏陷阱与缺陷
  16. 用组合机床加工铸造模具
  17. 基于SSM的志愿者管理系统
  18. CMM(软件能力成熟度模型)
  19. 自己 总结 一些 学习上 鼓励自己的 话~共勉哟
  20. Adobe_Acrobat_Pro_DC_2022.003.20314 下载安装

热门文章

  1. 如何实现一个脚本语言?
  2. MATLAB-数据类型之复数、字符串
  3. 计算机中的负数的表示
  4. PS图层混合模式MATLAB实现
  5. 《让大脑自由》-- 之释放天赋的12条定律
  6. 原创 | 王欣:多维深耕打造数字化银行
  7. Google Earth Engine(GEE)——可视化动态图
  8. 计算机应用世界排名,全球计算机杂志排名
  9. lululemon最新报告建立全球幸福感基准
  10. LabWindows网络通讯程序例子(UDP)