问答式。
- 爬虫从网上收取相关资料: Python Scrapy
- 根据相似度返回信息: Facebook DrQA
链接:https://www.zhihu.com/question/30789770/answer/116138035
知识库问答要解决的问题是计算机能够利用知识库中的知识对人们输入的自然语言问句给出答案,例如:“奥巴马的夫人是谁?”-
>“米歇尔.拉沃恩.奥巴马”。
具体方法可以参考论文中是如何实现的:
- 目前学术界采用的方法大致可以分成三大类:
基于信息提取(Information Extraction)的方法,这种方法先利用问句信息结合知识库资源获取候选答案,然后再从候选答案中甄别得到最佳答案 Yao Xuchen, Benjamin Van Durme. Information extraction over structured data: Question answering with freebase.
基于语义解析(Semantic Parsing)的方法,该方法关键在于将自然语言问句解析成一种表达问句语义的逻辑形式(Logical Form),再基于这种结构化的表达从知识库中寻找答案 Jonathan Berant, Andrew Chou, Roy Frostig, Percy Liang. Semantic Parsing on Freebase from Question-Answer Pairs;Jonathan Berant, Percy Liang. Semantic parsing via paraphrasing(有开源工具)
基于向量空间建模(Vector Space Modeling)的方法,与前两种方法需要人工设计规则、提取特征不同,这种方法使用向量空间描述自然语言问句以及知识库中的实体和关系,利用收集的问题-答案对进行各向量表征的自动训练,通过比较问句和备选答案在向量空间中的距离实现对于输入问题的回答 Antoine Bordes, Jason Weston, Nicolas Usunier. Open question answering with weakly su-pervised embedding models
- 也可以按照输入问题的复杂度分成:
- 简单问句:这种问题只需要一个三元组就能搞定,比较基础的通过LR的方法: Antoine Bordes, Jason Weston, Nicolas Usunier. Open question answering with weakly su-pervised embedding models;或者结合CNN、RNN神经网络的方法:Character-Level Question Answering with Attention
- 复杂问句:需要多个三元组,有时需要进一步的推理或者做一些计算。回答这类问题目前采用上面基于语义解析一类的方法效果较好。贴个微软目前比较新的工作 Wen-tau Yih, Ming-Wei Chang, Xiaodong He, and Jianfeng Gao. 2015. Semantic parsing via staged query graph generation: Question answering with knowledge base.
以上的论文中的系统均利用Freebase知识库来回答问题。
DrQA
pipenv shell
tmux attach -t 0
exit (quit pipenv shell)
Setup
- download the project via
git clone https://github.com/hitvoice/DrQA.git; cd DrQA
- make sure python 3, pip, wget and unzip are installed.
- install pytorch matched with your OS, python and cuda versions.
- install the remaining requirements via
pip install -r requirements.txt
- download the SQuAD datafile, GloVe word vectors and Spacy English language models using
bash download.sh
.
Train
# prepare the data
python prepro.py
# train for 40 epochs with batchsize 32
python train.py -e 40 -bs 32
Predict
python interact.py
gensim
1.介绍
gensim是一个免费python库,设计目的是,从文档中有效地自动抽取语义主题。
gensim可以处理原始的,非结构化的文本(”plain text”)。gensim中的算法,包括:LSA(Latent Semantic Analysis), LDA(Latent Dirichlet Allocation), RP (Random Projections), 通过在一个训练文档语料库中,检查词汇统计联合出现模式, 可以用来发掘文档语义结构. 这些算法属于非监督学习,这意味着无需人工输入--你只需提供一个语料库即可。
2.特性
- 内存独立- 对于训练语料来说,没必要在任何时间将整个语料都驻留在RAM中
- 有效实现了许多流行的向量空间算法-包括tf-idf,分布式LSA, 分布式LDA 以及 RP;并且很容易添加新算法
- 对流行的数据格式进行了IO封装和转换
- 在其语义表达中,可以相似查询
gensim的创建的目的是,由于缺乏简单的(java很复杂)实现主题建模的可扩展软件框架. 。。。
gensim的设计原则:
- [1].简单的接口,学习曲线低。对于原型实现很方便
- [2].根据输入的语料的size来说,内存各自独立;基于流的算法操作,一次访问一个文档.
更多:document similarity server.相似服务器相关文档.
3.核心概念
gensim的整个package会涉及三个概念:corpus, vector, model.
3.1 语库(corpus)
文档集合.该集合用来自动推出文档结构,以及它们的主题等。出于这个原因,这个集合被称为:训练语料。后续为在新的文档分配主题时会使用的隐含语义结构(inferred latent structure),它将不会出现在训练语料中。无需人工干预(比如对文档进行手工打标签,或者创建其它数据元等)。
3.2 向量(vector)
在向量空间模型(VSM)中,每个文档被表示成一个特征数组。例如,一个单一特征可以被表示成一个问答对(question-answer pair):
- [1].在文档中单词”splonge”出现的次数? 0个
- [2].文档中包含了多少句子? 2个
- [3].文档中使用了多少字体? 5种
这里的问题可以表示成整型id (比如:1,2,3等), 因此,上面的文档可以表示成:(1, 0.0), (2, 2.0), (3, 5.0). 如果我们事先知道所有的问题,我们可以显式地写成这样:(0.0, 2.0, 5.0). 这个answer序列可以认为是一个多维矩阵(3维). 对于实际目的,只有question对应的answer是一个实数.
对于每个文档来说,answer是类似的. 因而,对于两个向量来说(分别表示两个文档),我们希望可以下类似的结论:“如果两个向量中的实数是相似的,那么,原始的文档也可以认为是相似的”。当然,这样的结论依赖于我们如何去选取我们的question。
3.3 稀疏矩阵(Sparse vector)
通常,大多数answer的值都是0.0. 为了节省空间,我们需要从文档表示中忽略它们,只需要写:(2, 2.0), (3, 5.0) 即可(注意:这里忽略了(1, 0.0)). 由于所有的问题集事先都知道,那么在稀疏矩阵的文档表示中所有缺失的特性可以认为都是0.0.
gensim的特别之处在于,它没有限定任何特定的语料格式;语料可以是任何格式,当迭代时,通过稀疏矩阵来完成即可。例如,集合 ([(2, 2.0), (3, 5.0)], ([0, -1.0], [3, -1.0])) 是一个包含两个文档的语料,每个都有两个非零的pair。
3.4 模型(model)
对于我们来说,一个模型就是一个变换(transformation),将一种文档表示转换成另一种。初始和目标表示都是向量--它们只在question和answer之间有区别。这个变换可以通过训练的语料进行自动学习,无需人工监督,最终的文档表示将更加紧凑和有用;相似的文档具有相似的表示。