使用DBPedia的示例Python脚本?

14 投票
2 回答
11103 浏览
提问于 2025-04-17 02:41

我正在写一个Python脚本,目的是从成千上万的新闻文章中提取“实体名称”,这些文章来自几个国家和不同的语言。

我想利用很棒的DBPedia结构化知识,比如查找“埃及的艺术家”和“加拿大的公司”这些名称。

(如果这些信息是以SQL的形式存在,我就不会有任何问题了。)

我更希望能下载DBPedia的内容,然后离线使用。有没有什么建议,告诉我需要做些什么,以及如何在Python中本地查询这些数据?

2 个回答

5

在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
18

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

希望这些能给你一个开始的思路。

撰写回答