打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(一)图灵机器人API2.0接口构造聊天机器人

参考自:

(1)构造聊天机器人

https://www.jianshu.com/p/c3ebd99d6fc4

https://zhuanlan.zhihu.com/p/86681217

(2)Chatbot的前世今生

https://zhuanlan.zhihu.com/p/55201625

基于模板匹配模方法:

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

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

代码1:

  1. from flask import Flask
  2. import requests
  3. app = Flask(__name__)
  4. # 装饰器里面写的是访问路径
  5. @app.route('/')
  6. def hello_world():
  7. url = 'http://openapi.tuling123.com/openapi/api/v2'
  8. data_param = {
  9. 'reqType': 0,
  10. 'perception': {
  11. 'inputText': {
  12. 'text': '附近的酒店'
  13. },
  14. 'inputImage': {
  15. 'url': 'imageUrl'
  16. },
  17. 'selfInfo': {
  18. 'location': {
  19. 'city': '北京',
  20. 'province': '北京',
  21. 'street': '信息路'
  22. }
  23. }
  24. },
  25. 'userInfo': {
  26. #在上面提供的网址中注册登录获取你的机器人apikey,userId可以随便填写
  27. 'apiKey': 'xxxxxxxxxxxxxxxxxxxxxx',
  28. 'userId': 'xxxxxxxxxxxxxxxxxx'
  29. }
  30. }
  31. response = requests.post(url=url,json=data_param)
  32. print(response.text)
  33. return '贪心学院'
  34. if __name__ == '__main__':
  35. app.run()

运行结果:

刷新 http://127.0.0.1:5000/

会得到返回的信息:

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

代码2:

  1. from flask import Flask
  2. app = Flask(__name__)
  3. # 装饰器里面写的是访问路径
  4. @app.route('/greedyai/<data>')
  5. def hello_world(data):
  6. return data
  7. if __name__ == '__main__':
  8. app.run()

运行结果:

代码3:

  1. from flask import Flask
  2. import requests
  3. app = Flask(__name__)
  4. # 装饰器里面写的是访问路径
  5. @app.route('/greedyai/<data>')
  6. def hello_world(data):
  7. if '帅' in data:
  8. return '大周老师'
  9. elif '线上' in data:
  10. return '线上课程为主'
  11. elif '助教' in data or '服务' in data:
  12. return '为提高服务质量,课程配有专业的助教老师'
  13. elif '基础' in data:
  14. return 'http://aijiaoai.greedyai.com/home'
  15. elif '优势' in data:
  16. return '这你都问,大周老师就是优势'
  17. elif '有效期' in data:
  18. return '只要你想学,我一直在你身边'
  19. else:
  20. return '哎哟,小主,我不懂你的意思'
  21. if __name__ == '__main__':
  22. app.run()

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

实例代码4:

  1. from flask import Flask
  2. import requests
  3. app = Flask(__name__)
  4. # 装饰器里面写的是访问路径
  5. @app.route('/chat/<data>')
  6. def hello_world(data):
  7. url = 'http://openapi.tuling123.com/openapi/api/v2'
  8. if '帅' in data:
  9. return '大周老师'
  10. elif '线上' in data:
  11. return '线上课程为主'
  12. elif '助教' in data or '服务' in data:
  13. return '为提高服务质量,课程配有专业的助教老师'
  14. elif '基础' in data:
  15. return 'http://aijiaoai.greedyai.com/home'
  16. elif '优势' in data:
  17. return '这你都问,大周老师就是优势'
  18. elif '有效期' in data:
  19. return '只要你想学,我一直在你身边'
  20. else:
  21. data_param = {
  22. 'reqType': 0,
  23. 'perception': {
  24. 'inputText': {
  25. 'text': 'data'
  26. },
  27. 'inputImage': {
  28. 'url': 'imageUrl'
  29. },
  30. 'selfInfo': {
  31. 'location': {
  32. 'city': '北京',
  33. 'province': '北京',
  34. 'street': '信息路'
  35. }
  36. }
  37. },
  38. 'userInfo': {
  39. 'apiKey': '6cdbed64eeb14e6ea453538622bc1d74',
  40. 'userId': '582149'
  41. }
  42. }
  43. response = requests.post(url=url,json=data_param)
  44. print(response.text)
  45. if __name__ == '__main__':
  46. app.run()

运行结果:

基于搜索的方法

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

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

余弦相似度

课程demo

  1. import jieba
  2. word_vector_list = ['我们', '来', '贪心', '学院', '学习', '人工智能', '和', 'python']# 词典
  3. s1 = '我来贪心学院学习python'
  4. s2 = '我学习人工智能'
  5. s3 = 'Python课程的学习周期是多久'
  6. question = 'Python学习多久'
  7. # 第一种切分模式:精确模式,比较适合做文本分析,['我来', '贪心', '学院', '学习', 'python']
  8. s1_result_list = list(jieba.cut(s1))
  9. print(s1_result_list)
  10. # 全模式,['我来', '贪心', '学院', '学习', 'python']
  11. s1_result_list = list(jieba.cut(s1, cut_all=True))
  12. print(s1_result_list)
  13. # 搜索引擎模式,['我来', '贪心', '学院', '学习', 'python']
  14. s1_result_list = list(jieba.cut_for_search(s1))
  15. print(s1_result_list)
  16. # 向量转换
  17. import numpy as np
  18. def get_vector(data):
  19. vector_list = []
  20. for i in word_vector_list:
  21. if i in list(jieba.cut(data)):
  22. vector_list.append(1)
  23. else:
  24. vector_list.append(0)
  25. print(data)
  26. print(vector_list)
  27. return np.array(vector_list).reshape(1, -1)
  28. question_vector_list = get_vector(question)#输出:Python学习多久[0, 0, 0, 0, 1, 0, 0, 0]
  29. s1_vector_list = get_vector(s1) #输出:我来贪心学院学习python[0, 0, 1, 1, 1, 0, 0, 1]
  30. s2_vector_list = get_vector(s2) #输出:我学习人工智能[0, 0, 0, 0, 1, 1, 0, 0]
  31. s3_vector_list = get_vector(s3) #输出:Python课程的学习周期是多久[0, 0, 0, 0, 1, 0, 0, 0]
  32. # 相似度计算
  33. from sklearn.metrics.pairwise import cosine_similarity
  34. # print(cosine_similarity([[1, 0, 1]], [[0, 0, 1]]))
  35. print(cosine_similarity(question_vector_list, s1_vector_list))
  36. print(cosine_similarity(question_vector_list, s2_vector_list))
  37. print(cosine_similarity(question_vector_list, s3_vector_list))
  38. #输出[[0.5]][[0.70710678]][[1.]]

作业

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

  1. import jieba
  2. import numpy as np
  3. from sklearn.metrics.pairwise import cosine_similarity
  4. from flask import Flask
  5. # 建立语料库
  6. corpus = {
  7. 'Python课程是线上课程还是线下课程?': '线上课程为主',
  8. 'Python课程有助教吗?': '为提高服务效率和质量,课程都配备专业的全职助教。',
  9. '我没有基础应该从哪个课开始学?': '大周老师的Python基础集训营非常适合你哦,'
  10. '可以在这里学习:http://aijiaoai.greedyai.com/info/5',
  11. 'Python的学习周期是多久?': '如果你没有基础的话两个月可以搞定',
  12. 'Python课程的学习方式是什么呢?': '无需安装环境,在线直接写代码、看视频、看漫画,趣味性学习',
  13. 'Python课程的优势是什么呢?': '全网覆盖最全的Python基础知识体系练与学的深度结合,'
  14. '每一个知识点都配有练习项目,生动有趣、授课方式多样,视频、文字、图片、在线代码编辑,'
  15. '在聊天与娱乐中学习',
  16. 'Python课程的有效期是多久呢?': '我们把有效期确定为1年,1年内可无限次学习',
  17. 'Python课程有优惠吗?': '我们定价为开课后是599,现在是针对老学员预售199,开课后恢复原价'
  18. }
  19. # 建立词典,对于所有语料库中的问题进行jieba分词
  20. all_question = ''
  21. for question in corpus:
  22. all_question += question
  23. dictionaries = list(set(jieba.cut(all_question))) # 加上set是为了方便去重
  24. # 单个词典转换为向量
  25. def transform_vector(date):
  26. vector_list = []
  27. for wd in dictionaries:
  28. if wd in list(jieba.cut(date)):
  29. vector_list.append(1)
  30. else:
  31. vector_list.append(0)
  32. return np.array(vector_list).reshape(1, -1) # .reshape(1,-1)是为了后期余弦计算
  33. # 单个余弦相似度计算
  34. def get_cosine(user_question, corpus_question):
  35. similar_list = cosine_similarity(transform_vector(user_question), transform_vector(corpus_question))
  36. similar_num = similar_list[0][0] # 相似度
  37. return similar_num
  38. # 计算语料库中的所有相似度
  39. def get_corpus_consine(user_question):
  40. ori_question_dict = {}
  41. ori_answer_dict = {}
  42. similar_list = [] # 保存所有余弦值
  43. for key in corpus:
  44. similar_num = get_cosine(user_question, key) # 获得余弦值
  45. similar_list.append(similar_num) # 保存所有余弦值
  46. ori_question_dict[similar_num] = key # 获取原问题并储存
  47. ori_answer_dict[similar_num] = corpus[key] # 获取原答案并储存
  48. return similar_list, ori_question_dict, ori_answer_dict
  49. # 得到最佳回答
  50. def get_best_answer(similar_list, ori_question_dict, ori_answer_dict):
  51. max_similar = max(similar_list)
  52. if max_similar == 0: # 没有匹配项
  53. best_similar = 0
  54. best_question = '未检索到相似的问题'
  55. best_answer = '对不起,我听不懂你在说什么'
  56. else: # 返回值
  57. best_similar = max_similar
  58. best_question = ori_question_dict[max_similar]
  59. best_answer = ori_answer_dict[max_similar]
  60. return [best_similar, best_question, best_answer]
  61. # 使用faslk,以接口的形式完成问答
  62. app = Flask(__name__)
  63. @app.route('/<user_question>')
  64. def question_for_web(user_question):
  65. similar_list, ori_question_dict, ori_answer_dict = get_corpus_consine(user_question) # 计算所有相似度
  66. res = get_best_answer(similar_list, ori_question_dict, ori_answer_dict) # 得到最佳答案
  67. html_ = '<html><body>' \
  68. '<p>' \
  69. '<h2>问题:{}</h2>' \
  70. '</p>' \
  71. '<p>' \
  72. '<li>最高相似度:{}</li>' \
  73. '<li>最高相似度的问题:{}</li>' \
  74. '<h2>最佳回答为:{}</h2>' \
  75. '</p>' \
  76. '</body></html>'.format(user_question, res[0], res[1], res[2])
  77. return html_ # 返回html并写入网页
  78. if __name__ == '__main__':
  79. app.run()

运行结果:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python两个列表合并为一个字典
Algorithms,最全的Python算法仓库
python后台Flask 快速入门
CTFWEB-SSTI篇
#PY小贴士# 字典可以通过序号索引来访问?
Python 常用的十行代码,建议收藏
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服