【人工智能系列】python的Quepy库的学习
第一篇 了解
什么是Quepy
quepy是一个Python框架改造自然语言问题在数据库查询语言查询。它可以很容易地定制不同类型的问题,在自然语言和数据库查询。因此,用很少的代码,你可以建立自己的系统,自然语言访问您的数据库。
目前quepy 支持SPARQL言和MQL数据库查询语言。我们计划将它扩展到其他数据库查询语言。
说明:
你需要安装docopt和NumPy。除此之外,您可以只键入:
pip install quepy
你可以在这里得到更多的安装细节:
http://quepy.readthedocs.org/en/latest/installation.html
了解更多,你可以在这里找到教程:
http://quepy.readthedocs.org/en/latest/tutorial.html
这里有完整的文档:
第二篇 学习
一个例子
为了说明你可以做什么与quepy,我们包括一个示例应用程序通过他们的sparql端点访问DBpedia内容。
或者,您可以通过以下方式尝试此示例:
python examples/dbpedia/main.py "Who is Tom Cruise?" 它会输出这样的东西:
SELECT DISTINCT?x1 WHERE {
?x0 rdf:type foaf:Person。
?x0 rdfs:label“Tom Cruise”@en。
?x0 rdfs:comment?x1。
}
#输出
Thomas Cruise Mapother IV, widely known as Tom Cruise, is an...
从自然语言到sparql的转换是通过首先使用特殊形式的正则表达式来完成的:
person_name = Group(Plus(Pos("NNP")), "person_name")
regex = Lemma("who") + Lemma("be") + person_name + Question(Pos("."))
然后使用和方便的方式来表达语义关系:
person = IsPerson () + HasKeyword (person_name )
definition = DefinitionOf (person )
转换的其余部分由框架自动处理,最终生成这个sparql:
SELECT DISTINCT ?x1 WHERE {
?x0 rdf :type foaf :Person 。
?x0 rdfs :label “Tom Cruise” @ en 。
?x0 rdfs :comment ?x1 。
}
使用非常相似的过程,您可以生成和MQL查询相同的问题获取:
[{
"/common/topic/description": [{}],
"/type/object/name": "Tom Cruise",
"/type/object/type": "/people/person"
}]
为了说明如何使用quepy作为数据库的自然语言界面的框架,我们将构建(逐步)一个访问DBpedia的示例应用程序 。
完成的示例应用程序可以在线尝试: 在线演示
完成的示例代码可以在这里找到: 代码
第一步是选择我们希望用dbpedia数据库回答的问题,然后我们将开发一个可以将它们转换成SPARQL查询的机构。
所选问题
在我们的示例应用程序中,我们将寻求回答以下问题:
谁是<someone>,例如:
- 汤姆克鲁斯是谁?
- 谁是奥巴马总统?
什么是<something>,例如:
- 什么是汽车?
- 什么是Python编程语言?
列出<brand> <something>,例如:
- 列出Microsoft软件
- 列出菲亚特汽车
开始一个quepy项目
要启动一个quepy项目,您必须创建一个quepy应用程序。在我们的例子,我们的应用程序被称为DBpedia中,我们通过运行应用程序:
$ quepy.py startapp dbpedia 你会发现一个文件夹和一些创建的文件。它应该是这样的:
$ cd dbpedia
$ tree . .
├── dbpedia
│ ├── __init__.py
│ ├── parsing.py
│ ├── dsl.py
│ └── settings.py
└── main.py 1 directory, 4 files
这是每个项目的基本结构。
- dbpedia / parsing.py:您将定义与自然语言问题匹配并将其转换为抽象语义表示的正则表达式的文件。
- dbpedia / dsl.py:您将在其中定义数据库模式的域特定语言的文件。在SPARQL的情况下,您将在这里指定通常存在于本体中的东西:关系名称等。
- dbpedia / settings.py:安装的某些方面的配置文件。
- main.py:该文件是一个可选的kickstart点,您可以在其中拥有与应用程序交互所需的所有代码。如果需要,您可以安全地删除此文件。
配置应用程序
首先确保您已经下载了nltk标记器的必要数据。如果不检查 安装部分。
现在编辑dbpedia / settings.py并将nltk数据的路径添加到 NLTK_DATA变量。这个文件有一些其他配置选项,但我们不需要这个例子。
还要配置LANGUAGE,在这个例子中我们将使用sparql
。
定义正则表达式
为了处理正则表达式,quepy使用refo,一个真棒库来使用正则表达式作为对象。您可以在这里阅读更多关于refo的信息。
我们需要定义与自然语言问题相匹配并将其转换为抽象语义表示的正则表达式。这将定义具体哪些问题系统将能够处理和如何处理。
在我们的示例中,我们将编辑dbpedia / parsing.py文件。我们来看一下正则表达式的例子来处理“What is ...”的 问题。整个定义将如下所示:
from refo import Group, Question
from quepy.dsl import HasKeyword
from quepy.parsing import Lemma, Pos, QuestionTemplate from dsl import IsDefinedIn class WhatIs(QuestionTemplate):
"""
Regex for questions like "What is ..."
Ex: "What is a car"
""" target = Question(Pos("DT")) + Group(Pos("NN"), "target")
regex = Lemma("what") + Lemma("be") + target + Question(Pos(".")) def interpret(self, match):
thing = match.target.tokens
target = HasKeyword(thing)
definition = IsDefinedIn(target)
return definition
现在让我们一步一步地讨论这个过程。
首先,请注意正则表达式处理程序需要是一个子类 quepy.parsing.QuestionTemplate
。他们还需要定义一个regex
使用refo regex 调用的类属性。
然后,我们将输入问题的结构描述为正则表达式,并将其存储在正则表达式属性中。在我们的例子中,这是在第14行中完成的:
未完!
【人工智能系列】python的Quepy库的学习的更多相关文章
- python 协程库gevent学习--gevent数据结构及实战(三)
gevent学习系列第三章,前面两章分析了大量常用几个函数的源码以及实现原理.这一章重点偏向实战了,按照官方给出的gevent学习指南,我将依次分析官方给出的7个数据结构.以及给出几个相应使用他们的例 ...
- Python关于PIL库的学习总结与成果展示
一.关于PIL库的学习总结 PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装.安装PIL库的方法如下,需要注意,安装库的名字是pillow. : ...
- python calendar标准库基础学习
# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...
- python linecache标准库基础学习
#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...
- python StringIO标准库基础学习
#标准库:StringIO提供类文件API文本缓冲区#作用:可以处理内存中的文本,有2种不同的实现:cStringIP版本用c编写提高速度,StringIO用python来提供可移植性,与其他字符串连 ...
- [python]-数据科学库Numpy学习
一.Numpy简介: Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3],需要有3 ...
- python 协程库gevent学习--gevent数据结构及实战(四)
一不留神已经到第四部分了,这一部分继续总结数据结构和常用的gevent类,废话不多说继续. 1.Timeout错误类 晚上在调试调用第三方接口的时候,发现有些接口耗时非常多,觉得应该有个超时接口来限制 ...
- python 协程库gevent学习--gevent源码学习(二)
在进行gevent源码学习一分析之后,我还对两个比较核心的问题抱有疑问: 1. gevent.Greenlet.join()以及他的list版本joinall()的原理和使用. 2. 关于在使用mon ...
- python 协程库gevent学习--源码学习(一)
总算还是要来梳理一下这几天深入研究之后学习到的东西了. 这几天一直在看以前跟jd对接的项目写的那个gevent代码.为了查错,基本上深入浅出了一次gevent几个重要部件的实现和其工作的原理. 这里用 ...
随机推荐
- Mixing Milk
链接 分析:水题,按照价格从小到大排序,在进行贪心即可 /* PROB:milk ID:wanghan LANG:C++ */ #include "iostream" #inclu ...
- make的link_directories命令不起作用
按照<CMake Practice>中第六章的设置,采用include_directories命令去寻找共享库的路径,src/CMakeLists.txt如下: ADD_EXECUTABL ...
- Win32控制台程序和Win32应用程序
刚接触Windows那一套,大多数概念都还没建立起来,整理了一下网上对“Win32控制台程序”的理解,谢谢各位网友了. win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运 ...
- 洛谷 - P1118 - 数字三角形 - next_permutation
https://www.luogu.org/problemnew/show/P1118 next_permutation的第二个参数是最后一个元素的下一个元素,sort也是一样!有毒!这么低级的错误. ...
- 洛谷P2569 [SCOI2010]股票交易(单调队列)
传送门 惭愧……这种题目都没看出来…… 首先,我们用$dp[i][j]$表示在第$i$天,手上有$j$股时的最大收益 第一,我们可以直接买股票,即$dp[i][j]=-j*AP_i$,这个直接计算即可 ...
- Spring Cache无效的问题以及解决办法
http://blog.csdn.net/kimylrong/article/details/50126979 @Cacheable标注的方法,如果其所在的类实现了某一个接口,那么该方法也必须出现在接 ...
- 洛谷 P1199 三国游戏
参考:Solution_ID:17 题解 更新时间: 2016-11-13 21:01 这道题要求最后得到的两方的默契值最大的武将,小涵的默契值大于计算机,首先,我们这个解法获胜的思路是,每个武将对应 ...
- 476 Number Complement 数字的补数
给定一个正整数,输出它的补数.补数是对该数的二进制表示取反.注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位.示例 1:输入: 5输出: 2解释: 5的 ...
- MySQL FailOver(官方自带,free)
为什么 传统复制和GTIDs切换的缺点 当replication故障出现之后,最头疼是replication架构的调整 一旦master down了,就需要配置某一台slave作为master sla ...
- RHEL 6.5----apr-util1.6执行make时报错
报错信息 ]: Entering directory `/usr/local/src/apr-util-' /bin//build-/libtool --silent --mode=compile / ...