如何使用Freebase标记非常大的未标记NLP数据集?

时间:2011-11-11 21:12:58

标签: python nlp freebase

我正在使用的词汇:

nounphrase - 一个短语,指的是特定的人,地点或想法。不同的名词短语的例子包括“巴拉克奥巴马”,“奥巴马”,“水瓶”,“黄石国家公园”,“谷歌Chrome浏览器”等。

category - 定义哪个名词形式属于哪个,哪些不属于哪个的语义概念。类别的例子包括“政治家”,“家庭用品”,“食物”,“人物”,“运动队”等。因此,我们希望“巴拉克奥巴马”属于“政治家”和“人民”,但是不属于“食品”或“运动队”。

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

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

2 个答案:

答案 0 :(得分: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()是循环所有这些的最简单方法。在这种情况下,“limit”子句确定用于查询的块大小,但是您将在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以上将使其更有效率查询更大的块。

答案 1 :(得分:1)

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

毫不掩饰的自我插件:

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

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

@deliprao