13

我正在编写一个 python 脚本来从来自几个国家和语言的数千篇新闻文章中提取“实体名称”。

我想利用惊人的DBPedia结构化知识,例如查找“埃及艺术家”的名称和“加拿大公司”的名称。

(如果这些信息是 SQL 形式的,我就没有问题了。)

我更愿意下载 DBPedia 内容并离线使用。关于这样做需要什么以及如何从 python 在本地查询它的任何想法?

4

2 回答 2

17

DBpedia 内容采用 RDF 格式。转储可以从这里下载

Dbpedia 是 RDF 中的一个大型数据集,用于处理需要使用三重存储技术的数据量。对于 Dbpedia,您将需要本地三重商店之一,我建议您使用Virtuoso4store。我个人更喜欢4store。

一旦您在其中设置了包含 Dbpedia 的三重商店。您可以使用SPARQL查询 Dbpedia RDF 三元组。有 Python 库可以帮助您。4store 和 Virtuoso 可以以 JSON 格式返回结果,因此您无需任何库即可轻松完成任务。

一些简单的 urllib 脚本,例如...

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" }} ] } }
>>> 

我希望这能让你知道如何开始。

于 2011-09-20T18:00:29.527 回答
3

在 python3 中,使用 requests 库的答案将如下所示:

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
于 2016-01-06T07:20:31.593 回答