Identificar a entidade de uma página da Wikipédia

Aug 18 2020

Minha pergunta está relacionada a uma pergunta/comentário semelhante que infelizmente nunca recebeu uma resposta.

Dada uma lista de várias páginas da Wikipédia, por exemplo:

  • https://en.wikipedia.org/wiki/Donald_Trump
  • https://en.wikipedia.org/wiki/The_Matrix
  • https://en.wikipedia.org/wiki/Tiger
  • ...

como posso descobrir a que tipo de entidade esses artigos se referem. ou seja, idealmente, eu gostaria de algo em um nível superior, por exemplo, pessoa, filme, animal etc.

Meu melhor palpite até agora foi a API do Wikidata usando SPARQL para mover de volta a árvore instance_ofou subclass. No entanto, isso não levou 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".}
}

O resultado pode ser visto aqui:https://w.wiki/ZmQ

É claro que uma opção também seria examinar o itemDescription, mas receio que isso seja muito granular para criar grupos significativos a partir de listas maiores e contar frequências posteriormente. Alguém tem uma dica/ideia sobre como obter categorias de entidades mais gerais? Talvez também da API mediawiki?

Qualquer entrada seria muito apreciada!

Respostas

1 MatthiasWinkelmann Aug 18 2020 at 09:18

Aqui estão três possibilidades, lado a lado:

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

Viva aqui .

Se você estiver procurando rótulos como "filme" e "mamífero", ou seja, algumas dúzias no máximo, poderá listá-los explicitamente em ordem de preferência e, em seguida, usar o primeiro que ocorrer.

Observe que você pode estar enfrentando este bug:https://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial#wikibase:Label_and_aggregations_bug