« Triplificator » : différence entre les versions
(→Code) |
(→Code) |
||
Ligne 34 : | Ligne 34 : | ||
== Code == | == Code == | ||
# -*- coding: utf-8 -*- | |||
import requests | |||
from bs4 import BeautifulSoup | |||
Wikipast = ["Naissance", "Décès", "Retraite", "Élection", "Obsèques", "Participation", "Mort", "Démission", | |||
"Nomination", "Diplôme", "Organisation", "Naturalisation", "Invention", "Rôle", "Meurtre", | |||
"Inauguration", "Rencontre", "Mariage"] | |||
VocabORG = ["birth", "death", "retirement", "investiture", "funeral", "participant", "death", "resignation", | |||
"investiture", "graduation", "organization", "naturalization", "creator", "role", "murder", | |||
"inauguration", "Has Met", "marriage"] | |||
LibORG = ["bio", "bio", "bio", "bio", "bio", "bio", "bio","bio","bio","bio","bio","bio", "frbr/core", | |||
"participation","bio","bio","relationship", "bio"] | |||
Types = [["bio:principal"], ["bio:principal"], ["bio:principal"], ["bio:principal"], ["bio:principal"], | |||
["bio:principal"], ["bio:principal"], [], ["bio:principal", "bio:organization"], | |||
["bio:principal", "bio:organization"], ["bio:principal", "bio:organization"], [], | |||
["bio:event", "bio:principal"], ["bio:principal", "bio:nationality"], ["bio:work", "bio:principal"], | |||
["bio:principal", "frbr/core:work"], ["bio:principal", "bio:participant"], ["bio:organization"], | |||
["bio:principal"], [], ["bio:principal"], ["bio:partner"], ["bio:principal", "bio:partner"]] | |||
baseurl = 'http://wikipast.epfl.ch/wikipast/' | |||
names = ['Ferdinand_Hodler'] | |||
for name in names: | |||
Output = "" | |||
fichier = open('Result_' + name + '.txt', "rb+") | |||
result = requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') | |||
soup = BeautifulSoup(result.text, "lxml") | |||
code='' | |||
for primitive in soup.findAll("text"): | |||
code+=primitive.string | |||
entrees = code.split("*") | |||
entrees_avec_resultat = 0 | |||
nombre_total_entrees = len(entrees) | |||
for entree in entrees: | |||
lieu = [] | |||
date = [] | |||
#Trouve la date | |||
date_lieu_action = entree.split("/") | |||
date = date_lieu_action[0] | |||
date = date.replace("[[", "") | |||
date = date.replace("]]", "") | |||
date = ''.join(date.split()) # supprimer tout les whitspaces (tab, retours à la ligne, espace...) | |||
if not date[0].isdigit(): #Si le premier élément n'est pas un nombre, ce n'est probablement pas une date | |||
continue | |||
#Trouve le lieu | |||
if len(date_lieu_action) > 1: #s'il y a plus qu'une date | |||
lieu_action = date_lieu_action[1] | |||
if lieu_action.count(".") > 1: # Si la syntaxe "." après le lieu et "." final est respectée | |||
lieu_action = lieu_action.split(".") | |||
lieu = lieu_action[0] | |||
lieu = lieu.replace("[[", "") | |||
lieu = lieu.replace("]]", "") | |||
lieu = ''.join(lieu.split()) #supprimer tout les whitspaces (tab, retours à la ligne, espace...) | |||
else: | |||
if lieu_action.count("-") == 0: | |||
lieu = "-. " | |||
lieu_action = lieu + lieu_action | |||
lieu_action = lieu_action.split(".") | |||
lieu = lieu_action[0] | |||
split_phase_1 = lieu_action[1].split("[[") | |||
actions = [] | |||
for mot in split_phase_1: | |||
action = mot.split("]]") | |||
actions.append(action[0].strip()) | |||
if "" in actions: # Suppression des cases vides | |||
actions.remove("") | |||
indice_hypermot = 0 | |||
found = 0 | |||
for hypermot in Wikipast: | |||
if len(actions) != 0: | |||
if hypermot == actions[0]: | |||
found = 1 | |||
break | |||
indice_hypermot += 1 | |||
if found: | |||
entrees_avec_resultat += 1 | |||
Output = Output + "_:e a " + LibORG[indice_hypermot] + ":" + VocabORG[ | |||
indice_hypermot] + "\n ; dc:date '" + date + "'\n ; bio:Place '" + lieu + "'\n" | |||
indice_action = 1 | |||
for Type in Types[indice_hypermot]: | |||
Output = Output + " ; " + Type + " '" + actions[indice_action] + "' \n" | |||
indice_action += 1 | |||
fichier.write(Output) | |||
fichier.close() | |||
== Exemples de résultats == | == Exemples de résultats == |
Version du 8 mai 2018 à 08:31
Génère une version RDF du contenu d'une page biographique Wikipast.
Description
Le Triplificator est un bot qui va se charger de convertir l'information contenue dans les datafications biographiques du Wikipast dans le format RDF (Resource Description Framework). Celui-ci est lisible par la majorité des programmes d'ordinateur et cette conversion a donc pour but de pousser la datafication biographique plus loin en la rendant bien plus accessible. Le format RDF est composé de triplets. En effet, l'information est compactée en une série de 3 mots: le Sujet, le Prédicat et l'Objet, qui a pour but de transmettre l'information brute et utile. Enfin, le Triplificator va mettre le contenu RDF sur une nouvelle page texte à laquelle on peut accéder depuis un lien mis à la fin de la biographie sur la page Wikipast.
Fonctionnalités
- Lecture de la page Wiki
- L'information est extraite de la page Wikipast (Web scraping) afin de récupérer les hypermots tels que la date, le lieu et les différentes actions dans chaque ligne de la datafication, que le bot va ensuite classer afin d'y accéder facilement et de les utiliser pour créer les triplés RDF.
- Interprétation du contenu et mise en forme sous format RDF (en utilisant la syntaxe XML??)
- Pour interpréter l'information reçue et la convertir en triplés RDF, nous avons créé une librairie d'évènements tels que "Naissance" ou "Mort" qui sont référencés par rapport au moteur de définitions Vocab.org. A partir de cette librairie, le Triplificator va associer une action venant de la datafication biographique avec son équivalent dans la librairie référencée et va ensuite nous donner un triplé sur l'action en question, qui est donc le prédicat du triplé, le sujet étant toujours le nom du personnage de la biographie et l'objet pouvant varier selon la cible du prédicat. Il est important de noter que l'on suppose que la syntaxe des biographies ait été respectée afin d'assurer le bon fonctionnement du Triplificator.
- Mise en ligne de la nouvelle page
Problèmes rencontrés et éventuelles améliorations
- Librairie de prédicats
- Un des problèmes majeurs lié à la conversion en format RDF est la retransmission des prédicats. En effet, la liste des mots que nous avons référencés étant créée en interne, nous possédons un nombre limité de ces mots. Ceci donne lieu à un fichier RDF qui ne contient pas la totalité des entrées de chaque datafication biographique car le bot n'y reconnaît simplement pas tous les prédicats. Il est également important de noter que notre liste a été créée à partir d'une seule source de référence (Vocab.org). Une amélioration possible de notre bot serait donc d'utiliser soit plusieurs sources, soit une plus grande librairie de références, ou encore de faire en sorte que le bot puisse accéder directement à la(aux) source(s) et qu'il construise en amont et par lui-même un dictionnaire de prédicats référencés.
- Syntaxe Wikipast
- Comme mentionné dans une section précédente, nous avons supposé la que la syntaxe Wiki ait été parfaitement respectée, à savoir "DATE / LIEU. ACTION PERSONNAGE OBJET", afin que le Triplificator puisse agir correctement sur la page d'une biographie. Bien que nous ayons légèrement amélioré le bon fonctionnement du bot pour une mauvaise syntaxe, par exemple en précisant que le lieu n'a pas été indiqué dans une ligne mais que le bot continue de la lire correctement pour en extraire les bonnes informations, nous nous concentrons sur la conversion RDF en elle-même et nous comptons sur le travail d'un autre bot qui pourrait éventuellement corriger la syntaxe d'une page biographique, où notre bot pourrait alors effectuer son travail de "triplification".
- Format XML
- Afin que le document RDF puisse être lisible facilement par n'importe quelle plateforme, l'idéal aurait été de convertir en format XML (Extensible Markup Language) qui est le format de référence, tout d'abord pour transporter de l'information en général, mais plus précisément celui utilisé pour écrire un fichier RDF la majorité du temps. La conversion en un tel format étant un travail à part entière et différent de notre objectif principal, nous avons également choisi de la laisser en éventuelle amélioration qui est réalisable dans le futur.
Code
# -*- coding: utf-8 -*-
import requests from bs4 import BeautifulSoup
Wikipast = ["Naissance", "Décès", "Retraite", "Élection", "Obsèques", "Participation", "Mort", "Démission",
"Nomination", "Diplôme", "Organisation", "Naturalisation", "Invention", "Rôle", "Meurtre", "Inauguration", "Rencontre", "Mariage"]
VocabORG = ["birth", "death", "retirement", "investiture", "funeral", "participant", "death", "resignation",
"investiture", "graduation", "organization", "naturalization", "creator", "role", "murder", "inauguration", "Has Met", "marriage"]
LibORG = ["bio", "bio", "bio", "bio", "bio", "bio", "bio","bio","bio","bio","bio","bio", "frbr/core",
"participation","bio","bio","relationship", "bio"]
Types = [["bio:principal"], ["bio:principal"], ["bio:principal"], ["bio:principal"], ["bio:principal"],
["bio:principal"], ["bio:principal"], [], ["bio:principal", "bio:organization"], ["bio:principal", "bio:organization"], ["bio:principal", "bio:organization"], [], ["bio:event", "bio:principal"], ["bio:principal", "bio:nationality"], ["bio:work", "bio:principal"], ["bio:principal", "frbr/core:work"], ["bio:principal", "bio:participant"], ["bio:organization"], ["bio:principal"], [], ["bio:principal"], ["bio:partner"], ["bio:principal", "bio:partner"]]
baseurl = 'http://wikipast.epfl.ch/wikipast/'
names = ['Ferdinand_Hodler']
for name in names:
Output = "" fichier = open('Result_' + name + '.txt', "rb+") result = requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup = BeautifulSoup(result.text, "lxml")
code=
for primitive in soup.findAll("text"): code+=primitive.string
entrees = code.split("*") entrees_avec_resultat = 0
nombre_total_entrees = len(entrees)
for entree in entrees:
lieu = [] date = []
#Trouve la date date_lieu_action = entree.split("/") date = date_lieu_action[0] date = date.replace("[[", "") date = date.replace("]]", "") date = .join(date.split()) # supprimer tout les whitspaces (tab, retours à la ligne, espace...) if not date[0].isdigit(): #Si le premier élément n'est pas un nombre, ce n'est probablement pas une date continue
#Trouve le lieu if len(date_lieu_action) > 1: #s'il y a plus qu'une date
lieu_action = date_lieu_action[1]
if lieu_action.count(".") > 1: # Si la syntaxe "." après le lieu et "." final est respectée lieu_action = lieu_action.split(".") lieu = lieu_action[0] lieu = lieu.replace("[[", "") lieu = lieu.replace("]]", "") lieu = .join(lieu.split()) #supprimer tout les whitspaces (tab, retours à la ligne, espace...) else: if lieu_action.count("-") == 0: lieu = "-. " lieu_action = lieu + lieu_action lieu_action = lieu_action.split(".") lieu = lieu_action[0]
split_phase_1 = lieu_action[1].split("[[")
actions = []
for mot in split_phase_1: action = mot.split("]]") actions.append(action[0].strip())
if "" in actions: # Suppression des cases vides actions.remove("")
indice_hypermot = 0 found = 0
for hypermot in Wikipast: if len(actions) != 0: if hypermot == actions[0]: found = 1 break indice_hypermot += 1
if found: entrees_avec_resultat += 1 Output = Output + "_:e a " + LibORG[indice_hypermot] + ":" + VocabORG[ indice_hypermot] + "\n ; dc:date '" + date + "'\n ; bio:Place '" + lieu + "'\n"
indice_action = 1 for Type in Types[indice_hypermot]: Output = Output + " ; " + Type + " '" + actions[indice_action] + "' \n" indice_action += 1
fichier.write(Output) fichier.close()
Exemples de résultats
- Exemple sur bonne syntaxe
- Exemple sur syntaxe fausse (lieu)