Identifica l'entità di una pagina di Wikipedia
La mia domanda è correlata a una domanda/commento simile che purtroppo non ha mai ricevuto risposta.
Dato un elenco di più pagine di Wikipedia, ad esempio:
- https://en.wikipedia.org/wiki/Donald_Trump
- https://en.wikipedia.org/wiki/The_Matrix
- https://en.wikipedia.org/wiki/Tiger
- ...
come posso sapere a quale tipo di entità si riferiscono questi articoli. cioè idealmente vorrei qualcosa a un livello più alto, ad esempio una persona, un film, un animale ecc.
La mia ipotesi migliore finora era che l'API Wikidata utilizzasse SPARQL per spostare indietro l' albero instance_of
o . subclass
Tuttavia, ciò non ha portato a risultati significativi.
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".}
}
Il risultato può essere visto qui:https://w.wiki/ZmQ
Un'opzione sarebbe ovviamente anche quella di guardare itemDescription
, ma temo che sia troppo granulare per creare gruppi significativi da elenchi più grandi e contare le frequenze in seguito. Qualcuno ha un suggerimento/idea su come ottenere categorie di entità più generali? Forse anche dall'API mediawiki?
Qualsiasi input sarebbe molto apprezzato!
Risposte
Ecco tre possibilità, fianco a fianco:
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
Vivi qui .
Se stai cercando etichette come "film" e "mammifero", cioè un paio di dozzine al massimo, potresti elencarle esplicitamente in ordine di preferenza, quindi utilizzare la prima che si presenta.
Nota che potresti essere incappato in questo bug:https://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial#wikibase:Label_and_aggregations_bug