Пример python script, который использует DBPedia?

Я пишу python script для извлечения "Имена сущностей" из коллекции тысяч новостных статей из нескольких стран и языков.

Я хотел бы использовать удивительный DBPedia структурированный knwoledge, скажем, например, чтобы найти имена "художников в Египте" и имена "компаний в Канаде".

(Если эта информация была в форме SQL, у меня не было бы проблем.)

Я бы предпочел загрузить содержимое DBPedia и использовать его в автономном режиме. какие-либо идеи о том, что нужно для этого и как его локально запрашивать из python?

Ответ 1

Содержимое DBpedia находится в формате RDF. Сбросы можно загрузить из здесь

Dbpedia - это большой набор данных в RDF, для обработки этого объема данных вам необходимо использовать технологию Triple Store. Для Dbpedia вам понадобится один из родных трехлокальных магазинов, я рекомендую вам использовать Virtuoso или 4store. Я лично предпочитаю 4store.

Как только у вас установлен твой магазин с Dbpedia. Вы можете использовать SPARQL, чтобы запросить тройки Dbpedia RDF. Есть библиотеки Python, которые могут помочь вам в этом. 4store и Virtuoso могут дать вам результаты в JSON, чтобы вы могли легко обойтись без каких-либо библиотек.

Некоторые простые urllib script как...

def query(q,epr,f='application/json'):
    try:
        params = {'query': q}
        params = urllib.urlencode(params)
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(epr+'?'+params)
        request.add_header('Accept', f)
        request.get_method = lambda: 'GET'
        url = opener.open(request)
        return url.read()
    except Exception, e:
        traceback.print_exc(file=sys.stdout)
        raise e 

может помочь вам запустить SPARQL... например

>>> q1 = """
... select ?birthPlace where {
... <http://dbpedia.org/resource/Claude_Monet> <http://dbpedia.org/property/birthPlace> ?birthPlace .
...  }"""
>>> print query(q1,"http://dbpedia.org/sparql")

{ "head": { "link": [], "vars": ["birthPlace"] },
  "results": { "distinct": false, "ordered": true, "bindings": [
    { "birthPlace": { "type": "literal", "xml:lang": "en", "value": "Paris, France" }} ] } }
>>> 

Надеюсь, это даст вам представление о том, как начать.

Ответ 2

В python3 ответ будет выглядеть так, используя библиотеку запросов:

def query(q, epr, f='application/json'):
    try:
        params = {'query': q}
        resp = requests.get(epr, params=params, headers={'Accept': f})
        return resp.text
    except Exception as e:
        print(e, file=sys.stdout)
        raise