« Triplificator » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
 
(104 versions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
Despcription: Génère une version RDF du contenu d'une page Wikipast.
Génère un document RDF à partir du contenu d'une page biographique de Wikipast.


== Description ==
== Description ==


Le [[Triplificator]] est un bot qui, comme son nom l'indique, 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 [[Triplificator]] est un bot qui va se charger d'exprimer l'information contenue dans les datafications biographiques de Wikipast à l'aide de la structure '''RDF''' ('''R'''esource '''D'''escription '''F'''ramework). Celle-ci permet d'organiser l'information non structurée des pages Wikipast en la rendant interprétable par la majorité des applications. Cette conversion a donc pour but d'augmenter la portée des datafications biographiques en permettant le traitement automatique de leur contenu par des applications externes.
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.
 
Une page Wikipast structurée en RDF est composée de triplets RDF. En effet, l'information contenue dans une entrée est résumée à l'aide de l'association de 3 mots, le '''Sujet''', le '''Prédicat''' et l''''Objet''', qui établit le lien existant entre les éléments contenus dans l'information non structurée. 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 ==
== Fonctionnalités ==
* Lecture de la page Wiki
* 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. Le bot va ensuite  
:: Le contenu de la page Wikipast est extraite afin de récupérer les hypermots tels que la date, le lieu et les différentes actions dans chaque entrée de la datafication. Le bot va ensuite classer ces hypermots afin d'y accéder facilement et de les utiliser pour créer les triplets RDF.
   
   
* Interprétation du contenu et mise en forme sous format RDF (en utilisant la syntaxe XML??)
* Interprétation du contenu et mise en forme sous format RDF


:: 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 [http://purl.org/vocab/ 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.
:: Pour interpréter l'information extraite et la convertir en triplets RDF, nous avons créé un dictionnaire python associant à chaque élément d'un échantillon d'hypermots de Wikipast, tel que "Naissance" ou "Mort", au terme correspondant du vocabulaire que nous avons choisi d'utilisé [http://purl.org/vocab/ Vocab.org]. A partir de cette librairie, le [[Triplificator]] va associer une action venant de la datafication biographique avec son équivalent dans le dictionnaire et va ensuite nous donner un triplet avec comme prédicat l'action en question, comme sujet le deuxième hypermot de l'entrée et l'objet pouvant varier selon la cible du prédicat, correpondant au troisième hypermot de l'entrée. 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
* Mise en ligne de la nouvelle page
:: Afin de permettre la lecture du contenu RDF créé par des applications externes, nous avons choisi de créer une nouvelle page appelée "NOM RDF" et d'y ajouter le contenu RDF sous forme de texte ne respectant pas la syntaxe Wiki.
== Problèmes rencontrés et éventuelles améliorations ==
* Vocabulaire utilisé pour les prédicats
:: Un des problèmes majeurs lié à la conversion en format RDF est l'établissement des correspondances entre les hypermots utilisés dans les datafications et la base de donnée utilisée. En effet, la liste des mots que nous avons référencés étant créée par nos soins, nous possédons un nombre limité de ces mots (voir création de la base de données dans le code). 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 hypermots. Il est également important de noter que notre liste a été créée à partir d'un seul vocabulaire de référence ([http://purl.org/vocab/ Vocab.org]). Une amélioration possible de notre bot serait donc d'utiliser soit plusieurs sources, soit un plus grand vocabulaire de référence, 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. Le vocabulaire que nous avons utilisé est en anglais et la traduction ayant été faite par nos soins, une certaine part de subjectivité dans le sens des termes employés reste présente.
* 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. Nous avons mis en place les solutions suivantes afin de nous parer aux éventuelles erreurs de syntaxe. Bien que nous ayons amélioré le fonctionnement du bot lorsque celui-ci rencontre des erreurs de syntaxe, par exemple en précisant que le lieu n'a pas été indiqué en écrivant un "-" et en s'assurant que le bot continue de lire correctement les informations suivantes, nous nous sommes  concentrés 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 avant que notre bot effectue son travail de "triplification".
* Format XML
:: Afin que le document RDF puisse être lisible facilement par n'importe quelles applications, l'idéal aurait été d'utiliser la syntaxe '''XML''' ('''Ex'''tensible '''M'''arkup '''L'''anguage) qui est la syntaxe de référence pour partager de l'information entre différentes machines et systèmes d'exploitation et qui est plus précisément un standard dans l'écriture de fichiers RDF. La conversion en une telle syntaxe étant un projet à part entière et différent de notre objectif principal, nous avons choisi de suivre le format présenté sur le site [http://purl.org/vocab/ Vocab.org] et de laisser ce second projet en éventuelle amélioration qui est réalisable dans le futur.
== Exemple de résultat ==
Exemple de résultat après avoir fait tourner le bot sur la page Wikipast de [[Jean-Paul Sartre]]: une nouvelle page intitulée "Jean-Paul Sartre RDF" est générée et un lien vers cette page est ajouté au bas de la page d'origine.
[[Fichier:ExempleTriplificator.png|500px]]
== Analyse des performances ==
Ce diagramme en colonnes montre le ratio entre le nombre d'entrées convertie en RDF et le nombre d'entrées totales, entendues comme les lignes contenant une date et un lieu.
En moyenne, 18.12% de l'information contenue dans les datafications biographiques faites cette année est convertie en RDF. Le trait orange ci-dessous représente cette moyenne. Celle-ci est relativement basse pour deux raisons principales: les datafications ne respectent pas toutes la syntaxe comprise par notre bot et notre base de données de termes est limitée.
[[Fichier:StatsTriplificator.png | 1000px]]
== Code ==
== Code ==
== Exemples de résultats ==
 
<nowiki># -*- coding: utf-8 -*-
 
import requests
from bs4 import BeautifulSoup
 
# Création de la base de données
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:position"], ["bio:principal"],
                ["bio:principal"], ["bio:principal"], [], ["bio:principal", "bio:position", "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"]]
 
# Construction d'un dictionnaire contenant les données
BDD = {}
for terme in Wikipast:
    indice = Wikipast.index(terme)
    BDD[terme] = (VocabORG[indice], LibORG[indice], Types[indice])
 
# Extraction des noms
 
noms = []
baseurl = 'http://wikipast.epfl.ch/wikipast/'
 
resultat = requests.post(baseurl+'api.php?action=query&titles='+'Biographies'+'&export&exportnowrap')
soup = BeautifulSoup(resultat.text, "lxml")
code_noms=''
 
for primitive in soup.findAll("text"):
    code_noms += primitive.string
 
for phrase in code_noms.split("| [["):
    nom = phrase.split("]]")
    nom = nom[0].strip()
    nom = nom.replace(' ','_')
    noms.append(nom)
 
noms = noms [1:]
 
# Traitement de chaque datafication biographique par le bot
 
for nom in noms:
 
    sortie = ""
    code = ''
    result = requests.post(baseurl + 'api.php?action=query&titles=' + nom + '&export&exportnowrap')
    soup = BeautifulSoup(result.text, "lxml")
 
    for primitive in soup.findAll("text"):
        code += primitive.string
 
    entrees = code.split("*")
    entrees_avec_resultat = 0
 
    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) or 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]
 
            lieu_action = lieu_action.replace("[https:","")
            lieu_action = lieu_action.replace("[http:", "")
 
            points = lieu_action.count('.')
 
            if lieu_action.endswith('.'):
                if points > 1:
                    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:
                    lieu = '-'
                    lieu_action = [lieu] + [lieu_action]
            else:
                if points !=0:
                    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:
                    lieu = '-'
                    lieu_action = [lieu] + [lieu_action]
 
        if len(lieu_action) < 2:
          continue
 
        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:
            actions.remove("")
 
        if len(actions) != 0:
            for hypermot in BDD:
                if hypermot == actions[0]:
                    entrees_avec_resultat += 1
                    sortie = sortie + "_:e a " + BDD[hypermot][1] + ":" + BDD[hypermot][0] + "\n  ; dc:date '" + date + "'\n  ; bio:Place '" + lieu + "'\n"
 
                    for type in BDD[hypermot][2]:
                        indice = BDD[hypermot][2].index(type) + 1
                        try: actions[indice]
                        except: continue
                        sortie = sortie + "  ; " + type + " '" + actions[indice] + "' \n"
                    sortie += "\n"
 
    # Création de la page RDF correspondante
    if entrees_avec_resultat > 1:
 
        nouveau_nom = nom.replace('_',' ') + " RDF"
 
        user='Triplificator'
        passw='RDF2018'
 
        summary='Triplificator update'
 
        payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
        r1=requests.post(baseurl + 'api.php', data=payload)
 
        login_token=r1.json()['query']['tokens']['logintoken']
        payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
        r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)
 
        params3='?format=json&action=query&meta=tokens&continue='
        r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies)
        edit_token=r3.json()['query']['tokens']['csrftoken']
 
        edit_cookie=r2.cookies.copy()
        edit_cookie.update(r3.cookies)
 
        content= ''
        content+='<nowiki>\n'
        content+= sortie
        content+='</nowiki>\n'
        content+='Page originale: [['+nom.replace('_',' ')+']]\n'
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':nouveau_nom,'token':edit_token}
        to_replace = 'Version RDF : [['+nouveau_nom+']]'
        code = code.replace(to_replace,' ')
        payload2 = {'action': 'edit', 'assert': 'user', 'format': 'json', 'utf8': '', 'text': code + '\n' + 'Version RDF : [['+nouveau_nom+']]', 'summary': summary, 'title': nom, 'token': edit_token}
        r4 = requests.post(baseurl + 'api.php', data=payload, cookies=edit_cookie)
        r4=requests.post(baseurl+'api.php',data=payload2,cookies=edit_cookie)

Dernière version du 22 mai 2018 à 09:43

Génère un document RDF à partir du contenu d'une page biographique de Wikipast.

Description

Le Triplificator est un bot qui va se charger d'exprimer l'information contenue dans les datafications biographiques de Wikipast à l'aide de la structure RDF (Resource Description Framework). Celle-ci permet d'organiser l'information non structurée des pages Wikipast en la rendant interprétable par la majorité des applications. Cette conversion a donc pour but d'augmenter la portée des datafications biographiques en permettant le traitement automatique de leur contenu par des applications externes.

Une page Wikipast structurée en RDF est composée de triplets RDF. En effet, l'information contenue dans une entrée est résumée à l'aide de l'association de 3 mots, le Sujet, le Prédicat et l'Objet, qui établit le lien existant entre les éléments contenus dans l'information non structurée. 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
Le contenu de la page Wikipast est extraite afin de récupérer les hypermots tels que la date, le lieu et les différentes actions dans chaque entrée de la datafication. Le bot va ensuite classer ces hypermots afin d'y accéder facilement et de les utiliser pour créer les triplets RDF.
  • Interprétation du contenu et mise en forme sous format RDF
Pour interpréter l'information extraite et la convertir en triplets RDF, nous avons créé un dictionnaire python associant à chaque élément d'un échantillon d'hypermots de Wikipast, tel que "Naissance" ou "Mort", au terme correspondant du vocabulaire que nous avons choisi d'utilisé Vocab.org. A partir de cette librairie, le Triplificator va associer une action venant de la datafication biographique avec son équivalent dans le dictionnaire et va ensuite nous donner un triplet avec comme prédicat l'action en question, comme sujet le deuxième hypermot de l'entrée et l'objet pouvant varier selon la cible du prédicat, correpondant au troisième hypermot de l'entrée. 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
Afin de permettre la lecture du contenu RDF créé par des applications externes, nous avons choisi de créer une nouvelle page appelée "NOM RDF" et d'y ajouter le contenu RDF sous forme de texte ne respectant pas la syntaxe Wiki.

Problèmes rencontrés et éventuelles améliorations

  • Vocabulaire utilisé pour les prédicats
Un des problèmes majeurs lié à la conversion en format RDF est l'établissement des correspondances entre les hypermots utilisés dans les datafications et la base de donnée utilisée. En effet, la liste des mots que nous avons référencés étant créée par nos soins, nous possédons un nombre limité de ces mots (voir création de la base de données dans le code). 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 hypermots. Il est également important de noter que notre liste a été créée à partir d'un seul vocabulaire de référence (Vocab.org). Une amélioration possible de notre bot serait donc d'utiliser soit plusieurs sources, soit un plus grand vocabulaire de référence, 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. Le vocabulaire que nous avons utilisé est en anglais et la traduction ayant été faite par nos soins, une certaine part de subjectivité dans le sens des termes employés reste présente.
  • 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. Nous avons mis en place les solutions suivantes afin de nous parer aux éventuelles erreurs de syntaxe. Bien que nous ayons amélioré le fonctionnement du bot lorsque celui-ci rencontre des erreurs de syntaxe, par exemple en précisant que le lieu n'a pas été indiqué en écrivant un "-" et en s'assurant que le bot continue de lire correctement les informations suivantes, nous nous sommes concentrés 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 avant que notre bot effectue son travail de "triplification".
  • Format XML
Afin que le document RDF puisse être lisible facilement par n'importe quelles applications, l'idéal aurait été d'utiliser la syntaxe XML (Extensible Markup Language) qui est la syntaxe de référence pour partager de l'information entre différentes machines et systèmes d'exploitation et qui est plus précisément un standard dans l'écriture de fichiers RDF. La conversion en une telle syntaxe étant un projet à part entière et différent de notre objectif principal, nous avons choisi de suivre le format présenté sur le site Vocab.org et de laisser ce second projet en éventuelle amélioration qui est réalisable dans le futur.

Exemple de résultat

Exemple de résultat après avoir fait tourner le bot sur la page Wikipast de Jean-Paul Sartre: une nouvelle page intitulée "Jean-Paul Sartre RDF" est générée et un lien vers cette page est ajouté au bas de la page d'origine.


ExempleTriplificator.png

Analyse des performances

Ce diagramme en colonnes montre le ratio entre le nombre d'entrées convertie en RDF et le nombre d'entrées totales, entendues comme les lignes contenant une date et un lieu. En moyenne, 18.12% de l'information contenue dans les datafications biographiques faites cette année est convertie en RDF. Le trait orange ci-dessous représente cette moyenne. Celle-ci est relativement basse pour deux raisons principales: les datafications ne respectent pas toutes la syntaxe comprise par notre bot et notre base de données de termes est limitée.


StatsTriplificator.png

Code

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup

# Création de la base de données
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:position"], ["bio:principal"],
                 ["bio:principal"], ["bio:principal"], [], ["bio:principal", "bio:position", "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"]]

# Construction d'un dictionnaire contenant les données
BDD = {}
for terme in Wikipast:
    indice = Wikipast.index(terme)
    BDD[terme] = (VocabORG[indice], LibORG[indice], Types[indice])

# Extraction des noms

noms = []
baseurl = 'http://wikipast.epfl.ch/wikipast/'

resultat = requests.post(baseurl+'api.php?action=query&titles='+'Biographies'+'&export&exportnowrap')
soup = BeautifulSoup(resultat.text, "lxml")
code_noms=''

for primitive in soup.findAll("text"):
    code_noms += primitive.string

for phrase in code_noms.split("| [["):
    nom = phrase.split("]]")
    nom = nom[0].strip()
    nom = nom.replace(' ','_')
    noms.append(nom)

noms = noms [1:]

# Traitement de chaque datafication biographique par le bot

for nom in noms:

    sortie = ""
    code = ''
    result = requests.post(baseurl + 'api.php?action=query&titles=' + nom + '&export&exportnowrap')
    soup = BeautifulSoup(result.text, "lxml")

    for primitive in soup.findAll("text"):
        code += primitive.string

    entrees = code.split("*")
    entrees_avec_resultat = 0

    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) or 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]

            lieu_action = lieu_action.replace("[https:","")
            lieu_action = lieu_action.replace("[http:", "")

            points = lieu_action.count('.')

            if lieu_action.endswith('.'):
                if points > 1:
                    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:
                    lieu = '-'
                    lieu_action = [lieu] + [lieu_action]
            else:
                if points !=0:
                    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:
                    lieu = '-'
                    lieu_action = [lieu] + [lieu_action]

        if len(lieu_action) < 2:
           continue

        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:
            actions.remove("")

        if len(actions) != 0:
            for hypermot in BDD:
                if hypermot == actions[0]:
                    entrees_avec_resultat += 1
                    sortie = sortie + "_:e a " + BDD[hypermot][1] + ":" + BDD[hypermot][0] + "\n   ; dc:date '" + date + "'\n   ; bio:Place '" + lieu + "'\n"

                    for type in BDD[hypermot][2]:
                        indice = BDD[hypermot][2].index(type) + 1
                        try: actions[indice]
                        except: continue
                        sortie = sortie + "   ; " + type + " '" + actions[indice] + "' \n"
                    sortie += "\n"

    # Création de la page RDF correspondante
    if entrees_avec_resultat > 1:

        nouveau_nom = nom.replace('_',' ') + " RDF"

        user='Triplificator'
        passw='RDF2018'

        summary='Triplificator update'

        payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
        r1=requests.post(baseurl + 'api.php', data=payload)

        login_token=r1.json()['query']['tokens']['logintoken']
        payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
        r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)

        params3='?format=json&action=query&meta=tokens&continue='
        r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies)
        edit_token=r3.json()['query']['tokens']['csrftoken']

        edit_cookie=r2.cookies.copy()
        edit_cookie.update(r3.cookies)

        content= ''
        content+='<nowiki>\n'
        content+= sortie
        content+='\n'
        content+='Page originale: '+nom.replace('_',' ')+'\n'
       payload={'action':'edit','assert':'user','format':'json','utf8':,'text':content,'summary':summary,'title':nouveau_nom,'token':edit_token}
       to_replace = 'Version RDF : '+nouveau_nom+''
       code = code.replace(to_replace,' ')
       payload2 = {'action': 'edit', 'assert': 'user', 'format': 'json', 'utf8': , 'text': code + '\n' + 'Version RDF : '+nouveau_nom+'', 'summary': summary, 'title': nom, 'token': edit_token}
       r4 = requests.post(baseurl + 'api.php', data=payload, cookies=edit_cookie)
       r4=requests.post(baseurl+'api.php',data=payload2,cookies=edit_cookie)