4

我使用的词汇:

nounphrase -- 一个简短的短语,指代特定的人、地点或想法。不同的名词短语的例子包括“Barack Obama”、“Obama”、“Water Bottle”、“Yellowstone National Park”、“Google Chrome web browser”等。

类别——定义哪些名词短语属于它而哪些不属于它的语义概念。类别的示例包括“政客”、“家居用品”、“食品”、“人”、“运动队”等。因此,我们会认为“巴拉克奥巴马”属于“政客”和“人”,但确实不属于“食品”或“运动队”。

我有一个非常庞大的未标记 NLP 数据集,由数百万个名词短语组成。我想使用 Freebase 来标记这些名词短语。我有一个 Freebase 类型到我自己的类别的映射。我需要做的是为我拥有的每一种 Freebase 类型下载每一个示例。

我面临的问题是需要弄清楚如何构建这种类型的查询。在高层次上,查询应该询问 Freebase“主题 XX 的所有示例是什么?” 并且 Freebase 应该以“这里是主题 XX 的所有示例的列表”作为响应。如果有人能给我这个查询的语法,我将不胜感激。如果它可以在 Python 中完成,那就太棒了:)

4

2 回答 2

4

查询的基本形式(例如,对于一个人)是

[{
  "type":"/people/person",
  "name":None,
  "/common/topic/alias":[],
  "limit":100
}]​

在http://wiki.freebase.com/wiki/MQL_Manual上有可用的文档

使用 Python 库http://code.google.com/p/freebase-python/中的 freebase.mqlreaditer() 是循环所有这些的最简单方法。在这种情况下,“限制”子句确定用于查询的块大小,但您将在 API 级别单独获取每个结果。

顺便说一句,你打算如何消除总统杰克肯尼迪的歧义,从投掷者,从足球运动员,从书等等等等http://www.freebase.com/search?limit=30&start=0&query=jack+kennedy 如果您有足够的上下文可以使用它来消除歧义,您可能需要考虑从 Freebase 捕获其他信息(出生和死亡日期、书籍作者、其他类型的分配等)。

过了某个时间点,使用批量数据转储而不是 API http://wiki.freebase.com/wiki/Data_dumps可能更容易和/或更有效

编辑 - 这是一个工作 Python 程序,它假设您在名为“types.txt”的文件中有一个类型 ID 列表:

import freebase

f = file('types.txt')
for t in f:
    t=t.strip()
    q = [{'type':t,
          'mid':None,
          'name':None,
          '/common/topic/alias':[],
          'limit':500,
          }]
    for r in freebase.mqlreaditer(q):
        print '\t'.join([t,r['mid'],r['name']]+r['/common/topic/alias'])
f.close()

如果您使查询变得更加复杂,您可能希望降低限制以防止遇到超时,但是对于像这样的简单查询,将限制提高到默认值 100 以上将通过更大的查询来提高效率块。

于 2011-11-12T14:17:08.107 回答
1

这里描述的一般问题在自然语言处理中称为实体链接。

毫不掩饰的自我插头:

有关执行大规模实体链接的介绍和方法,请参阅我们关于该主题的书籍章节。

http://cs.jhu.edu/~delip/entity_linking.pdf

@deliprao

于 2011-11-14T19:59:16.313 回答