给定一个DBpedia资源,我希望找到整个分类法直到根。
例如,如果我用通俗易懂的英语说,对于巴拉克·奥巴马,我想知道整个分类法,这就是巴拉克·奥巴马( Barack )的政治家→→Person→say。
为此,我编写了以下递归函数:
import requests
import json
from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://dbpedia.org/sparql")
def get_taxonomy(results,entity,hypernym_list):
'''This recursive function keeps on fetching the hypernyms of the
DBpedia resource recursively till the highest concept or root is reached'''
if entity == 'null':
return hypernym_list
else :
query = ''' SELECT ?hypernyms WHERE {<'''+entity+'''> <http://purl.org/linguistics/gold/hypernym> ?hypernyms .}
'''
sparql.setQuery(query)
sparql.setReturnFormat(JSON)
results = sparql.query().convert()
for result in results["results"]["bindings"]:
hypernym_list.append(result['hypernyms']['value'])
if len(results["results"]["bindings"]) == 0:
return get_taxonomy(results,'null',hypernym_list)
return get_taxonomy(results,results["results"]["bindings"][0]['hypernyms']['value'],hypernym_list)
def get_taxonomy_of_resource(dbpedia_resource):
list_for_hypernyms=[]
results = {}
results["results"]={}
results["results"]["bindings"]=[1,2,3]
taxonomy_list = get_taxonomy(results,dbpedia_resource,list_for_hypernyms)
return taxonomy_list代码适用于以下输入:
get_taxonomy_of_resource('http://dbpedia.org/resource/Barack_Obama')输出:
['http://dbpedia.org/resource/Politician',
'http://dbpedia.org/resource/Person', 'http://dbpedia.org/resource/Being']问题:
但是对于下面的输出,它只会给出超限,直到超过一个级别并停止:
get_taxonomy_of_resource('http://dbpedia.org/resource/Steve_Jobs')输出:
['http://dbpedia.org/resource/Entrepreneur']研究:
当我在他们的网站dbpedia.org/page/<term>上做一些研究时,我意识到,它之所以停止在企业家网站上,是因为当我点击他们网站上的这个资源时,我需要使用“创业”资源,并将其超限描述为“过程”。所以,现在我的问题是针对这个问题:
我怎么知道即使两个都是有效的DBpedia实体,企业家都在指导创业呢?由于这个原因,我的递归函数失败了,因为在下一次迭代中,它试图为企业家而不是企业家找到hypernym。
如能提供任何帮助,我们将不胜感激。
发布于 2019-08-14 13:57:22
我以前在编写生成分类法的程序时也遇到过同样的问题,我的解决方案是在我的主要资源不能提供超限时使用威克斯。
wiktionary可以下载并解析到python字典中。
例如,“企业家”的wiktionary条目包含以下内容:
名词 企业家(复数企业家) 组织和经营商业风险并承担大部分相关风险的人。
从这个定义中,可以提取出超限('person')。
当然,这种方法需要编写代码从定义中提取超限(这个任务有时容易,有时很难,取决于定义的措辞)。
当主重新源(在您的示例中为DBpedia)无法提供超限时,此方法提供了一个回退例程。
最后,正如AKSW所指出的,有一种方法来捕捉不正确的超限关系(例如企业家-过程)是很好的。自然语言处理中有文本蕴涵的领域,它研究判断语句是否与(或暗示或. )相矛盾的方法。)另一份陈述。
https://stackoverflow.com/questions/57490758
复制相似问题