Как использовать Freebase для маркировки очень большого набора данных без меток NLP? - PullRequest
4 голосов
/ 12 ноября 2011

Словарь, который я использую:

именная фраза - короткая фраза, которая относится к конкретному человеку, месту или идее. Примеры различных именных фраз: «Барак Обама», «Обама», «Бутылка с водой», «Йеллоустонский национальный парк», «Веб-браузер Google Chrome» и т. Д.

категория - семантическая концепция, определяющая, какие существительные принадлежат ему, а какие - нет. Примеры категорий включают «Политик», «Предметы домашнего обихода», «Еда», «Люди», «Спортивные команды» и т. Д. Таким образом, мы бы хотели, чтобы «Барак Обама» принадлежал «Политику» и «Людям», но не не принадлежат к «Пищу» или «Спортивные команды».

У меня есть набор данных НЛП без меток, состоящий из миллионов нефраз. Я хотел бы использовать Freebase для обозначения этих существительных фраз. У меня есть сопоставление типов Freebase с моими собственными категориями. Что мне нужно сделать, это загрузить все примеры для каждого типа Freebase, который у меня есть.

Проблема, с которой я сталкиваюсь, заключается в том, что нужно выяснить, как структурировать этот тип запроса. На высоком уровне запрос должен спросить Freebase "каковы все примеры темы XX?" и Freebase должен ответить «вот список всех примеров темы XX». Я был бы очень признателен, если бы кто-то мог дать мне синтаксис этого запроса. Если бы это можно было сделать в Python, это было бы здорово:)

Ответы [ 2 ]

4 голосов
/ 12 ноября 2011

Основная форма запроса (например, для человека):

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

Документация доступна на http://wiki.freebase.com/wiki/MQL_Manual

Использование freebase.mqlreaditer () из библиотеки Python http://code.google.com/p/freebase-python/ - это самый простой способ перебрать все это. В этом случае предложение limit определяет размер блока, используемого для запросов, но вы получите каждый результат отдельно на уровне API.

Кстати, как вы планируете убрать с толку Джека Кеннеди, президента, от бродяги, от футболиста, из книги и т. Д., И т. Д. http://www.freebase.com/search?limit=30&start=0&query=jack+kennedy Возможно, вы захотите собрать дополнительную информацию из Freebase (рождение даты смерти, авторы книг, другие типы и т. д.), если у вас будет достаточно контекста, чтобы использовать его для устранения неоднозначности.

После определенного момента может быть проще и / или более эффективно работать с массовыми дампами данных, чем с API http://wiki.freebase.com/wiki/Data_dumps

Edit - вот рабочая программа на Python, которая предполагает, что у вас есть список идентификаторов типов в файле с именем 'types.txt':

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 голос
/ 14 ноября 2011

Общая проблема, описанная здесь, называется Entity Linking в обработке естественного языка.

Unabashed self plug:

См. Главу нашей книги по теме для введения и подхода к выполнению крупномасштабного связывания объектов.

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

@ deliprao

...