Bir Wikipedia sayfasının varlığını tanımlayın

Aug 18 2020

Sorum, maalesef hiçbir zaman yanıt alamayan benzer bir soru / yorumla ilgili .

Birden çok Wikipedia sayfasının bir listesi verildiğinde, örneğin:

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

bu makalelerin ne tür bir varlığa atıfta bulunduğunu nasıl öğrenebilirim . yani ideal olarak daha yüksek düzeyde bir şey isterdim, örneğin kişi, film, hayvan vb.

Şimdiye kadarki en iyi tahminim, instance_ofveya subclassağacını geri taşımak için SPARQL kullanan Vikiveri API'siydi . Ancak bu anlamlı sonuçlara yol açmadı.

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".}
}

Sonuç burada görülebilir: https://w.wiki/ZmQ

Elbette bir seçenek de şuna bakmak olacaktır itemDescription, ancak korkarım ki bu daha büyük listelerden anlamlı gruplar oluşturmak ve daha sonra frekansları saymak için çok ayrıntılıdır. Daha genel varlık kategorilerinin nasıl alınacağına dair bir ipucu / fikri olan var mı? Belki de mediawiki API'sinden?

Herhangi bir girdi çok takdir edilecektir!

Yanıtlar

1 MatthiasWinkelmann Aug 18 2020 at 09:18

İşte yan yana üç olasılık:

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

Burada yaşayın .

"Film" ve "memeli" gibi etiketlere, yani en fazla birkaç düzine bakıyorsanız, bunları açıkça tercih sırasına göre sıralayabilir ve sonra ilk olanı kullanabilirsiniz.

Bu hatayla karşılaşabileceğinizi unutmayın: https://www.wikidata.org/wiki/Wikidata:SPARQL_tutorial#wikibase:Label_and_aggregations_bug