Bir Wikipedia sayfasının varlığını tanımlayın
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_of
veya subclass
ağ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
İş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