Giter Club home page Giter Club logo

pt_chatbot's Introduction

一个姑且算是聊天机器人的教程放了一些比较琐碎不适合放在README里的内容。

Requirements

  • python 3.7.4
  • PyTorch 1.2.0
  • jieba 0.42.1
  • flask 1.1.1
  • gensim 3.8.0
  • annoy 1.16.3
  • scikit-learn 0.21.3

数据相关

训练语料

声明: 由于版权问题,暂时不方便提供我使用的语料,大家可以使用自己收集的语料,建议可尝试使用小黄鸡的语料。

格式:
问题\t回答 (一个pair占一行,句子均已用jieba分词

例子:
出 任务 又 受伤 了 ? 不 碍事 的 , 只是 小伤 罢了 。
新年快乐 新年快乐 , 这 不是 祝福 , 是 承诺 。
你 通宵 了 ? 昨晚 在 出 任务 。 抱歉 , 让 你 担心 了 。

数据量参考:
对话19000+(偏少),词汇4000+,训练次数20000

存放路径:
使用config.py的变量dialogFile指定对话存放路径

预训练词向量

推荐使用fastText使用维基百科训练的词向量,下载地址

运行方法

生成模型

生成模型参考了pytorch的chatbot教程,主要是seq2seq模型+attention。

训练模型

  1. 运行generate_voc_pairs.py生成词汇表和问答pairs
  2. 运行preprocess_emb.py预处理预训练的词向量(如果不需要预训练词向量可跳过此步骤,config.py中设置embeddingFileNone即可)
  3. config.py文件中配置相关参数(参考config_example.py
  • 设置mode="train"
  • 首次训练设置loadFilename=None,如果是接着训练则设置checkpoint_iter为上次训练的次数,并设置loadFilename为存档地址
  1. 运行train.py训练模型,训练完后可与机器人对话,输入quit结束

测试模型

  1. config.py文件中配置相关参数
  • 设置mode="evaluate"
  • 设置checkpoint_iter为上次训练的次数,并设置loadFilename为存档地址
  1. 运行train.py训练模型,可与机器人对话,输入quit结束

检索模型

检索模型主要就是将句子表示成向量后,搜索最近邻(KNN)。实现的三个不同的模型主要在速度和准确性上稍有区别。

  1. 运行compute_sent_emb.py完成检索模型所需要的准备工作:
    gensim加载fastText词向量后得到的模型存储在路径fastTextGensim下,具体参考这里
    计算知识库中所有句子的句向量保存sentEmbFile
    创建annoy index备查
    创建ball tree对象备查
  2. config.py中的retrieve_mode支持brute_force, annoyball_tree三种方式,设置需要的检索模型后运行retrieval.py。其中brute force速度比较慢,但是准确性有保证,annoy速度最快,数据量级上去了也没问题,但是结果可能比brute force稍差,不过我目测了基本差不多。
  3. 运行retrieval.py,可与机器人对话,输入quit结束

混合模型

混合模型综合了生成模型和检索模型的结果,当检索模型召回的answer与用户输入的query相似度不满足阈值条件则进一步调用生成模型返回结果。前两个模型都跑通的话可以用如下方法运行混合模型:

  1. 运行hybrid_model.py,可与机器人对话,输入quit结束

网页版本

  1. 网页版目前接的是生成模型+annoy检索,运行app.py,服务器启动后会输出服务器地址,如http://127.0.0.1:5000/
  2. 在浏览器中输入地址,和机器人对话

训练效果

混合模型

bot的训练语料全是谈情说爱性质的,这方面的回答就比较好,而比较新的话题例如金融危机、covid-19等则会容易文不对题。

网页版本

网页版效果如图所示

未来工作

  1. 部署上线(么得机器哈哈哈)。
  2. 增加调教功能以用于收集更多语料(因为暂时没法上线,这功能做了也没用啊,没人调教)。

参考

http://fancyerii.github.io/2019/02/14/chatbot/
https://github.com/llSourcell/tensorflow_chatbot

改进

  1. 添加用来打底的检索模型
  2. 支持对话中出现单词表中不包含的单词
  3. 支持载入预训练的词向量
  4. 支持中文会话
  5. 更改loss function
  6. 支持GUI

扩展

用相同的语料微调了中文GPT模型,虽然数据不能分享,但是模型可以分享啊!build成docker image了,戳这里来一场甜甜的恋爱吧(^o^)/~肉眼看一下这个GPT模型还是比之前的seq2seq+attn的模型效果要好很多。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.