S'amuser avec Wikidata

Le dans «Divers» par Eldeberen

Aujourd'hui j'ai pour la première fois utilisé Wikidata. Et c'était une expérience intéressante. o/

Bon, pourquoi une idée si saugrenue ? Simplement parce qu'au déjeuner la discussion s'est portée sur les plus gros films de l'histoire du cinéma français, et plus globalement du cinéma en général. Il se trouve que le classement mondial au box-office est compté uniquement en US$, ce qui n'est pas nécessairement intéressant comme statistique, surtout suivant comment on corrige l'inflation (ou non). J'ai donc cherché à obtenir le classement en terme d'entrées.

Deux solutions se présentent :

  1. pour chaque film considéré comme un blockbuster, aller chercher son nombre d'entrées, le mettre dans un tableur, trier le tout ;
  2. interroger une base de donnée et récupérer la liste triée d'un coup.

Évidemment j'ai choisi la premier solution. Non, je rigole. Reste à trouver une source de données en libre accès.

En ce qui concerne les films, l'Internet Movie Database est un service fourni par Amazon et propose quelques stats. Malheureusement le détail du box office est réservé à la version pro. Et donc payant. Du coup, je laisse tomber cette piste.

Mais c'était sans compter sur Wikipedia, et en l'occurrence leur fantastique Wikidata. Pour simplifier, c'est une grosse base de données avec les informations de Wikipédia sous une forme facilement exploitable par logiciel. Il existe un langage, le SPARQL Protocol and RDF Query Language – c'est un acronyme récursif – qui permet d'aller interroger cette base. On va donc tenter de répondre au problème initial avec tout ça.

Bref, un tour sur Wikidata, et hop, on peut commencer à écrire une requête. Il y a des exemples qui permettent d'avoir un aperçu des fonctionnalités disponibles. Une connaissance de SQL permet de gagner du temps, la logique du langage est similaire.

Après avoir fait quelques tests, voici la requête qui répond au problème :

# Films par nombre d'entrées

# Sélectionner le film, son titre et le nombre d'entrée total
SELECT ?film ?filmLabel ?totalAttendance {
  # Sous-bloc qui permet d'isoler un couple (film, nombre total d'entrées)
  {
    # Sélectionner un film et la somme des champs <attendance> en tant que <totalAttendance>
    SELECT ?film (SUM(?attendance) AS ?totalAttendance) WHERE {
      # Peupler le champ <film> avec les entrées dont la nature (wdt:P31) est un film (wdt:Q11424)
      ?film wdt:P31 wd:Q11424.
      # Peupler le champ <attendance> avec la propriété qui va bien (wdt:P1110)
      ?film wdt:P1110 ?attendance.
      # Ne retenir que les films ayant un nombre d'entrée non nul
      FILTER((?attendance > 0))
    # Grouper les résultats par film (et donc faire la somme par film)
    } GROUP BY ?film
  }
  # Récupérer le titre du film, si possible dans la locale du navigateur, en anglais sinon.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
# Trier le tout par nombre d'entrées décroissantes
} ORDER BY DESC(?totalAttendance)

On exécute et pouf, les résultats arrivent. Vous pouvez tester ici. Pour le fun, j'ai aussi fait de quoi grouper par réalisateur⋅ice, c'est disponible .

# Réalisateur⋅ices par nombre d'entrées
SELECT ?director ?directorLabel ?totalAttendance {
  {
    SELECT ?director (SUM(?attendance) AS ?totalAttendance) WHERE {
      ?film wdt:P31 wd:Q11424.
      ?film wdt:P1110 ?attendance.
      ?film wdt:P57 ?director
      FILTER((?attendance > 0))
    } GROUP BY ?director
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
} ORDER BY DESC(?totalAttendance)

Un exemple de réponse :

director directorLabel totalAttendance
wd:Q945904 Jean Girault 54380833
wd:Q164562 Sergio Leone 39939209
wd:Q703588 Wolfgang Reitherman 37846952
wd:Q75079 Chris Columbus 36534138
wd:Q470798 Gérard Oury 34042827
wd:Q295964 Jon Favreau 31074335
wd:Q20675767 Joe Russo 29940647
wd:Q18018415 Anthony Russo 29940647

Bon, on se rend compte que ça correspond pas trop à ce à quoi on peut s'attendre, le problème étant que les données attendance ne sont pas renseignées de partout.

Morale de l'histoire : ça marche du feu de dieu, mais la qualité du résultat est avant tout basée sur la qualité des contributions de la communauté. Plus on contribuera, mieux ce sera. o/

Vous pouvez réagir à cet article en m'envoyant un mail, à blog[@]middleearth[.]fr. Je répondrais avec plaisir :)