Le Levante, géographie d’une perception
Introduction
Le Levante est un lieu qui se dérobe. On ne le définit jamais que par rapport à un autre territoire, ou contre lui ; aussi son sens n’a-t-il guère été stable, et le mot a désigné des géographies fort différentes selon le lieu et l’époque où on l’employait. Mais si une définition objective et précise reste hors de portée, on peut du moins tenter d’en dresser une carte subjective, en s’appuyant sur les corrélations qu’un corpus donné laisse apparaître. Autrement dit : quel espace le Levante évoquait-il pour tel groupe de lecteurs ?
Je montre dans ce billet comment exploiter les données de la base MIA du Medici Archive Project
pour visualiser les lieux auxquels ce toponyme se trouvait associé.
La base MIA
MIA est une plateforme collaborative où les chercheurs déposent et partagent leurs propres photographies de documents conservés aux Archives d’État de Florence. Depuis un an, avec le soutien du National Endowment for the Humanities, notre équipe a photographié, transcrit, résumé et classé des milliers de documents de la section des avvisi du fonds Mediceo del Principato. La base n’a pas été conçue d’abord pour l’analyse statistique ; il n’en reste pas moins que les métadonnées que nous avons mises en ligne se laissent télécharger et traiter comme des jeux de données.
Le jeu de données
Le jeu que j’ai constitué ici couvre toutes les nouvelles du Levante de 1543 à 1566, c’est-à-dire du premier avviso conservé dans le fonds jusqu’à l’année de la mort du sultan Soliman Ier. En voici un échantillon, tel que je l’ai extrait du serveur : trois colonnes, avec le numéro unique du document, un nom de lieu et une date.
57386 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3
57386 Modon / Messinias, Nomos / Peloponnisos / Ellas 1565-1-3
57386 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3
57386 Evvoia / Evvoias, Nomos / Sterea Ellas-Evvoia / Ellas 1565-1-3
57386 Venetian Republic / Italia / Europe / World 1565-1-3
57386 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3
57386 Black Sea / Asia / World / Top of the TGN hierarchy 1565-1-3
57389 Otranto / Lecce / Puglia / Italia 1565-1-3
57389 Nisoi Aiyaiou / Ellas / Europe / World 1565-1-3
57389 Malta / Europe / World / Top of the TGN hierarchy 1565-1-3
57389 Buda / Budapest / Budapest / Magyarorszag 1565-1-3
57389 Al-Iskandariyah / Muhafazat al Iskandariyah / Egypt / Africa 1565-1-3
57389 Kipros / Asia / World / Top of the TGN hierarchy 1565-1-3
57389 Rodhos / Rodos, Nisos / Sporadhes / Nisoi Aiyaiou 1565-1-3
57389 Arsenale / Istanbul / Istanbul / Marmara 1565-1-3
57389 Çorlu / Thraki / Ellas / Europe 1565-1-3
Toilette des données
Avant toute visualisation, il faut mettre ces données au format csv (valeurs séparées par des virgules), et traduire l’information géographique qu’elles contiennent dans une langue que la machine entende mieux : celle des coordonnées GPS. Comme le jeu compte des centaines d’entrées, on préférera automatiser l’opération. Des modèles de langue pré-entraînés comme GPT-3, Bloom ou AI-21, pour ne citer qu’eux, s’en acquittent vite et plutôt bien ; mais il faut les surveiller de près, car ces modèles ont une légère propension à l’hallucination.
documentId,latitude,longitude,documentDate
57386,35.899167,14.514167,1565-1-3
57386,37.05,22.116667,1565-1-3
57386,31.200028,29.918719,1565-1-3
57386,38.366667,23.666667,1565-1-3
57386,45.438333,12.331333,1565-1-3
57386,41.018611,28.984444,1565-1-3
57386,42.7,18.8,1565-1-3
57389,40.216667,18.166667,1565-1-3
57389,37.966667,23.716667,1565-1-3
57389,35.899167,14.514167,1565-1-3
57389,47.4925,19.051389,1565-1-3
57389,31.200028,29.918719,1565-1-3
57389,34.916667,33.616667,1565-1-3
57389,36.405419,28.227778,1565-1-3
57389,41.018611,28.984444,1565-1-3
57389,41.133333,27.416667,1565-1-3
La carte de densité
Une carte de densité fait ressortir la fréquence avec laquelle chaque lieu est cité dans un jeu de données. On y lit non seulement l’étendue géographique du corpus, mais aussi ses foyers : quels lieux reviennent sans cesse, lesquels ne font que passer ? Où sont les centres, et jusqu’où s’étend la périphérie ? Vers quel point de la carte, en somme, l’attention d’un lecteur avait-elle le plus de chances de se porter ?
Pour cette expérience – et parce que le temps pressait – j’ai eu recours à l’une des API de Mapbox ; mais bien des bibliothèques de visualisation et des systèmes d’information géographique produisent le même genre de carte.
Quelques observations
Le résultat tient plus du tableau impressionniste que de la représentation exacte d’un concept bien délimité, et c’est justement ce qui me plaît dans l’exercice : la science des données peut être une alliée précieuse des humanités, sans que nous soyons tenus pour autant de nous plier à ses règles.
Autre enseignement : la carte fait voir un Levante pleinement intégré au reste de l’Europe et de la Méditerranée. Elle met en lumière la place centrale d’Edirne dans la géographie politique de l’Empire ottoman. La ville d’Espagne qui y pèse le plus n’est ni Madrid ni l’Escurial, mais Naples. Enfin, et ce n’est pas le moindre, les îles et les petites cités-États comme Raguse semblent avoir joué un rôle d’intermédiaire de premier plan entre les puissances de la région.
Comment obtenir les données de MIA
MIA est un remarquable outil de travail collectif, mais les données de ses serveurs ne se laissent pas prendre facilement ; la salle des machines, par exemple, n’est publiée dans aucun dépôt public. On peut cependant les obtenir en s’inscrivant sur MIA, puis en interrogeant le serveur depuis Python.
Requête
url = "https://mia.medici.org/Mia/json/de/advancedsearch/advancedSearchResults/0/90/docYear/asc/?isNewsFeedSearch=False"
payload = [{"searchSection":"archivalLocationSearch","type":"archivalLocationAdvancedSearch","isActiveFilter":True,"repository":None,"collection":"Mediceo del Principato","series":None,"volume":"2863","insert":None},{"searchSection":"categoryAndTypologySearch","type":"categoryAndTypologyAdvancedSearch","isActiveFilter":True,"category":"News","typology":None},{"searchSection":"transcriptionSearch","type":"transcriptionAdvancedSearch","isActiveFilter":False,"transcription":""},{"isActiveFilter":False,"searchSection":"synopsisSearch","type":"synopsisAdvancedSearch","synopsis":""},{"searchSection":"placesSearch","type":"placesAdvancedSearch","isActiveFilter":False,"places":[]},{"searchSection":"peopleSearch","type":"peopleAdvancedSearch","isActiveFilter":False,"people":[]},{"searchSection":"topicsSearch","type":"topicsAdvancedSearch","isActiveFilter":True,"topics":[{"topicTitle":"Place Index","topicId":"51","placeAllId":""}]},{"searchSection":"dateSearch","type":"dateAdvancedSearch","isActiveFilter":False,"dateFilterType":"","dateYear":"","dateMonth":"","dateDay":"","dateBYear":"","dateBMonth":"","dateBDay":""},{"searchSection":"documentOwnerSearch","type":"documentOwnerAdvancedSearch","isActiveFilter":False,"editType":"owner","account":""},{"searchSection":"languagesSearch","type":"languagesAdvancedSearch","isActiveFilter":False,"languages":[]}]
headers = {'Content-type': 'application/json', 'Accept': '*/*'}
r = requests.post(url, data=json.dumps(payload), headers=headers, auth=('LOGIN','PASSWORD'))
Remplacez LOGIN et PASSWORD par vos propres identifiants.
Écrire la réponse dans un fichier
with open('response.json', 'wb') as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
Ouvrir le JSON
f = open('response.json', encoding="utf8")
Charger l’objet JSON dans un dictionnaire
json_complete = json.load(f)
Extraire les données du JSON et les écrire au format CSV
with open('results.csv', 'w', newline='') as csvfile:
fieldnames = ['documentId', 'placeCited', 'documentDate']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for i in json_complete['data']:
if i['topics'] != None:
for x in i['topics']:
documentId=x['documentId']
placeCited=x['topicPlaceName']
year=i['date']['docYear']
month=i['date']['docMonth']
day=i['date']['docDay']
documentDate=str(year)+ "-" + str(month)+"-" + str(day)
writer.writerow({'documentId': documentId, 'placeCited': placeCited, 'documentDate': documentDate})
Une fois le fichier results.csv en main, il ne reste qu’à procéder à la toilette des données décrite plus haut.
