尝试在问答系统的基础上采用Elasticsearch

此文是 Elastic Stack Advent Calendar 2016 的第24篇文章。

我自己的介绍

    • Acroquest Technology という会社でエンジニアをしています。

 

    学生時代は自然言語処理や情報検索などをしていました。

总结

我想基于Elasticsearch构建一个问答系统。

    • 日本語で書かれた質問に対して勝手に答えを吐き出すようなもの。

 

    • 知識源になり得るソースは世の中にいくらでもある。可能なら柔軟に選択できて、なおかつ情報が常にアップデートされてくのが理想。

 

    • 知識源が膨大になったときに、スケールしやすいElasticsearchは良いかもしれないと思ってます。(もちろん個人で大きいクラスタ組んでやる気合いはありませんが)

 

    • 複数記事に分けて書きます。

 

    →今回の記事では下準備として色々試してみたことなどを書きます。

环境

    • mac OS Sierra 10.12.2

 

    • elasticsearch-5.1.1

 

    • kibana-5.1.1

 

    • python-3.5.2

 

    mecab 0.996

这次的情况

    1. 先写一份方针

 

    1. 先将作为知识来源的数据临时投入elasticsearch

 

    让Python端能够获取相关文件

方針 – Guidelines/Policy/Directive

首先,需要明确的是,“问答”的定义有些模糊。
由于问题的种类不同,难度范围也会很大,
所以这次我们先从最简单的“真假判断问题”开始。

例如对于表示特定事实的句子”德川家康开创了江户幕府”,进行真假判断的工具。

只要符合以下条件,就可以百发百中地得出正确答案:
1. 知识源数据被正确地保存。
2. 能够解释问题。
3. 能够从知识源中检索到正确的信息。

从理论上来说。

暂时将用作知识来源的数据投入到elasticsearch中。

这次我们会创建一些样本数据,然后将其导入到Elasticsearch中。
首先我们尝试了原始文本数据和分词后的结果。
(虽然希望能够以视觉方式查看关键字,但我想后来可能会希望进行句法分析,所以也保留了文本。)

作为数据流,我认为采用以下方式较好:
数据源 → Python → Elasticsearch → Python → 输出。

突入的数据是这样的感觉

スクリーンショット 2016-12-24 19.25.41.png

虽然这次没有直接相关的事情,但如果用数组保存起来,可以使用图表并且很有趣。

スクリーンショット 2016-12-24 21.08.13.png

这次我觉得Graph没有意义,但其实相当重要…
从这个Graph可以一眼看出「19」和「世纪」是分开的,以及抽取出了神秘的单词「化」(这是什么玩意儿啊…)
虽然处理没有错,但是最好「○○世纪」能作为一个整体。
似乎需要改进分词的方法。
我会另外检查词典。

暂时先通过Python端确认可以使用任意关键词进行搜索。

from elasticsearch import Elasticsearch
import json

es = Elasticsearch(['http://USER:PASSWORD@localhost:9200'])


request_body="{\"size\":10,\"query\":{\"term\":{\"words.keyword\":\"日本\"}}}"

output = open("search_result.json","w")
json.dump(es.search(index="test",body=request_body),output, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))
スクリーンショット 2016-12-24 21.51.06.png

就真伪鉴定而言,只需分析问题和返回的文档文本,就可以进行判断。暂且就到这里作为准备工作。请期待后续。

总结

我已经开始准备制作问答系统了(虽然可能是准备的准备阶段……)。

我想要一个能够仔细回答问题的孩子,在下一篇文章中。

广告
将在 10 秒后关闭
bannerAds