【人工智能系列】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行中完成的:

未完!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM