我正在编写一个Python脚本,从几个国家和语言的成千上万篇新闻文章中提取“实体名称”。
我想利用令人惊叹的DBPedia结构化知识,例如查找“埃及艺术家”的姓名和“加拿大公司”的名称。
(如果这些信息以SQL形式存在,我就不会有问题了。)
我宁愿下载DBPedia内容并在离线状态下使用它。有什么方法可以做到这一点,并如何从Python本地查询它?
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" }} ] } }
>>>
我希望这给你一个开始的想法。使用requests库,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