Определить сущность страницы Википедии
Мой вопрос связан с аналогичным вопросом / комментарием, на который, к сожалению, так и не получил ответа.
Учитывая список из нескольких страниц Википедии, например:
- https://en.wikipedia.org/wiki/Donald_Trump
- https://en.wikipedia.org/wiki/The_Matrix
- https://en.wikipedia.org/wiki/Tiger
- ...
как узнать, к какому типу сущностей относятся эти статьи. т.е. в идеале я бы хотел что-то более высокого уровня, например, человек, фильм, животное и т. д.
До сих пор я предполагал, что API Викиданных использует SPARQL для возврата дерева instance_of
or subclass
. Однако это не привело к значимым результатам.
SELECT ?lemma ?item ?itemLabel ?itemDescription ?instance ?instanceLabel ?subclassLabel WHERE {
VALUES ?lemma {
"Donald Trump"@en
"The Matrix"@en
"Tiger" @en
}
?sitelink schema:about ?item;
schema:isPartOf <https://en.wikipedia.org/>;
schema:name ?lemma.
?item wdt:P31* ?instance.
?item wdt:P279* ?subclass.
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en,da,sv".}
}
Результат можно увидеть здесь: https://w.wiki/ZmQ
Один из вариантов, конечно, также заключался бы в просмотре itemDescription
, но я боюсь, что это слишком детализировано, чтобы создавать значимые группы из более крупных списков и подсчитывать частоты позже. Есть ли у кого-нибудь подсказка / идея о том, как получить более общие категории сущностей? Может быть, тоже из mediawiki API?
Любой вклад будет очень признателен!
Ответы
Вот три возможности, расположенные рядом:
SELECT ?lemma ?item (GROUP_CONCAT(DISTINCT ?instanceLabel; SEPARATOR = " ") AS ?a) (GROUP_CONCAT(DISTINCT ?subclassLabel; SEPARATOR = " ") AS ?b) (GROUP_CONCAT(DISTINCT ?isaLabel; SEPARATOR = " ") AS ?c) WHERE {
VALUES ?lemma {
"Donald Trump"@en
"The Matrix"@en
"Tiger"@en
}
?sitelink schema:about ?item;
schema:isPartOf <https://en.wikipedia.org/>;
schema:name ?lemma.
OPTIONAL { ?item (wdt:P31/(wdt:P279*)) ?instance. }
OPTIONAL { ?item wdt:P279 ?subclass. }
OPTIONAL { ?item wdt:P31 ?isa. }
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en,da,sv".
?instance rdfs:label ?instanceLabel.
?subclass rdfs:label ?subclassLabel.
?isa rdfs:label ?isaLabel.
}
# Here, you could add: FILTER(?instanceLabel in ("mammal"@en, "movie"@en, "musical"@en (and so on...)))
}
GROUP BY ?lemma ?item
Живи здесь .
Если вы смотрите на такие ярлыки, как «фильм» и «млекопитающее», то есть не более пары десятков, вы можете явно перечислить их в порядке предпочтения, а затем использовать первое, что встречается.
Обратите внимание, что вы можете столкнуться с этой ошибкой: https://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial#wikibase:Label_and_aggregations_bug