一个不智能的问答系统

知识点

1、准备语料库
相似度:1、正则/规则:适用没有数据
    2、字符串相似

2、文本转为向量:1、one-hot编码
         2、counter vector
         3、Tf-idf
         4、Word2vec
         5、Seq2seq
3、相似度计算:1、欧式距离
         2、余弦公式

1、创建一个类

import numpy as np  # 用于 数组转换
import jieba  # 用于中文分词
from sklearn.metrics.pairwise import cosine_similarity   # 机器学习库,这里用于余弦相似度计算
from flask import Flask  # Web 应用框架

class askSystem():
    def __init__(self, corpus):
        self.corpus = corpus

    # 建立词典
    def creat_dic(self):
        all_question = ""
        for question in self.corpus:
            all_question += question
        word_from_question = list(jieba.cut(all_question))
        dictionaries = word_from_question
        print(dictionaries)
        return dictionaries

    # 问题转换为向量
    def transform_vector(self,date,dictionaries):
        vector_list = []
        for wd in dictionaries:
            if wd in list(jieba.cut(date)):
                vector_list.append(1)
            else:
                vector_list.append(0)
        return np.array(vector_list).reshape(1, -1)

    # 余弦相似度计算
    def cosine_simi(self,date1,date2,dictionaries):
        similar_list = cosine_similarity(self.transform_vector(date1,dictionaries), self.transform_vector(date2,dictionaries))
        similar_num = similar_list[0][0]  #相似度
        return similar_num

    def question_for_web(self, user_question,dictionaries):
        question_dict = {}
        similar_list = []
        for key in self.corpus:
            similar_num = self.cosine_simi(user_question,key,dictionaries)
            similar_list.append(similar_num)
            question_dict[similar_num] = self.corpus[key]  # 相似度若相等,因为字典key值不能重复,会导致匹配答案不准确
        if max(similar_list) == 0:
            answer = "这就问题我再想想!"
        else:
            answer = question_dict[max(similar_list)]
        return answer

2、启动类

from flask import Flask
from flask_cors import CORS
import askSystem
app = Flask(__name__)
CORS(app)  # 解决跨域问题


@app.route('/')
def hello_world():
    return 'Hello World!'


@app.route("/question/<user_question>")
def question_for_web(user_question):
    corpus = {
        "Python课程是线上课程还是线下课程?": "线上课程为主",
        "Python课程有助教吗?": "为提高服务效率和质量,课程都配备专业的全职助教。",
        "我没有基础应该从哪个课开始学?": "大周老师的Python基础集训营非常适合你哦,"
                           "可以在这里学习:http://aijiaoai.greedyai.com/info/5",
        "Python的学习周期是多久?": "如果你没有基础的话两个月可以搞定",
        "Python课程的学习方式是什么呢?": "无需安装环境,在线直接写代码、看视频、看漫画,趣味性学习",
        "Python课程的优势是什么呢?": "全网覆盖最全的Python基础知识体系练与学的深度结合,"
                            "每一个知识点都配有练习项目,生动有趣、授课方式多样,视频、文字、图片、在线代码编辑,"
                            "在聊天与娱乐中学习",
        "Python课程的有效期是多久呢?": "我们把有效期确定为1年,1年内可无限次学习",
        "Python课程有优惠吗?": "我们定价为开课后是599,现在是针对老学员预售199,开课后恢复原价"
    }
    askSys = askSystem.askSystem(corpus)
    answer = askSys.question_for_web(user_question,askSys.creat_dic())
    return answer


if __name__ == '__main__':
    app.run(host='0.0.0.0' ,port=5000)

3、腾讯云部署运行

本人使用pycharm编辑器,所以把整个flask都打包成zip包
然后通过工具上传到腾讯云、unzip xxx.zip进行解压

nohup python app.py >log.file 2>&1 &  #后台运行
ss -tnalp 查看下端口 或者tail -100f log.file 查看启动日

4、部署注意点

本人在部署的时候,只是碰到了在本地调试后,腾讯云无法访问的问题,后面百度了,才解决
即 app.run(host='0.0.0.0' ,port=5000)

 ##########使用word2vec改造##############

1、创建一个word2vector.python文件

import numpy as np  # 用于 数组转换
import jieba  # 用于中文分词
from sklearn.metrics.pairwise import cosine_similarity   # 机器学习库,这里用于余弦相似度计算
import pandas as pd
from gensim import models


class word2vector():
    def __init__(self, corpus):
        self.corpus = corpus

    # 建立词典
    def creat_dic(self):
        all_question = ""
        for question in self.corpus:
            all_question += question
        word_from_question = list(jieba.cut(all_question))
        dictionaries = word_from_question
        print(dictionaries)
        return dictionaries

    # 问题转换为向量---one-hot编码
    def word_to_vector(self, date):
        # 加载模型
        model = models.KeyedVectors.load_word2vec_format('word2vec_779845.bin', binary=True)

        # en_wiki_word2vec_model = Word2Vec.load('wiki.zh.text.model')
        vector_list = []
        words = list(jieba.cut(date))
        temp_list = []
        for word in words:
            try:
                temp = model[word]
            except KeyError:
                print(word+" not in vocabulary")
                continue
            temp_list.append(temp)  # numpy.ndarray
        temp_data = pd.DataFrame(temp_list)
        # print(temp_data.head(5))
        # print(temp_data.mean(axis=0))
        return np.array(temp_data.mean(axis=0)).reshape(1, -1)

    def cosine_simi(self, date1, date2):
        """
        # 余弦相似度计算
        :param date1: 用户输入
        :param date2: 语料句子
        :param dictionaries: 语料字典
        :return:
        """
        similar_list = cosine_similarity(self.word_to_vector(date1), self.word_to_vector(date2))
        similar_num = similar_list[0][0]  #相似度
        return similar_num

    def question_for_web(self, user_question):
        question_dict = {}
        similar_list = []
        for key in self.corpus:
            similar_num = self.cosine_simi(user_question,key)
            similar_list.append(similar_num)
            question_dict[similar_num] = self.corpus[key]  # 相似度若相等,因为字典key值不能重复,会导致匹配答案不准确
        if max(similar_list) == 0:
            answer = "预料不足,这问题你都问,脑子瓦特了吗?"
        else:
            answer = question_dict[max(similar_list)]
        return answer

2、启动文件app.py

from flask import Flask
from flask_cors import CORS
import askSystem
import word2vector
app = Flask(__name__)
CORS(app)  # 解决跨域问题


@app.route('/')
def hello_world():
    return 'Hello World!'


@app.route("/question/<user_question>")
def question_for_web(user_question):
    corpus = {
        "Python课程是线上课程还是线下课程?": "线上课程为主",
        "Python课程有助教吗?": "为提高服务效率和质量,课程都配备专业的全职助教。",
        "我没有基础应该从哪个课开始学?": "大周老师的Python基础集训营非常适合你哦,"
                           "可以在这里学习:http://aijiaoai.greedyai.com/info/5",
        "Python的学习周期是多久?": "如果你没有基础的话两个月可以搞定",
        "Python课程的学习方式是什么呢?": "无需安装环境,在线直接写代码、看视频、看漫画,趣味性学习",
        "Python课程的优势是什么呢?": "全网覆盖最全的Python基础知识体系练与学的深度结合,"
                            "每一个知识点都配有练习项目,生动有趣、授课方式多样,视频、文字、图片、在线代码编辑,"
                            "在聊天与娱乐中学习",
        "Python课程的有效期是多久呢?": "我们把有效期确定为1年,1年内可无限次学习",
        "Python课程有优惠吗?": "我们定价为开课后是599,现在是针对老学员预售199,开课后恢复原价"
    }
    askSys = word2vector.word2vector(corpus)

    #askSys = askSystem.askSystem(corpus)
    answer = askSys.question_for_web(user_question)
    return answer


if __name__ == '__main__':
    app.run()

 3、结果比较

1、你会发现,使用词向量还没有上一个方法准确,且时间也长很多,其实,问答系统一般都使用传统的规则进行,即高效又准确
2、使用词向量的方法,后续可以再优化
3、模型文件

  链接:https://pan.baidu.com/s/1kajkXv2jYpplsEnDrzqE5g
  提取码:2jiu


原文地址:https://www.cnblogs.com/ywjfx/p/12664690.html