Как найти список тем викиданных (или freebase, или DBpedia), о которых идет речь в тексте?

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

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

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

Да, это звучит как список для Деда Мороза. Любые идеи?

Изменить

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

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

person MiniQuark    schedule 08.11.2016    source источник
comment
@ Matt1776 Возможно, вопрос прозвучал слишком расплывчато, но это реальная проблема программирования, с которой я столкнулся, и я уверен, что у других было (или будет) то же самое. В любом случае, большое спасибо за ваш добрый голос.   -  person MiniQuark    schedule 08.11.2016
comment
что вы думаете о моем ответе?   -  person amirouche    schedule 10.11.2016
comment
Привет @amirouche, спасибо за ваш ответ. Мне нравится идея (+1), но я не могу принять этот ответ: я пробовал что-то подобное, используя NLTK, и, к сожалению, это не удается, когда тема имеет название, похожее на часть предложения, например, я застрелил шерифа Бобом Марли. На самом деле это очень часто происходит с названиями песен или именами исполнителей (например, Rage Against the Machine). Я склоняюсь к решению, которое сначала будет искать все названия тем, которые оно может найти (даже приблизительно), а затем ранжировать их, используя различные сигналы, включая, возможно, некоторые сигналы НЛП (это существительное? Это человек?). Что вы думаете?   -  person MiniQuark    schedule 15.11.2016
comment
«различные сигналы» слишком расплывчаты, чтобы я мог занять какую-то позицию. Также вы должны использовать какой-то синтаксический анализ или дерево разбора зависимостей, чтобы узнать, какая часть предложения может быть интересна для поиска в викиданных.   -  person amirouche    schedule 15.11.2016
comment
Компания Google недавно выпустила cloud.google.com/natural-language, думаю, вам стоит попробовать. . Он укажет вам на статью в Википедии об объекте, но оттуда вы сможете получить его страницу викиданных.   -  person marfi    schedule 09.12.2016
comment
по-видимому, это называется викификацией. Взгляните на эту ветку в списке рассылки викиданных lists .wikimedia.org/pipermail/wikidata/2017-февраль/   -  person amirouche    schedule 07.02.2017


Ответы (1)


Вы можете использовать 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. «Write» связан с «Marley» с помощью S который связывает подлежащие существительные с конечными глаголами.
  2. «Марли» связан с «Бобом» с помощью G. который соединяет имена собственные вместе.

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

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

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

Вот:

    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[!] .

Так что, на мой взгляд, «Боб Марли» и «Природный мистик» — хорошие кандидаты для поиска по викиданным.

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

Вот один разбор из 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 даже не распознает глагол.

person amirouche    schedule 09.11.2016