在上一篇博客中,我们已经大概了解了KBQA的概念,也大概知道KBQA的流程,但是针对上篇博客提出的问题,修改数据,如何更简单的做到而对问答系统的影响效果最小呢?这里我就换成另一种方式,直接使用ElasticSearch来替换TDB存放数据。下图是与上文实现一样效果的demo:
1. ElasticSearch
Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎Apache Lucene™ 基础上的搜索引擎。但是Elasticsearch并不仅仅是Lucene那么简单,它不仅包括了全文搜索功能,还可以进行下面的工作:
1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
2.实时分析的分布式搜索引擎。
3.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
ElasticSearch安装使用比较简单,可以根据官方文档Elasticsearch Reference自己安装与学习。
这里重点需要提出的是,ElasticSearch 中处理分词的部分被称作分词器,它决定了分词的规则,默认是Standard,即将中文分为单个的字,如“我爱北京天安门“就会被分为“我/爱/北/京/天/安/门”,明显不符合我们的要求“我/爱/北京/天安门”,所以这个时候就需要我们自己制定分词器,实现分词规则,最常见的为ik分词器。
根据不同的功能,可能大家需要不同的ElasticSearch插件,大家可以在ES官网下载,但必须注意的是,插件需要与ElasticSearch版本对应,否则无法使用。如果有哪些看官不知道如何使用ES,稍后我会在后面的继续贴上博客。
2. 实例分析
- 数据准备
数据我们依然使用上一篇博客的数据,这里需要注意的是,将数据插入到ElasticSearch的时候,必须指定分词器和分词方式,否则功能无法实现。如何使用ElasticSearch,后续我会慢慢写出来。这里我主要分为四个字段插入:name(诗词名)、author(作者)、dynasty(朝代)、content(内容),分词分别为:ik_smart、ik_max_word、ik_smart、ik_smart。数据插入完成后,可以使用head插件查看,如下图所示:
- 数据查询
数据插入完成后,我们就可以直接查询数据库了,ElasticSearch使用的是相似度查询,所以很大程度上减轻了我们的搜索任务,我们可以通过head插件直接在浏览器上进行搜索,十分方便,如下图所示:
from elasticsearch import Elasticsearch
values = []
es = Elasticsearch(hosts=['192.168.1.118'], timeout=50000) # 数据库IP