2016-11-08 4 views
1

Я ищу решение для извлечения списка понятий, о которых идет текстовый (или html) документ. Я хотел бы, чтобы концепции были темами wikidata (или freebase или DBpedia).Как найти список тем wikidata (или freebase или DBpedia), о которых идет речь?

Например «Bad песня Микаэля Джексон» должен вернуть Майкл Джексон (художник, викиданные Q2831) и Bad (песню, викиданные Q275422). Как показывает этот пример, система должна быть надежной для орфографических ошибок (Mikael) и двусмысленности (Bad).

В идеале система должна работать на нескольких языках, она должна работать как на коротких текстах, так и на длинных текстах, а когда она неуверена, она должна возвращать несколько тем (например, Bad song + Bad album). Кроме того, в идеале он должен быть открытым исходным кодом и иметь API-интерфейс python.

Да, это похоже на список для Санта-Клауса. Есть идеи?

Редактировать

Я проверил несколько решений, но не серебряная пуля до сих пор.

  • NLTK разбирает текст и извлекать «именованные объекты» (AFAIU, часть предложения, которая относится к имени), но он не возвращает викиданные темы, только простой текст. Это означает, что он, вероятно, не поймет, что «Я снимал шерифа» - это название песни Боба Марли, оно будет рассматривать это как предложение.
  • OpenNLP делает примерно то же самое.
  • Wikidata имеет API поиска, но это всего лишь один термин за раз, и он не справляется с значениями.
  • Есть несколько коммерческих услуг (OpenCalais, AlchemyAPI, CogitoAPI ...), но никто не сияет, ИМХО.
+0

@ Matt1776 Возможно, вопрос звучал слишком расплывчато, но это проблема программирования в реальной жизни, с которой я сталкиваюсь, и я уверен, что у других было (или будет) то же самое. Во всяком случае, большое спасибо за ваш вид upvote. – MiniQuark

+0

Что вы думаете о моем ответе? – amirouche

+0

Привет @amirouche, спасибо за ваш ответ. Мне нравится идея (+1), но я не могу принять этот ответ: я пробовал что-то подобное с помощью NLTK, и, к сожалению, это терпит неудачу, когда тема имеет имя, которое выглядит как кусок предложения, например «Я застрелил шерифа», Боб Марли. Это происходит очень часто с именами песен или именами артистов (например, Rage против машины). Я склоняюсь к решению, которое сначала будет искать все имена тем, которые он может найти (даже приблизительно), а затем ранжировать их с использованием различных сигналов, включая, возможно, некоторые сигналы НЛП (это существительное? Это человек?). Как вы думаете? – MiniQuark

ответ

2

Вы можете использовать Spacy для извлечения именованного объекта, а затем связать их с WikiData с помощью API поиска.

Для того, что осталось от предложения, которое не совпало с именем именованного объекта Spacy, вы можете создать список ngrams из предложения, начинающегося с самой большой ngram, которую вы используете API поиска WikiData для поиска тем WikiData.

Пометка POS может быть использована для использования, что синтаксическая информация синтаксического анализа более эффективна, так как вы можете знать отношения между словами. Например, учитывая следующий вывод из link-grammar:

Found 8 linkages (8 had no P.P. violations) 
    Linkage 1, cost vector = (UNUSED=0 DIS= 0.15 LEN=9) 

    +-------------------------Xp-------------------------+ 
    +----------->WV---------->+       | 
    +-------Wd------+   +---------Osn--------+  | 
    |  +---G---+----Ss---+----Os----+   |  | 
    |  |  |   |   |   |  | 
LEFT-WALL Bob.m Marley[!] wrote.v-d Natural[!] Mystic[!] . 

Вы можете сказать, что субъект «Боб Марли», потому что

  1. «пишет» подключен к «Марли» с S, который соединяет предметные существительные к конечным глаголам.
  2. «Марли» подключен к «Бобу», используя G, который соединяет собственное имя вместе.

Таким образом, «Боб Марли» является хорошим кандидатом для сущности (также он имеет оба слова с заглавной буквы).

Учитывая вышеизложенное синтаксическое разборку «дерева», трудно определить, связаны ли «естественные» и «мистические», даже если они находятся на одной стороне предложения.

Второй синтаксического анализа при условии, грамматикой связи имеет тот же вектор и ссылки затрат вместе «Natural Mystic» с снова Г.

Вот это:

Linkage 2, cost vector = (UNUSED=0 DIS= 0.15 LEN=9) 

    +-------------------------Xp-------------------------+ 
    +----------->WV---------->+       | 
    +-------Wd------+   +---------Os---------+  | 
    |  +---G---+----Ss---+   +----G----+  | 
    |  |  |   |   |   |  | 
LEFT-WALL Bob.m Marley[!] wrote.v-d Natural[!] Mystic[!] . 

Так, на мой взгляд «Боба Марли »И« Natural Mystic »являются хорошим кандидатом на поиск в wikidata.

Это была простая проблема, когда грамматика и орфография правильны.

Вот один синтаксический анализ из 11 тех же предложений с строчными:

Linkage 1, cost vector = (UNUSED=1 DIS= 0.15 LEN=14) 

    +------------------------Xp------------------------+ 
    +----------------------Wa---------------------+ | 
    |  +------------------AN-----------------+ | 
    |  |  +-------------AN-------------+ | 
    |  |  |     +----AN---+ | 
    |  |  |     |   | | 
LEFT-WALL Bob.m marley[?].n [wrote] natural.n mystic.n . 

LG даже не признает глагол.