« SourceBot » : différence entre les versions
(→Code) |
(Wikipastbot update) |
||
Ligne 5 : | Ligne 5 : | ||
Le bot récupère toutes les données des Datafications Biographiques ainsi que toutes les pages créer par des Bots et détecte pour chaque page, l'absence éventuelle d'une source dans une ligne biographique et la signale. | Le bot récupère toutes les données des Datafications Biographiques ainsi que toutes les pages créer par des Bots et détecte pour chaque page, l'absence éventuelle d'une source dans une ligne biographique et la signale. | ||
Il met à jour une page [[FactChecking]] qui liste les entrées non sourcées en associant une référence particulière à cet inconnue: cette référence est la date associée à l'entrée non sourcée. | Il met à jour une page [[FactChecking]] qui liste les entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
Il scanne régulièrement (toutes les heures) toutes les datafications biographiques ainsi que les autres pages de wikipast et met à jour la page [[FactChecking]]. | </span>) en associant une référence particulière à cet inconnue: cette référence est la date associée à l'entrée non <span style="color:red">sourcée</span> (correction(s): <span style="color:green">source | ||
</span>). | |||
Il scanne régulièrement (toutes les heures) toutes les <span style="color:red">datafications</span> (correction(s): <span style="color:green"> | |||
</span>) biographiques ainsi que les autres pages de <span style="color:red">wikipast</span> (correction(s): <span style="color:green"> | |||
</span>) et met à jour la page [[FactChecking]]. | |||
Pour chaque datification biographique ainsi que pour toutes pages créées depuis le début du cours, notre bot check si toutes les entrées de ces pages sont sourcées, si c'est le cas alors on passe à la suivante datafication, sinon le nom de la datafication ainsi que les différentes dates des entrées non sourcées sont ajoutées au contenu de la page [[FactChecking]]. | Pour chaque <span style="color:red">datification</span> (correction(s): <span style="color:green">ratification | ||
Si une entrée non sourcée est mis à jour et devient sourcée, alors la date de cette entrée disparaitra de la page [[FactChecking]]. | </span>) biographique ainsi que pour toutes pages créées depuis le début du cours, notre bot <span style="color:red">check</span> (correction(s): <span style="color:green">cheik | ||
Les entrées non sourcées comprennent aussi les entrées qui ont une source qui n'est pas letemps.ch. | </span>) si toutes les entrées de ces pages sont <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
</span>), si c'est le cas alors on passe à la suivante <span style="color:red">datafication</span> (correction(s): <span style="color:green"> | |||
</span>), sinon le nom de la <span style="color:red">datafication</span> (correction(s): <span style="color:green"> | |||
</span>) ainsi que les différentes dates des entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | |||
</span>) sont ajoutées au contenu de la page [[FactChecking]]. | |||
Si une entrée non <span style="color:red">sourcée</span> (correction(s): <span style="color:green">source | |||
</span>) est mis à jour et devient <span style="color:red">sourcée</span> (correction(s): <span style="color:green">source | |||
</span>), alors la date de cette entrée <span style="color:red">disparaitra</span> (correction(s): <span style="color:green">disparaîtra | |||
</span>) de la page [[FactChecking]]. | |||
Les entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | |||
</span>) comprennent aussi les entrées qui ont une source qui n'est pas <span style="color:red">letemps</span> (correction(s): <span style="color:green"> | |||
</span>).<span style="color:red">ch</span> (correction(s): <span style="color:green">chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi | |||
</span>). | |||
== Exemples == | == Exemples == | ||
[[Daniel Brélaz]] : | [[Daniel Brélaz]] : | ||
* [[1975]] / [[Lausanne]] [[Diplôme]] en [[mathématiques]] à l'[[EPFL]]. [https://fr.wikipedia.org/wiki/Daniel_Br%C3%A9laz] | * [[1975]] / [[Lausanne]] [[Diplôme]] en [[mathématiques]] à l'[[EPFL]]. [https://fr.<span style="color:red">wikipedia</span> (correction(s): <span style="color:green"> | ||
</span>).org/wiki/Daniel_Br%C3%A9laz] | |||
* [[1978]] / [[Lausanne]] [[Election]] de [[Daniel Brélaz]] à l'[[Assemblée fédérale]]. | * [[1978]] / [[Lausanne]] [[Election]] de [[Daniel Brélaz]] à l'[[Assemblée fédérale]]. | ||
Notre bot recupère la page de [[Daniel Brélaz]] et elle retourne les dates de toute les entrées non-sourcées ou avec une autre source que letemps.ch . | Notre bot <span style="color:red">recupère</span> (correction(s): <span style="color:green">récupère | ||
La première entrée possède un lien vers wikipedia qui n'est pas valide, et la deuxième n'a pas de source. Ce bot écrit sur [[FactChecking]] : | </span>) la page de [[Daniel Brélaz]] et elle retourne les dates de toute les entrées non-<span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
</span>) ou avec une autre source que <span style="color:red">letemps</span> (correction(s): <span style="color:green"> | |||
</span>).<span style="color:red">ch</span> (correction(s): <span style="color:green">chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi | |||
</span>) . | |||
La première entrée possède un lien vers <span style="color:red">wikipedia</span> (correction(s): <span style="color:green"> | |||
</span>) qui n'est pas valide, et la deuxième n'a pas de source. Ce bot écrit sur [[FactChecking]] : | |||
Daniel Brélaz | Daniel Brélaz | ||
The wrong entries in this page are the sources with the following dates: [ 1975 , 1978 ] | The <span style="color:red">wrong</span> (correction(s): <span style="color:green"> | ||
</span>) <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez | |||
</span>) in <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés | |||
</span>) page are <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) sources <span style="color:red">with</span> (correction(s): <span style="color:green">witz | |||
</span>) <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) <span style="color:red">following</span> (correction(s): <span style="color:green"> | |||
</span>) dates: [ 1975 , 1978 ] | |||
[[Paul Maillefer]] : | [[Paul Maillefer]] : | ||
*[[1911]]/[[Suisse]] Deuxième [[Election]] de [[Paul Maillefer]] dans le [[Conseil National]] et succession en [[1912]] au [[Grand Conseil Nationnal]]. [[https://de.wikipedia.org/wiki/Paul_Maillefer]] | *[[1911]]/[[Suisse]] Deuxième [[Election]] de [[Paul Maillefer]] dans le [[Conseil National]] et succession en [[1912]] au [[Grand Conseil Nationnal]]. [[https://de.<span style="color:red">wikipedia</span> (correction(s): <span style="color:green"> | ||
Ici le lien est un lien wikipedia qui n'est pas une source valide. Dans le cas de cette entrée il écrit sur la page [[FactChecking]] : | </span>).org/wiki/Paul_Maillefer]] | ||
Ici le lien est un lien <span style="color:red">wikipedia</span> (correction(s): <span style="color:green"> | |||
</span>) qui n'est pas une source valide. Dans le cas de cette entrée il écrit sur la page [[FactChecking]] : | |||
Paul Maillefer | Paul Maillefer | ||
The wrong entries in this page are the sources with the following dates: [ 1911 ] | The <span style="color:red">wrong</span> (correction(s): <span style="color:green"> | ||
</span>) <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez | |||
</span>) in <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés | |||
</span>) page are <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) sources <span style="color:red">with</span> (correction(s): <span style="color:green">witz | |||
</span>) <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) <span style="color:red">following</span> (correction(s): <span style="color:green"> | |||
</span>) dates: [ 1911 ] | |||
== Performances == | == Performances == | ||
Notre bot repère toutes les entrées des pages des Datafications Biographiques qui ne sont pas ou mal sourcée: | Notre bot repère toutes les entrées des pages des Datafications Biographiques qui ne sont pas ou mal <span style="color:red">sourcée</span> (correction(s): <span style="color:green">source | ||
</span>): | |||
Ensuite celui-ci met à jour la page [[FactChecking]] en écrivant les dates où les sources sont manquantes. | Ensuite celui-ci met à jour la page [[FactChecking]] en écrivant les dates où les sources sont manquantes. | ||
Nous avons commencé par afficher le numéro de la ligne où il n'y avait pas de source, puis nous nous sommes rendu comptes que quelques unes des entrées qui étaient sourcées l'étaient mal, nous avons donc décidé de rajouter à [[FactChecking]] toutes les entrées qui n'avaient pas une source provenant du site letemps.ch. | Nous avons commencé par afficher le numéro de la ligne où il n'y avait pas de source, puis nous nous sommes rendu comptes que quelques unes des entrées qui étaient <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
Une fois que nous avions récupérer tous les numéro des lignes mal sourcées/non sourcées, nous avons fait en sorte d'afficher la date associée à l'entrée non sourcée, car les indices ne permettaient pas de savoir directement quelles entrées étaient mal sourcées . | </span>) l'étaient mal, nous avons donc décidé de rajouter à [[FactChecking]] toutes les entrées qui n'avaient pas une source provenant du site <span style="color:red">letemps</span> (correction(s): <span style="color:green"> | ||
</span>).<span style="color:red">ch</span> (correction(s): <span style="color:green">chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi | |||
</span>). | |||
Une fois que nous avions récupérer tous les numéro des lignes mal <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | |||
</span>)/non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | |||
</span>), nous avons fait en sorte d'afficher la date associée à l'entrée non <span style="color:red">sourcée</span> (correction(s): <span style="color:green">source | |||
</span>), car les indices ne permettaient pas de savoir directement quelles entrées étaient mal <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | |||
</span>) . | |||
Ensuite nous avons repéré plusieurs types de formats de date existant. | Ensuite nous avons repéré plusieurs types de formats de date existant. | ||
Ligne 41 : | Ligne 87 : | ||
*[[1999.02.01]]/ , *[[1998.03.01]]: , *[[1998.03.02]] / le format standard * [[1998.05.08]] / | *[[1999.02.01]]/ , *[[1998.03.01]]: , *[[1998.03.02]] / le format standard * [[1998.05.08]] / | ||
Si la date ne correspond a aucun de ces modèles alors l'affichage des sources mal sourcées sur [[FactChecking]] sera moins performant: il n'affichera pas la date, mais la ligne où l'entrée est mal soourcée. | Si la date ne correspond a aucun de ces modèles alors l'affichage des sources mal <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
Pour réaliser tout cela nous avons utilisé des regular expressions afin de repérer la date et le lien dans chaque entrée. Cependant, si le format d'une entrée n'est pas respecté: si la date n'est pas le premier Hypermot alors il y aura des baisses de perfomances puisque l'affichage ne sera plus celui de la date: | </span>) sur [[FactChecking]] sera moins performant: il n'affichera pas la date, mais la ligne où l'entrée est mal <span style="color:red">soourcée</span> (correction(s): <span style="color:green"> | ||
ex: *[[Johny]]/[[Lausanne]] [[Election]] de [[Daniel Brélaz]] à l'[[Assemblée fédérale]]. | </span>). | ||
Pour réaliser tout cela nous avons utilisé des <span style="color:red">regular</span> (correction(s): <span style="color:green"> | |||
</span>) expressions afin de repérer la date et le lien dans chaque entrée. Cependant, si le format d'une entrée n'est pas respecté: si la date n'est pas le premier Hypermot alors il y aura des baisses de <span style="color:red">perfomances</span> (correction(s): <span style="color:green">performances | |||
</span>) puisque l'affichage ne sera plus celui de la date: | |||
<span style="color:red">ex</span> (correction(s): <span style="color:green">exo, en, eu, eux, es, eh, et, x, e, rex, tex | |||
</span>): *[[Johny]]/[[Lausanne]] [[Election]] de [[Daniel Brélaz]] à l'[[Assemblée fédérale]]. | |||
Ceci écrira pour Daniel Brélaz : | Ceci écrira pour Daniel Brélaz : | ||
The wrong entries are the sources with the following dates: [ Johny ]. | The <span style="color:red">wrong</span> (correction(s): <span style="color:green"> | ||
</span>) <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez | |||
</span>) are <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) sources <span style="color:red">with</span> (correction(s): <span style="color:green">witz | |||
</span>) <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) <span style="color:red">following</span> (correction(s): <span style="color:green"> | |||
</span>) dates: [ Johny ]. | |||
Cela peut-être assez problématique mais si le format officiel a été respecté alors cela ne posera pas problème. | Cela peut-être assez problématique mais si le format officiel a été respecté alors cela ne posera pas problème. | ||
Finalement nous avons aussi ajouté toutes les pages qui ont été créées par des bots, afin que notre Bot ai accès à toutes les pages de wikipast. | Finalement nous avons aussi ajouté toutes les pages qui ont été créées par des bots, afin que notre Bot ai accès à toutes les pages de <span style="color:red">wikipast</span> (correction(s): <span style="color:green"> | ||
</span>). | |||
== Code == | == Code == | ||
Ligne 60 : | Ligne 118 : | ||
user='Vlaedr' | user='Vlaedr' | ||
passw='Alextall007' | passw='Alextall007' | ||
baseurl='http://wikipast.epfl.ch/wikipast/' | baseurl='http://<span style="color:red">wikipast</span> (correction(s): <span style="color:green"> | ||
</span>).epfl.<span style="color:red">ch</span> (correction(s): <span style="color:green">chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi | |||
</span>)/<span style="color:red">wikipast</span> (correction(s): <span style="color:green"> | |||
</span>)/' | |||
summary='Wikipastbot update' | summary='Wikipastbot update' | ||
Ligne 95 : | Ligne 156 : | ||
depuis_date='2017-05-02T16:00:00Z' | depuis_date='2017-05-02T16:00:00Z' | ||
#pages created by Bots or people in the class but not the ones like Fichier:Annonce biopath.png | #pages created by Bots or people in <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
</span>) class but not <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) ones like Fichier:Annonce biopath.png | |||
liste_pages=[] | liste_pages=[] | ||
for user in protected_logins: | for user in protected_logins: | ||
Ligne 139 : | Ligne 202 : | ||
# the argument is the plain text of the page | # <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
# this fonction returns a tuple: | </span>) argument is <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
# first element is a boolean: true if all entries are sourced | </span>) plain text of <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
</span>) page | |||
# <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés | |||
</span>) fonction returns a tuple: | |||
# first element is a boolean: true if all <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez | |||
</span>) are sourced | |||
# false if sources are missing | # false if sources are missing | ||
# second element is a list of : (modification) all dates where the source is wrong. | # second element is a list of : (modification) all dates where <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
#int: all the bad lines indexes | </span>) source is <span style="color:red">wrong</span> (correction(s): <span style="color:green"> | ||
</span>). | |||
#int: all <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) bad lines indexes | |||
def findBadPage(pageText): | def findBadPage(pageText): | ||
# get all the lines | # get all <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | ||
</span>) lines | |||
tokens = [] | tokens = [] | ||
tk = pageText.split('\n') | tk = pageText.split('\n') | ||
Ligne 154 : | Ligne 226 : | ||
tokens.append(t) | tokens.append(t) | ||
#check if line is sourced | #<span style="color:red">check</span> (correction(s): <span style="color:green">cheik | ||
r = '\*.*\[https?:\/\/w?w?w?\.?letemps[^\]]*\].*' | </span>) if line is sourced | ||
r = '\*.*\[https?:\/\/w?w?w?\.?<span style="color:red">letemps</span> (correction(s): <span style="color:green"> | |||
</span>)[^\]]*\].*' | |||
p = re.compile(r) | p = re.compile(r) | ||
dates_isolator_expr = ['\* \[\[(.*)\]\] \/', '\*\[\[(.*)\]\]\:', '\*\[\[(.*)\]\]\/', '\*\[\[(.*)\]\] \/'] | dates_isolator_expr = ['\* \[\[(.*)\]\] \/', '\*\[\[(.*)\]\]\:', '\*\[\[(.*)\]\]\/', '\*\[\[(.*)\]\] \/'] | ||
Ligne 186 : | Ligne 260 : | ||
content = '\n' | content = '\n' | ||
content += 'Cette page liste toutes les biographies ayant des entrées non sourcées.' | content += 'Cette page liste toutes les biographies ayant des entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
</span>).' | |||
content += '\n==Bad page==\n' | content += '\n==Bad page==\n' | ||
Ligne 197 : | Ligne 272 : | ||
badpage.append(name) | badpage.append(name) | ||
content += name | content += name | ||
content += '\n The wrong entries in this page are the sources with the following dates: ' | content += '\n The <span style="color:red">wrong</span> (correction(s): <span style="color:green"> | ||
</span>) <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez | |||
</span>) in <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés | |||
</span>) page are <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) sources <span style="color:red">with</span> (correction(s): <span style="color:green">witz | |||
</span>) <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé | |||
</span>) <span style="color:red">following</span> (correction(s): <span style="color:green"> | |||
</span>) dates: ' | |||
content += str(wrongDatesSources) | content += str(wrongDatesSources) | ||
content += '\n\n' | content += '\n\n' | ||
Ligne 203 : | Ligne 285 : | ||
'''content = '\n' | '''content = '\n' | ||
content += 'Cette page liste toutes les biographies ayant des entrées non sourcées.' | content += 'Cette page liste toutes les biographies ayant des entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources | ||
</span>).' | |||
content += '\n==Bad page==' | content += '\n==Bad page==' | ||
content += '\n[[' + badpage[0] + ']]' ''' | content += '\n[[' + badpage[0] + ']]' ''' |
Version du 30 mai 2017 à 08:04
Description
Le bot récupère toutes les données des Datafications Biographiques ainsi que toutes les pages créer par des Bots et détecte pour chaque page, l'absence éventuelle d'une source dans une ligne biographique et la signale. Il met à jour une page FactChecking qui liste les entrées non sourcées (correction(s): sources ) en associant une référence particulière à cet inconnue: cette référence est la date associée à l'entrée non sourcée (correction(s): source ). Il scanne régulièrement (toutes les heures) toutes les datafications (correction(s): ) biographiques ainsi que les autres pages de wikipast (correction(s): ) et met à jour la page FactChecking.
Pour chaque datification (correction(s): ratification ) biographique ainsi que pour toutes pages créées depuis le début du cours, notre bot check (correction(s): cheik ) si toutes les entrées de ces pages sont sourcées (correction(s): sources ), si c'est le cas alors on passe à la suivante datafication (correction(s): ), sinon le nom de la datafication (correction(s): ) ainsi que les différentes dates des entrées non sourcées (correction(s): sources ) sont ajoutées au contenu de la page FactChecking. Si une entrée non sourcée (correction(s): source ) est mis à jour et devient sourcée (correction(s): source ), alors la date de cette entrée disparaitra (correction(s): disparaîtra ) de la page FactChecking. Les entrées non sourcées (correction(s): sources ) comprennent aussi les entrées qui ont une source qui n'est pas letemps (correction(s): ).ch (correction(s): chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi ).
Exemples
- 1975 / Lausanne Diplôme en mathématiques à l'EPFL. [https://fr.wikipedia (correction(s):
).org/wiki/Daniel_Br%C3%A9laz]
- 1978 / Lausanne Election de Daniel Brélaz à l'Assemblée fédérale.
Notre bot recupère (correction(s): récupère ) la page de Daniel Brélaz et elle retourne les dates de toute les entrées non-sourcées (correction(s): sources ) ou avec une autre source que letemps (correction(s): ).ch (correction(s): chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi ) . La première entrée possède un lien vers wikipedia (correction(s): ) qui n'est pas valide, et la deuxième n'a pas de source. Ce bot écrit sur FactChecking :
Daniel Brélaz
The wrong (correction(s):
) entries (correction(s): entrées, entres, entriez ) in this (correction(s): tris, tais, thés ) page are the (correction(s): tee, te, tue, thé ) sources with (correction(s): witz ) the (correction(s): tee, te, tue, thé ) following (correction(s): ) dates: [ 1975 , 1978 ]
- 1911/Suisse Deuxième Election de Paul Maillefer dans le Conseil National et succession en 1912 au Grand Conseil Nationnal. [[https://de.wikipedia (correction(s):
).org/wiki/Paul_Maillefer]] Ici le lien est un lien wikipedia (correction(s): ) qui n'est pas une source valide. Dans le cas de cette entrée il écrit sur la page FactChecking :
Paul Maillefer
The wrong (correction(s):
) entries (correction(s): entrées, entres, entriez ) in this (correction(s): tris, tais, thés ) page are the (correction(s): tee, te, tue, thé ) sources with (correction(s): witz ) the (correction(s): tee, te, tue, thé ) following (correction(s): ) dates: [ 1911 ]
Performances
Notre bot repère toutes les entrées des pages des Datafications Biographiques qui ne sont pas ou mal sourcée (correction(s): source ): Ensuite celui-ci met à jour la page FactChecking en écrivant les dates où les sources sont manquantes.
Nous avons commencé par afficher le numéro de la ligne où il n'y avait pas de source, puis nous nous sommes rendu comptes que quelques unes des entrées qui étaient sourcées (correction(s): sources ) l'étaient mal, nous avons donc décidé de rajouter à FactChecking toutes les entrées qui n'avaient pas une source provenant du site letemps (correction(s): ).ch (correction(s): chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi ). Une fois que nous avions récupérer tous les numéro des lignes mal sourcées (correction(s): sources )/non sourcées (correction(s): sources ), nous avons fait en sorte d'afficher la date associée à l'entrée non sourcée (correction(s): source ), car les indices ne permettaient pas de savoir directement quelles entrées étaient mal sourcées (correction(s): sources ) .
Ensuite nous avons repéré plusieurs types de formats de date existant. Notre bot permet de repérer les dates sous les formats suivant :
*1999.02.01/ , *1998.03.01: , *1998.03.02 / le format standard * 1998.05.08 /
Si la date ne correspond a aucun de ces modèles alors l'affichage des sources mal sourcées (correction(s): sources ) sur FactChecking sera moins performant: il n'affichera pas la date, mais la ligne où l'entrée est mal soourcée (correction(s): ). Pour réaliser tout cela nous avons utilisé des regular (correction(s): ) expressions afin de repérer la date et le lien dans chaque entrée. Cependant, si le format d'une entrée n'est pas respecté: si la date n'est pas le premier Hypermot alors il y aura des baisses de perfomances (correction(s): performances ) puisque l'affichage ne sera plus celui de la date:
ex (correction(s): exo, en, eu, eux, es, eh, et, x, e, rex, tex
): *Johny/Lausanne Election de Daniel Brélaz à l'Assemblée fédérale.
Ceci écrira pour Daniel Brélaz : The wrong (correction(s):
) entries (correction(s): entrées, entres, entriez ) are the (correction(s): tee, te, tue, thé ) sources with (correction(s): witz ) the (correction(s): tee, te, tue, thé ) following (correction(s): ) dates: [ Johny ]. Cela peut-être assez problématique mais si le format officiel a été respecté alors cela ne posera pas problème.
Finalement nous avons aussi ajouté toutes les pages qui ont été créées par des bots, afin que notre Bot ai accès à toutes les pages de wikipast (correction(s): ).
Code
Pour le coté serveur, devrait être lancé à peu près toutes les heures.
import urllib import requests from bs4 import BeautifulSoup import re user='Vlaedr' passw='Alextall007' baseurl='http://<span style="color:red">wikipast</span> (correction(s): <span style="color:green"> </span>).epfl.<span style="color:red">ch</span> (correction(s): <span style="color:green">chu, co, h, ce, ah, eh, c, ph, oh, ci, cm, chi </span>)/<span style="color:red">wikipast</span> (correction(s): <span style="color:green"> </span>)/' summary='Wikipastbot update' # Login request payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm 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) #get edit token2 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) fullbios = '' name = 'Biographies' 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 fullbios = code protected_logins=["Frederickaplan","Maud","Vbuntinx","Testbot","SparqlBot","IB","SourceBot","PageUpdaterBot","Orthobot","BioPathBot","ChronoBOT","Amonbaro","AntoineL","AntoniasBanderos","Arnau","Arnaudpannatier","Aureliver","Brunowicht","Burgerpop","Cedricviaccoz","Christophe","Claudioloureiro","Ghislain","Gregoire3245","Hirtg","Houssm","Icebaker","JenniCin","JiggyQ","JulienB","Kl","Kperrard","Leandro Kieliger","Marcus","Martin","MatteoGiorla","Mireille","Mj2905","Musluoglucem","Nacho","Nameless","Nawel","O'showa","PA","Qantik","QuentinB","Raphael.barman","Roblan11","Romain Fournier","Sbaaa","Snus","Sonia","Tboyer","Thierry","Titi","Vlaedr","Wanda"] depuis_date='2017-05-02T16:00:00Z' #pages created by Bots or people in <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) class but not <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) ones like Fichier:Annonce biopath.png liste_pages=[] for user in protected_logins: result=requests.post(baseurl+'api.php?action=query&list=usercontribs&ucuser='+user+'&format=xml&ucend='+depuis_date) soup=BeautifulSoup(result.content,'lxml') for primitive in soup.usercontribs.findAll('item'): if primitive['title'][:7] != 'Fichier': liste_pages.append(primitive['title']) #pages not to be considered. bad_pages_list = ['Accueil', 'Bots','HypermotBot', 'OrthoBot', 'SourceBot','VandalBot','PageUpdaterBot', 'BioPathBot', 'SPARQLBot','InferenceBot/CheckerBot','LinkBot','CheckerBot', 'InferenceBot', 'MiningBot','Chronobot', 'ChronoBot', 'ImageBot','FormatBot', 'TangoBot'] liste_pages_correct = list(set(liste_pages) - set(bad_pages_list)) for p in liste_pages_correct: print(p) allnames = [] for p in liste_pages_correct : allnames.append(p) pattern = '\* ?\[\[([^\]]*)\]\].*' p = re.compile(pattern) bioNames = fullbios.split('\n') for c in bioNames: tk = c.split('\n') for t in tk: if t: match = p.match(t) if match: allnames.append(match.group(1)) fullCode = [] for name in allnames: result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap') soup=BeautifulSoup(result.text, "lxml") code='' for primitive in soup.findAll("text"): if primitive.string : code += primitive.string if code : print(name) fullCode.append((code, name)) # <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) argument is <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) plain text of <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) page # <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés </span>) fonction returns a tuple: # first element is a boolean: true if all <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez </span>) are sourced # false if sources are missing # second element is a list of : (modification) all dates where <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) source is <span style="color:red">wrong</span> (correction(s): <span style="color:green"> </span>). #int: all <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) bad lines indexes def findBadPage(pageText): # get all <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) lines tokens = [] tk = pageText.split('\n') for t in tk: if t: if t[0] == '*': tokens.append(t) #<span style="color:red">check</span> (correction(s): <span style="color:green">cheik </span>) if line is sourced r = '\*.*\[https?:\/\/w?w?w?\.?<span style="color:red">letemps</span> (correction(s): <span style="color:green"> </span>)[^\]]*\].*' p = re.compile(r) dates_isolator_expr = ['\* \[\[(.*)\]\] \/', '\*\[\[(.*)\]\]\:', '\*\[\[(.*)\]\]\/', '\*\[\[(.*)\]\] \/'] index = 0 allSourced = True wrongDatesSources = [] for t in tokens: match = p.match(t) if not match: allSourced = False count = 0; didmatch = False for i in dates_isolator_expr : count +=1 d = re.compile(i) match = d.match(t) if match: didmatch = True wrongDatesSources.append(match.group(1)) if not didmatch : wrongDatesSources.append('false source at line: ' + str(index)) otherSource = '\*.*\[(https?:\/\/.*)\].*' pOth = re.compile(otherSource) match = pOth.match(t) index +=1 return (allSourced, wrongDatesSources) content = '\n' content += 'Cette page liste toutes les biographies ayant des entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources </span>).' content += '\n==Bad page==\n' badpage = [] wrongDatesSources = [] ok =True for (c, name) in fullCode: (ok, wrongDatesSources) = findBadPage(c) if not ok: badpage.append(name) content += name content += '\n The <span style="color:red">wrong</span> (correction(s): <span style="color:green"> </span>) <span style="color:red">entries</span> (correction(s): <span style="color:green">entrées, entres, entriez </span>) in <span style="color:red">this</span> (correction(s): <span style="color:green">tris, tais, thés </span>) page are <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) sources <span style="color:red">with</span> (correction(s): <span style="color:green">witz </span>) <span style="color:red">the</span> (correction(s): <span style="color:green">tee, te, tue, thé </span>) <span style="color:red">following</span> (correction(s): <span style="color:green"> </span>) dates: ' content += str(wrongDatesSources) content += '\n\n' '''content = '\n' content += 'Cette page liste toutes les biographies ayant des entrées non <span style="color:red">sourcées</span> (correction(s): <span style="color:green">sources </span>).' content += '\n==Bad page==' content += '\n[[' + badpage[0] + ']]' ''' payload = {'action':'edit','assert':'user','format':'json','utf8':'','text':content, 'summary':summary,'title':'FactChecking','token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)