Elasticsearch是一个全文搜索引擎,可以快速地储存、搜索和分析海量数据。它是一个开源的搜索引擎,建立在ApacheLuceneTMApache Lucene^{TM}ApacheLuceneTM基础之上。ElasticSearch不仅仅是一个简易的Lucene封装,它可以被形容为:

  • 具有分布式实时文档存储,每个字段可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持PB级别的结构化或者非结构化数据

关于Elasticsearch就不做过多的介绍了,下面开始做聊天机器人。
首先是Elasticsearch的安装,可以参考这篇文章:【ElasticSearch】win10 安装elasticSearch 6.6.1,另外我们还需要安装elasticsearch-analysis-ik用于中文分词。
然后接下来我们需要了解一下Elasticsearch的基本用法,当然我这里采用的是Python版本,它的基本使用可以参考这篇文章:Elasticsearch 基本介绍及其与 Python 的对接实现或者是参考官方API文档。
接下来是要准备语料了,我们可以使用小黄鸡的语料,链接为:用于对话系统的中英文语料。这个链接里还有其他的语料,需要的可以自取。
我将语料整理为csv格式,数据包含两列,一列为question,一列为answer,大致如下:

question,answer
呵呵,是王若猫的。
"我还喜欢她,怎么办",我帮你告诉她?发短信还是打电话?
短信,嗯嗯。我也相信
你知道谁么,肯定不是我,是阮德培
许兵是谁,吴院四班小帅哥

然后调用如下代码,将数据插入Elasticsearch。

class ESUtils(object):def __init__(self, index_name, create_index=False):self.es = Elasticsearch()self.index = index_nameif create_index:mapping = {'properties': {'question': {'type': 'text','analyzer': 'ik_max_word','search_analyzer': 'ik_smart'}}}# 创建indexif self.es.indices.exists(index=self.index):self.es.indices.delete(index=self.index)self.es.indices.create(index=self.index)# 创建mappingself.es.indices.put_mapping(body=mapping, index=self.index)def insert_qa_pairs(self, qa_pairs, data_source):count = self.es.count(index=self.index)['count']  # 获取当前数据库中的已有document数量def gen_data():for i, qa in enumerate(qa_pairs):yield {'_index': self.index,'_id': i + count,'data_source': data_source,'question': qa[0],'answer': qa[1]}bulk(self.es, gen_data())

上述代码第一次调用需要创建index,则__init__方法的create_index参数要为True。之后调用insert_qa_pairs方法插入数据。这里的qa_pairs可以通过以下代码读取之前整理好的csv文件得到。

def get_qa_pairs(csv_path):qa_pairs = pd.read_csv(csv_path)qa_pairs = list(zip(qa_pairs['question'], qa_pairs['answer']))
return qa_pairs

经过上述步骤,我们就准备好了聊天数据了(需要注意的是,这里都是单轮对话数据,多轮对话功能还在进一步开发中)。
接着,使用下面的代码我们就可以愉快的开始聊天了。

import sys
from elasticsearch import Elasticsearchclass ESChat(object):def __init__(self, ip, port, index_name):self.es = Elasticsearch(hosts=[ip], port=port)self.index = index_namedef search(self, input_str):"""Args:input_str: 用户问句Returns: 由匹配的question、answer和其分数score构成的字典的列表"""dsl = {"query": {"match": {"question": input_str}}}hits = self.es.search(index=self.index, body=dsl)["hits"]["hits"]qa_pairs = []for h in hits:qa_pairs.append({'score': h['_score'], 'question': h['_source']['question'], 'answer': h['_source']['answer']})return qa_pairsdef chat(self):"""聊天方法,在系统输出'> '后输入句子,得到系统回复,输入exit结束聊天。"""sys.stdout.write("> ")sys.stdout.flush()sentence = sys.stdin.readline().strip()while sentence:if sentence == 'exit':breakprint(self.search(sentence)[0]['answer'])print("> ", end='')sys.stdout.flush()sentence = sys.stdin.readline().strip()if __name__ == '__main__':es_chat = ESChat(ip='localhost', port=9200, index_name='qa')es_chat.chat()

聊天效果截图如下:

好吧,聊天体验看来并不愉快。总结原因,一个是搜集的语料可能有问题或者是我整理的过程出错了,还有一个主要的原因是这里没有结合语义等信息,只是单纯的检索匹配。
虽然效果不理想,但不失为一个制作聊天机器人的尝试,对于这个检索式机器人我的下一步优化方案大致是:

  • 清理语料,提升语料质量
  • 结合语义信息
  • 完善搜索匹配方式

使用Elasticsearch做一个简易的检索式聊天机器人相关推荐

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

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

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

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

  3. 怎么做一个微信自动回复的智能聊天机器人?

    微信自动回复机器人的操作很简单,只需要完成30行代码,就可以让机器人实现查天气.查星座运势.智能回复.关键词回复等功能. 下面我们看个例子: 在程序设定时通过itchat获取微信信息,将微信消息传输到 ...

  4. wiki语料库训练检索式聊天机器人

    环境: python3.7~9,chatterbot库 语料库: 中文语料库​github.com/brightmart/nlp_chinese_corpus 可以从我的网盘下: trained_tx ...

  5. 怎么用线程刷新 tkinter 进度条_tkinter做一个简易提词板(2)

    书接上文 花果山美男子:tkinter做一个简易提词板​zhuanlan.zhihu.com 上回说到,文字的动态效果还可以用after方法和StringVar来实现,今天我们就用它们来重新制作提词板 ...

  6. 使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能

    使用vue-cli+element-ui+expsess+mysql做一个简易的登录功能 1使用webpack下载vue模板 vue init webpack aaa(aaa为项目名称) cd到aaa ...

  7. 用JS做一个简易的时间显示动态效果

    用JS做一个简易的时间显示动态效果 运行效果 代码 <!DOCTYPE html> <html lang="en"><head><meta ...

  8. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)

    Python做一个简易登录注册GUI界面 一,效果展示 (1)运行结果: (2)点击登录: 注:只有用户名:123 密码123456 会提示登录成功. 登录成功示范: 登录失败示范: (3)点击注册 ...

  9. 第三章:做一个简易登陆界面

    一.内容 做一个简易的登陆界面,包含: 1.有账号输入和密码输入 2.有登陆和取消按钮 3.密码要带有屏蔽功能 4.通过取消按钮讲一点槽函数的运用 二.创建工程(初次做这个小例程,附带上建工程的步骤) ...

最新文章

  1. 操作系统CnetOS_7—systemd管理实践指南
  2. ARMV7,ARMV8
  3. Java静态代理、动态代理与CGLib代理
  4. Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式
  5. Web Service实现分布式服务的基本原理
  6. Mr.J-- jQuery学习笔记(三)--静态方法详解
  7. Flink + Iceberg,百亿级实时数据入湖实战
  8. 为什么土豆网王微会放弃自己原有的立场,跟优酷合并 合并后有何影响
  9. 了不起的GIS:GIS相关软件、框架、代码、资源等的合集
  10. VMware Horizon view 7 云桌面终端安全解决方案
  11. 那些精贵的文献资源下载网址经验总结
  12. 车靓靓·微水上门洗车项目介绍
  13. 外显子分析思路总结(Exome Sequencing Analysis review)
  14. 分享一组超喜欢的粉色樱花高清壁纸~
  15. 在网站上的视频直播添加弹幕做法
  16. PS2018学习笔记(19-24节)
  17. 纽约大学工程学院计算机工程硕士,纽约大学New York University (NYU) MS Computer Engineering 计算机工程硕士...
  18. AV1代码学习:av1_foreach_transformed_block_in_plane函数
  19. 利率下行期 财该怎么理
  20. 测试学习12(测试分类及测试方法)

热门文章

  1. 线性回归——正规方程推导过程
  2. Facial expression recognition method with multi-label distribution learning for non-verbal behavior
  3. emmc驱动修改_eMMC驱动分析
  4. 多文件以压缩包形式下载
  5. google trend不错
  6. signature=29c2d7f30321e08413c374e6d87fb171,来用百度密语吧!!!
  7. 怎样做需求调研:需求研讨
  8. oracle 触发器定时任务,ORACLE触发器,定时器。
  9. Origin使用技巧(5),Origin科研绘图软件2021中文版下载安装
  10. BA3121 地隔离放大器国产|PIN-TOP-PIN兼容替代