贪心学院 Demo5 - AI聊天机器人

导读:
demo内容来源网课贪心科技AI学社的网课《人工智能Python编程特训营》
本篇博客的主要内容是做一个聊天机器人。

课件

这里先附上课件,可以收藏一下


课堂代码

制作属于自己的聊天机器人

图灵机器人http://www.turingapi.com/

API接口教程https://www.kancloud.cn/turing/www-tuling123-com/718227

第三方机器人简易接口调用

这里用的是flask框架,调用方法很简单,只需要在装饰器里面写路径就可以了。

from flask import Flask
import requests

app = Flask(__name__)


# 装饰器里面写的是访问路径
@app.route("/")
def hello_world():
    url = "http://openapi.tuling123.com/openapi/api/v2"
    data_param = {
        "reqType": 0,
        "perception": {
            "inputText": {
                "text": "附近的酒店"
            },
            "inputImage": {
                "url": "imageUrl"
            },
            "selfInfo": {
                "location": {
                    "city": "北京",
                    "province": "北京",
                    "street": "信息路"
                }
            }
        },
        "userInfo": {
            "apiKey": "xxxxxxxxxxxxxxxxxxxxxx",
            "userId": "xxxxxxxxxxxxxxxxxx"
        }
    }
    response = requests.post(url=url,json=data_param)
    print(response.text)
    return "贪心学院"


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

刷新 http://127.0.0.1:5000/

会得到返回的信息

{"intent":{"code":4003},"results":[{"groupType":0,"resultType":"text","values":{"text":"在外住酒店,还是得小心点好哦~"}}]}

当前需要填上自己的apiKey和userId,而且还得去申请权限,否则会出现

{"intent":{"code":4003},"results":[{"groupType":0,"resultType":"text","values":{"text":"请求次数超限制!"}}]}

我们换一种玩法

from flask import Flask

app = Flask(__name__)

# 装饰器里面写的是访问路径
@app.route("/greedyai/<data>")
def hello_world(data):
    return data

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

这时候运行后
http://127.0.0.1:5000/greedyai/
在这个路径之后输入你想要显示的字符串,就会显示出来

比如说http://127.0.0.1:5000/greedyai/你是谁就会在屏幕上输出你是谁的字样。

具体开发方法,基于模板匹配

from flask import Flask
import requests

app = Flask(__name__)


# 装饰器里面写的是访问路径
@app.route("/greedyai/<data>")
def hello_world(data):
    if "帅" in data:
        return "大周老师"
    elif "线上" in data:
        return "线上课程为主"
    elif "助教" in data or "服务" in data:
        return "为提高服务质量,课程配有专业的助教老师"
    elif "基础" in data:
        return "http://aijiaoai.greedyai.com/home"
    elif "优势" in data:
        return "这你都问,大周老师就是优势"
    elif "有效期" in data:
        return "只要你想学,我一直在你身边"
    else:
        return "哎哟,小主,我不懂你的意思"

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

然后跟上面的示例一样,在路径之后输入一句话,如果这一句话里面包含了某个关键词,那么就会输出相应的回复
这是部分输入的回复

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [02/Oct/2019 14:34:18] "GET /greedyai/有啥服务 HTTP/1.1" 200 -
127.0.0.1 - - [02/Oct/2019 14:40:17] "GET /greedyai/哈哈哈 HTTP/1.1" 200 -
127.0.0.1 - - [02/Oct/2019 14:40:31] "GET /greedyai/线上课程 HTTP/1.1" 200 -

基于搜索的方法

用户输入 -> 检索模型 -> 输入

如何计算相似度(文本的向量表示)

余弦相似度

课程demo

import jieba

# 词典
word_vector_list = ["我们", "来", "贪心", "学院", "学习", "人工智能", "和", "python"]
s1 = "我来贪心学院学习python"
s2 = "我学习人工智能"
s3 = "Python课程的学习周期是多久"
question = "Python学习多久"

# 第一种切分模式:精确模式,比较适合做文本分析
s1_result_list = list(jieba.cut(s1))
print(s1_result_list)

# 全模式
s1_result_list = list(jieba.cut(s1, cut_all=True))
print(s1_result_list)

# 搜索引擎模式
s1_result_list = list(jieba.cut_for_search(s1))
print(s1_result_list)

# 向量转换
import numpy as np


def get_vector(data):
    vector_list = []
    for i in word_vector_list:
        if i in list(jieba.cut(data)):
            vector_list.append(1)
        else:
            vector_list.append(0)
    print(data)
    print(vector_list)
    return np.array(vector_list).reshape(1, -1)


question_vector_list = get_vector(question)
s1_vector_list = get_vector(s1)
s2_vector_list = get_vector(s2)
s3_vector_list = get_vector(s3)

# 相似度计算
from sklearn.metrics.pairwise import cosine_similarity

# print(cosine_similarity([[1, 0, 1]], [[0, 0, 1]]))

print(cosine_similarity(question_vector_list, s1_vector_list))
print(cosine_similarity(question_vector_list, s2_vector_list))
print(cosine_similarity(question_vector_list, s3_vector_list))

作业

完成一个完整的项目,能够根据已有的语料库,自动根据输入去计算哪个答案最符合

import jieba
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from flask import Flask

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


# 单个词典转换为向量
def transform_vector(date):
    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)  # .reshape(1,-1)是为了后期余弦计算


# 单个余弦相似度计算
def get_cosine(user_question, corpus_question):
    similar_list = cosine_similarity(transform_vector(user_question), transform_vector(corpus_question))
    similar_num = similar_list[0][0]  # 相似度
    return similar_num


# 计算语料库中的所有相似度
def get_corpus_consine(user_question):
    ori_question_dict = {}
    ori_answer_dict = {}
    similar_list = []  # 保存所有余弦值
    for key in corpus:
        similar_num = get_cosine(user_question, key)  # 获得余弦值
        similar_list.append(similar_num)  # 保存所有余弦值
        ori_question_dict[similar_num] = key  # 获取原问题并储存
        ori_answer_dict[similar_num] = corpus[key]  # 获取原答案并储存
    return similar_list, ori_question_dict, ori_answer_dict


# 得到最佳回答
def get_best_answer(similar_list, ori_question_dict, ori_answer_dict):
    max_similar = max(similar_list)
    if max_similar == 0: # 没有匹配项
        best_similar = 0
        best_question = "未检索到相似的问题"
        best_answer = "对不起,我听不懂你在说什么"
    else: # 返回值
        best_similar = max_similar
        best_question = ori_question_dict[max_similar]
        best_answer = ori_answer_dict[max_similar]
    return [best_similar, best_question, best_answer]


# 使用faslk,以接口的形式完成问答
app = Flask(__name__)


@app.route("/<user_question>")
def question_for_web(user_question):
    similar_list, ori_question_dict, ori_answer_dict = get_corpus_consine(user_question)  # 计算所有相似度
    res = get_best_answer(similar_list, ori_question_dict, ori_answer_dict)  # 得到最佳答案

    html_ = '<html><body>' \
            '<p>' \
            '<h2>问题:{}</h2>' \
            '</p>' \
            '<p>' \
            '<li>最高相似度:{}</li>' \
            '<li>最高相似度的问题:{}</li>' \
            '<h2>最佳回答为:{}</h2>' \
            '</p>' \
            '</body></html>'.format(user_question, res[0], res[1], res[2])
    return html_  # 返回html并写入网页


if __name__ == "__main__":
    app.run()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容