使用DBPedia的示例Python脚本?
我正在写一个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,你需要使用一种本地的三元组存储,我推荐你使用Virtuoso或4store。我个人更喜欢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" }} ] } }
>>>
希望这些能给你一个开始的思路。