Identificar la entidad de una página de Wikipedia
Mi pregunta está relacionada con una pregunta/comentario similar que lamentablemente nunca recibió una respuesta.
Dada una lista de varias páginas de Wikipedia, por ejemplo:
- https://en.wikipedia.org/wiki/Donald_Trump
- https://en.wikipedia.org/wiki/The_Matrix
- https://en.wikipedia.org/wiki/Tiger
- ...
¿Cómo puedo saber a qué tipo de entidad se refieren estos artículos? es decir, idealmente me gustaría algo en un nivel superior, por ejemplo, una persona, una película, un animal, etc.
Mi mejor suposición hasta ahora fue que la API de Wikidata usaba SPARQL para mover hacia atrás el árbol instance_of
o . subclass
Sin embargo, esto no condujo a resultados significativos.
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".}
}
El resultado se puede ver aquí:https://w.wiki/ZmQ
Por supuesto, una opción también sería mirar el itemDescription
, pero me temo que esto es demasiado granular para crear grupos significativos a partir de listas más grandes y contar frecuencias más adelante. ¿Alguien tiene una pista/idea sobre cómo obtener categorías de entidades más generales? ¿Quizás también desde la API de mediawiki?
¡Cualquier entrada sería muy apreciada!
Respuestas
Aquí hay tres posibilidades, una al lado de la otra:
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
Vive aquí _
Si está buscando etiquetas como "película" y "mamífero", es decir, un par de docenas como máximo, puede enumerarlas explícitamente en orden de preferencia y luego usar la primera que aparezca.
Tenga en cuenta que puede encontrarse con este error:https://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial#wikibase:Label_and_aggregations_bug