Identifica l'entità di una pagina di Wikipedia

Aug 18 2020

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_ofo . subclassTuttavia, 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

1 MatthiasWinkelmann Aug 18 2020 at 09:18

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