Как найти список тем wikidata (или freebase или DBpedia), о которых идет речь?
Я ищу решение для извлечения списка концепций, о которых текстовый (или HTML) документ. Я хотел бы, чтобы концепции были темами Викиданных (или freebase или DBpedia).
Например, "Плохая песня Микаэля Джексона" должна вернуть Майкла Джексона (исполнитель, wikidata Q2831) и Bad (песня, wikidata Q275422). Как показывает этот пример, система должна быть устойчивой к орфографическим ошибкам (Микаэль) и неоднозначности (Плохо).
В идеале система должна работать на нескольких языках, она должна работать как на коротких текстах, так и на длинных текстах, а когда она не уверена, она должна возвращать несколько тем (например, Плохая песня + Плохой альбом). Кроме того, в идеале он должен быть открытым исходным кодом и иметь Python API.
Да, это звучит как список для Санта-Клауса. Есть идеи?
редактировать
Я проверил несколько решений, но пока никакой серебряной пули.
- NLTK анализирует текст и извлекает "именованные объекты" (AFAIU, часть предложения, которое относится к имени), но не возвращает темы Wikidata, а просто текст. Это означает, что он, вероятно, не поймет, что "Я застрелил шерифа" - это название песни Боба Марли, вместо этого он будет рассматривать это как предложение.
- OpenNLP делает примерно то же самое.
- В Wikidata есть API поиска, но это только один термин за раз, и он не обрабатывает неоднозначность.
- Есть несколько коммерческих сервисов (OpenCalais, AlchemyAPI, CogitoAPI...), но ни один из них не блестит, ИМХО.
1 ответ
Вы можете использовать Spacy для получения Именованной сущности, а затем связать их с WikiData, используя API поиска.
Для того, что осталось от предложения, которое не соответствует именованной сущности в Spacy, вы можете создать список нграмм из предложения, начиная с самой большой нграммы, которую вы используете API поиска WikiData для поиска тем WikiData.
POS-теги могут найти хорошее применение, так как информация синтаксического разбора является более мощной, поскольку вы можете знать отношения между словами. Например, учитывая следующий вывод из грамматики ссылки:
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[!] .
Вы можете сказать, что предмет "Боб Марли", потому что
- "Писал" связан с "Марли" с S, который соединяет существительные с конечными глаголами.
- "Марли" соединяется с "Бобом" с помощью буквы 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[!] .
Так что, на мой взгляд, "Боб Марли" и "Натуральный мистик" - хороший кандидат для поиска в викиданных.
Это была простая проблема, когда грамматика и орфография верны.
Вот один разбор из одного и того же предложения в нижнем регистре:
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 даже не распознает глагол.