尝试在问答系统的基础上采用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
这次的情况
-
- 先写一份方针
-
- 先将作为知识来源的数据临时投入elasticsearch
- 让Python端能够获取相关文件
方針 – Guidelines/Policy/Directive
首先,需要明确的是,“问答”的定义有些模糊。
由于问题的种类不同,难度范围也会很大,
所以这次我们先从最简单的“真假判断问题”开始。
例如对于表示特定事实的句子”德川家康开创了江户幕府”,进行真假判断的工具。
只要符合以下条件,就可以百发百中地得出正确答案:
1. 知识源数据被正确地保存。
2. 能够解释问题。
3. 能够从知识源中检索到正确的信息。
从理论上来说。
暂时将用作知识来源的数据投入到elasticsearch中。
这次我们会创建一些样本数据,然后将其导入到Elasticsearch中。
首先我们尝试了原始文本数据和分词后的结果。
(虽然希望能够以视觉方式查看关键字,但我想后来可能会希望进行句法分析,所以也保留了文本。)
作为数据流,我认为采用以下方式较好:
数据源 → Python → Elasticsearch → Python → 输出。
突入的数据是这样的感觉
虽然这次没有直接相关的事情,但如果用数组保存起来,可以使用图表并且很有趣。
这次我觉得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=(',', ': '))
就真伪鉴定而言,只需分析问题和返回的文档文本,就可以进行判断。暂且就到这里作为准备工作。请期待后续。
总结
我已经开始准备制作问答系统了(虽然可能是准备的准备阶段……)。
我想要一个能够仔细回答问题的孩子,在下一篇文章中。