Janez Demšar, 14. april 2025
Kako do podatkov z Wikidata?
Ko pripravljamo nove šolske dejavnosti, pogosto potrebujemo dober vir podatkov. Wikipedija je odličen vir informacij, ni pa dober vir podatkov. Strojno berljivih podatkov, namreč. Zanje se moramo obrniti na Wikidato, sestrski projekt Wikipedije.
Fičo

Najbrž še vsi vemo za Fiča? To je bil eden od (bolj ali manj) dveh avtomobilov, ki sem jih videval v svojem otroštvu; drugi je bil, seveda, stoenka.
Odprite članek o Zastavi 750 na Wikipediji. Ne le iz radovednosti. Vidite meni Tools v zgornjem desnem kotu? Odprite ga in izberite Wikidata item. S tem boste odprli stran na Wikidati za Zastavo 750. Malo se sprehodite po njej.
Q148237 je identifikator entitete, ki predstavlja Zastavo 750. Med podatki piše, da je Q148237 »instance of« Q3231690, pri čemer Q3231690 pomeni »model avtomobila«. Z drugimi besedami: Wikidata pravi, da je Zastava 750 avtomobil. Piše tudi, da tehta 605 kg, da mu sledi (»followed by«) Q21205906, to je Yugo, da so jih izdelali 923.847, in tako naprej.
Vse to je zelo zanimivo in to bi lahko pridobili v obliki JSON … vendar pri svojem delu navadno potrebujemo podatke o več objektih iste vrste. V tem primeru: o več avtomobilih. Za to lahko dostopamo do podatkovne zbirke, iz katere je sestavljena ta stran, prek jezika SPARQL.
Znate pisati poizvedbe v SPARQL-u? Ne? Jaz tudi ne. To je poizvedovalni jezik za grafovne podatke. Tu nastopi ChatGPT.
Velikih jezikovnih modelov nikoli ne smemo uporabljati kot vira podatkov (vsaj v času nastanka tega prispevka še ne). Lahko pa jih prosimo, naj nam pomagajo priti do podatkov:
Can you construct a wikidata query for car
images that would give me a picture, model name,
manufacturer and state, and the year the car was
produced?
Odgovoril je:
Sure! Here is a SPARQL query for Wikidata that
retrieves images of cars along with their model
name, manufacturer, production start year, and
country of origin (state). You can run this query
using the [Wikidata Query Service].
SELECT ?car ?carLabel ?image ?manufacturerLabel ?countryLabel ?startYear WHERE {
?car wdt:P31 wd:Q3231690; # Instance of automobile model
wdt:P18 ?image; # Image
wdt:P176 ?manufacturer; # Manufacturer
wdt:P571 ?inception. # Inception (start year)
OPTIONAL {
?manufacturer wdt:P17 ?country. # Manufacturer's country of origin
}
BIND(YEAR(?inception) AS ?startYear)
FILTER(?startYear >= 1920) # Filter cars produced from 1920 onwards
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en".
}
}
ORDER BY ?startYear
LIMIT 100
Nato odpremo storitev Wikidata Query Service na naslovu https://query.wikidata.org/ in vanjo prilepimo zgornjo poizvedbo. V odgovor dobimo tabelo, ki se začne takole:

Če smo z rezultatom zadovoljni, lahko odstranimo LIMIT 100 in dobili bomo vse zadetke.
Nato pod Download izberemo JSON, TSV ali katerokoli drugo obliko zapisa, ki nam ustreza, in prenesemo tabelo. CSV je videti takole:
car,carLabel,image,manufacturerLabel,countryLabel,startYear
http://www.wikidata.org/entity/Q1647218,Rumpler Tropfenwagen,http://commons.wikimedia.org/wiki/Special:FilePath/Rumpler%20Tropfenwagen.jpg,Rumpler,,1921
http://www.wikidata.org/entity/Q1071289,Chevrolet Superior,http://commons.wikimedia.org/wiki/Special:FilePath/1926%20Chevrolet%20Superior%20Series%20V%20Touring%20GAG685.jpg,General Motors,United States,1923
http://www.wikidata.org/entity/Q1071111,Chevrolet Copper-Cooled,http://commons.wikimedia.org/wiki/Special:FilePath/Chevrolet%20cooper%20cooled%20car.jpg,General Motors,United States,1923
http://www.wikidata.org/entity/Q51562081,Voisin Laboratoire,http://commons.wikimedia.org/wiki/Special:FilePath/Voisin-C6-Laboratoire%20%281923%29.jpg,Avions Voisin,France,1923
http://www.wikidata.org/entity/Q412232,Ajax,http://commons.wikimedia.org/wiki/Special:FilePath/1926%20Ajax%204-door%20built%20by%20Nash%20at%202014%20Gettysburg%20AACA%20meet-01.jpg,Nash Motors,United States,1925
To je bil primer z avtomobili. Včasih nam bo tabela z Wikidate že zadostovala: naredili bomo le nekaj manjših popravkov, jo uvozili v Orange (ali kam drugam) in jo uporabili.
Drugič jo bo treba dodatno obdelati, na primer v Pythonu. Bi radi s spleta prenesli vse te slike? Če znate napisati skripto, ni problema. Če ne, je ChatGPT kot ustvarjen za takšne programerske naloge.
Humoristične serije
S podatki o avtomobilih nisem naredil še nič koristnega. (Popravek: pozneje sem jih uporabil pri dejavnostih Časovni trak in Modrost množice.) Tule pa je primer druge zbirke podatkov, ki sem jo pripravil za dejavnost o priporočilnih sistemih: namesto risank sem uporabil humoristične serije.
Tokrat sem uporabil le ChatGPT, ne pa tudi Wikidate.
Give me a list of sixty popular sitcoms as
a Python list containing links to IMDB.
Pomembno je bilo, da sem seznam zahteval v obliki Pythonovega seznama. Tako sem lahko delo lažje nadaljeval. Dobil sem tole:
sitcoms = [
{"title": "Friends",
"imdb_link": "https://www.imdb.com/title/tt0108778/"},
{"title": "Seinfeld",
"imdb_link": "https://www.imdb.com/title/tt0098904/"},
{"title": "The Office (US)",
"imdb_link": "https://www.imdb.com/title/tt0386676/"},
{"title": "Parks and Recreation",
"imdb_link": "https://www.imdb.com/title/tt1266020/"},
Tukaj moramo biti previdni. Med povezavami, ki jih je vrnil ChatGPT, so bile tri ali štiri napačne – kazale so na povsem druge serije. ChatGPT ni zanesljiv vir podatkov, vendar je bilo njegove napake pri naslednjem koraku preprosto odkriti.
Za dejavnost, ki sem jo pripravljal, sem potreboval še posterje teh serij. Ko sem vprašal:
What's the easiest way to download poster images?
I want to do it programmatically.
mi je priporočil Open Movie Database (https://www.omdbapi.com/). Ima API, za katerega potrebujete elektronski naslov. Nanj prejmete ključ, s katerim lahko opravite do 1000 zahtevkov na dan.
Given an IMDb tt code, and assuming my
apikey is 12345, how do I download from
omdb using Python and urllib.request?
Priznam: to bi znal sprogramirati tudi sam. Bil sem samo len.
Dobil sem naslednjo kodo:
import urllib.request
import json
# Define your API key and IMDb tt code
api_key = "12345"
tt_code = "tt0111161" # Example IMDb code for The Shawshank Redemption
# Construct the URL for the OMDb API
url = f"http://www.omdbapi.com/?apikey={api_key}&i={tt_code}"
try:
# Make the request
with urllib.request.urlopen(url) as response:
# Read and decode the response
data = response.read().decode("utf-8")
# Parse the JSON
movie_data = json.loads(data)
# Output the result
print(movie_data)
except Exception as e:
print("An error occurred:", e)
In to je bilo vse. :)
