【人工智能系列】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

这里有完整的文档:

http://quepy.readthedocs.org/

第二篇 学习

为了说明你可以做什么与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行中完成的:

未完!