Reconcile

Pour plus d'infos, consulter cette page.

Créer un service de réconciliation basé sur sa propre instance Wikibase

Cette étape vise à explorer comment nous pouvons créer un service de réconciliation OpenRefine* basé sur sa propre instance Wikibase.

*OpenRefine

De nombreux tutoriels documentent l'usage qui peut être fait d'OpenRefine, notamment dans le secteur des GLAM, nous ne reviendrons donc pas là-dessus dans le cadre de ce document. Citons par exemple la documentation très claire et agréable à consulter, partagée par Mathieu Saby dans le cadre d'un atelier intitulé Nettoyer et préparer des données avec OpenRefine

Un service de réconciliation sur mesure

Comme indiqué sur le dépôt GitHub 'openrefine-wikibase', des adaptations ont été réalisées afin que le service de réconciliation basé sur Wikidata puisse désormais être réutilisé pour n'importe quelle instance Wikibase :

This service can be configured to run against another Wikibase instance than Wikidata. The Wikibase instance will need to have an associated SPARQL Query Service, and some properties and items will need to be set up. All the relevant values must be configured in the config.py file, and an example of this file for Wikidata is provided in config_wikidata.py.

Après avoir veillé à installer sa propre Wikibase et adapté le fichier de configuration, il est donc possible de lancer son propre service de réconciliation, qui disposera des fonctionnalités suivantes (https://github.com/wetneb/openrefine-wikibase/blob/master/README.md :

  • Matching columns with Wikibase properties, to improve the fuzzy matching score ;
  • Autocomplete for properties and items ;
  • Support for SPARQL-like property paths such as "P17/P297" ;
  • Language selection ;
  • Reconciliation from sitelinks

Configuration

Le fichier ci-dessous reprend la configuration minimale utilisée pour tester le service de réconciliation basée sur le SPARQL endpoint de notre instance Wikibase.

Pour un usage approfondi, il serait utile d'affiner cette configuration, en partant de l'exemple fourni pour Wikidata.

In [ ]:
"""
This file defines a few constants which configure
which Wikibase instance and which property/item ids
should be used
"""

# Endpoint of the MediaWiki API of the Wikibase instance
mediawiki_api_endpoint = 'https://adochs.arch.be/w/api.php' #'https://www.wikidata.org/w/api.php'

# Regexes and group ids to extracts Qids and Pids from URLs
import re
q_re = re.compile(r'(<?https?://adochs.arch.be/(entity|wiki)/)?(Q[0-9]+)>?')
q_re_group_id = 3
p_re = re.compile(r'(<?https?://adochs.arch.be/(entity/|wiki/Property:))?(P[0-9]+)>?')
p_re_group_id = 3

# Identifier space and schema space exposed to OpenRefine.
# This should match the IRI prefixes used in RDF serialization.
# Note that you should be careful about using http or https there,
# because any variation will break comparisons at various places.
identifier_space = 'https://adochs.arch.be/entity/'
schema_space = 'https://adochs.arch.be/prop/direct/'

# Pattern used to form the URL of a Qid.
# This is only used for viewing so it is fine to use any protocol (therefore, preferably HTTPS if supported)
qid_url_pattern = 'https://adochs.arch.be/wiki/Item:'

# By default, filter out any items which are instance
# of a subclass of this class.
# For Wikidata, this is "Wikimedia internal stuff".
# This filters out the disambiguation pages, categories, ...
# Set to None to disable this filter
avoid_items_of_class = None

# Service name exposed at various places,
# mainly in the list of reconciliation services of users
service_name = 'Adochs Reconciliation Service'

# URL (without the trailing slash) where this server runs
this_host = 'http://localhost:8000'

# The default limit on the number of results returned by us
default_num_results = 25

# The maximum number of search results to retrieve from the Wikidata search API
wd_api_max_search_results = 50 # need a bot account to get more

# The matching score above which we should automatically match an item
validation_threshold = 95

# Redis client used for caching at various places
import redis
redis_client = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)

# Redis prefix to use in front of all keys
redis_key_prefix = 'openrefine-wikidata:'

# Headers for the HTTP requests made by the tool
headers = {
    'User-Agent':service_name + ' (OpenRefine-Wikibase reconciliation service)',
}

# Previewing settings

# Dimensions of the preview
zoom_ratio = 1.0
preview_height = 500
preview_width = 400

# With which should be requested from Commons for the thumbnail
thumbnail_width = 130

# All properties to use to get an image 
image_properties = [
    'P56'
]

# URL pattern to retrieve an image from its filename
image_download_pattern = 'https://upload.wikimedia.org/wikipedia/commons/thumb/%s/%s/%s/%dpx-%s'

# Fallback URL of the image to use when previewing an item with no image
fallback_image_url = this_host + '/static/cegesoma.png'

# Alt text of the fallback image
fallback_image_alt = 'CegeSoma'

# Autodescribe endpoint to use.
# this is used to generate automatic descriptions from item contents.
# (disable this with: autodescribe_endpoint = None )
autodescribe_endpoint = None #'https://tools.wmflabs.org/autodesc/'

# Property proposal settings

# Default type : entity (Q35120)
default_type_entity = 'Q3617' # = 'Personne' https://adochs.arch.be/wiki/Item:Q3617

# Property to follow to fetch properties for a given type
property_for_this_type_property = 'P13' # ?

# Type expected as target of a given property
subject_item_of_this_property_pid = 'P1629' # ?

Lancer le service à l'aide de Docker

Une fois ce document complété, il suffit d'installer Docker et de lancer les commandes documentées dans le fichier Readme du dépôt GitHub :

In [ ]:
docker pull pintoch/openrefine-wikibase
docker run -p 8000:8000 pintoch/openrefine-wikibase

Si le service est exécuté en local, le service devrait normalement être accessible à : http://localhost:8000/en/api

Capture%20d%E2%80%99e%CC%81cran%202020-05-19%20a%CC%80%2021.05.16.png

Pour info : le service peut être testé à l'aide du Reconciliation test bench.

Pour ajouter le service à OpenRefine

  • créer ou ouvrir un projet
  • cliquer sur l'en-tête d'une colonne
  • cliquer (tout en bas) sur Reconcile
  • cliquer sur Start reconciling...
  • cliquer (tout en bas) sur Add standard service
  • sous Enter the service's URL: copier l'adresse service de réconciliation associé à la Wikibase (ici http://localhost:8000/en/api)

Capture%20d%E2%80%99e%CC%81cran%202020-05-19%20a%CC%80%2017.00.20.png

Le service peut ensuite être utilisé de la même manière que le service de réconciliation basé sur Wikidata (sous réserve de ce qui a été correctement paramétré bien sûr) :

Capture%20d%E2%80%99e%CC%81cran%202020-05-19%20a%CC%80%2020.44.39.png

Cas d'usage

Il est désormais possible de réconcilier des listes de noms de personnes ou de lieux avec les entités stockées dans sa propre instance Wikibase, ce qui élargit les possibles pour une institution confrontée à des doublons, des listes éparses, etc.

En revanche, il n'est pas encore possible de directement injecter des données dans sa Wikibase à partir d'OpenRefine, contrairement à ce que l'outil permet déjà pour Wikidata. Cette demande a toutefois été formulée par des utilisateurs Wikibase et il n'est pas inenvisageable qu'une telle fonctionnalité soit déployée à l'avenir. Pour suivre l'évolution du dossier, voir cette issue.

NB

À l'heure du test effectué sur l'instance Wikibase 'DataCegeSoma', deux problèmes se sont présentés :

  • d'une part, un problème d'accent, qui nécessiterait une investigation plus poussée (voir l'issue signalant le problème)
  • d'autre part, la fonctionnalité de fuzzy matching implémentée pour Wikidata, n'a pas marché lors de nos tests, limitant clairement la puissance/l'utilité de l'outil. (À nouveau, une investigation plus poussée devrait être menée pour creuser la question, voir par exemple cette issue.