Utilisateur:Pabix/Contribcheck
Un article de Wikipédia, l'encyclopédie libre.
Sommaire |
[modifier] Manuel
[modifier] Objet du script
Ceci est un script permettant de vérifier si deux contributeurs contribuent souvent en même temps. Il fonctionne sous GNU/Linux.
[modifier] Instructions d'utilisation
- À mettre dans un répertoire et à rendre exécutable, le nommer par exemple « script »
- Créer un sous-répertoire "Collisions"
- Pour analyser les contributions d'un ou plusieurs pseudonymes supplémentaires, lancer ./script pseudo1 ... pseudoN
- Pour ne plus analyser les contributions d'un pseudo aux prochains lancements, enlever les fichiers pseudo.ctr et pseudo.count
- Pour plus de détails sur les collisions entre deux pseudonymes, voir dans le sous-répertoire Collisions
- Le contenu du répertoire Collisions peut être supprimé
[modifier] Exemple
$./script Pabix Pabix : 4683 contributions dont 4058 à des minutes distinctes Analyse des collisions entre les contributions de : Pabix
puis
$./script Hégésippe_Cormier Hégésippe_Cormier : 5000 contributions dont 4167 à des minutes distinctes Analyse des collisions entre les contributions de : Hégésippe_Cormier Pabix Hégésippe_Cormier (5000/4167), Pabix (4683/4058) : 82 collisions dont 26 à la même minute
puis
$./script Dake Aoineko Dake : 5000 contributions dont 4120 à des minutes distinctes Aoineko : 5000 contributions dont 3894 à des minutes distinctes Analyse des collisions entre les contributions de : Aoineko Dake Hégésippe_Cormier Pabix Aoineko (5000/3894), Dake (5000/4120) : 112 collisions dont 55 à la même minute Aoineko (5000/3894), Hégésippe_Cormier (5000/4167) : 151 collisions dont 72 à la même minute Aoineko (5000/3894), Pabix (4683/4058) : 54 collisions dont 14 à la même minute Dake (5000/4120), Hégésippe_Cormier (5000/4167) : 296 collisions dont 109 à la même minute Dake (5000/4120), Pabix (4683/4058) : 56 collisions dont 26 à la même minute Hégésippe_Cormier (5000/4167), Pabix (4683/4058) : 82 collisions dont 26 à la même minute
puis
$cat Collisions/Dake#Pabix 10 février 2006 à 13:27 10 janvier 2006 à 10:42 (etc.) |
$cat Collisions/Dake#Pabix#10 10 février 2006 à 13:2 10 janvier 2006 à 10:4 (etc.) |
[modifier] Analyse des résultats
- Le nombre de collisions représente le nombre de tranches de 10 minutes durant lesquelles les deux contributeurs ont édité.
- Le contenu des fichiers Pseudo1#Pseudo2 dans le répertoire Collisions représente les heures durant lesquelles les deux contributeurs ont édité
- Concernant le fichier Pseudo1#Pseudo2#10 il s'agit des dizaines de minutes (entre 0 et 5)
[modifier] Code
#!/bin/bash ############### # Auteur : Pabix # Remerciements : Marc Mongenet, Phe, Alvaro ############### # Récupération des contributions : until [ -z $1 ] ### Pour chaque argument do echo -n "$1 : " wget "http://fr.wikipedia.org/w/index.php?title=Special:Contributions&target=${1}&offset=0&limit=5000" -O "./$1.tmp" -o /dev/null egrep '<li>[0-9][0-9]?' $1.tmp > ./$1.tmp2 cut -b 5- ./$1.tmp2 | cut -f 1-5 -d ' ' | sort | uniq > ./$1.ctr ### récupération des horaires sans les doublons wc -l $1.tmp2 | cut -f 1 -d ' ' > $1.count rm $1.tmp rm $1.tmp2 echo "`cat $1.count` contributions dont `wc -l $1.ctr | cut -f 1 -d ' ' ` à des minutes distinctes" shift ### passage à l'argument suivant done echo echo "Analyse des collisions entre les contributions de :" for i in $(ls *ctr) do nomi=`echo $i | rev | cut -b 5- | rev` echo -n " $nomi" done echo for i in $(ls *ctr) do for j in $(ls *ctr) do if [ "$i" \< "$j" ] ### Ne pas reprendre deux fois le même couple de contributeurs then nomi=`echo $i | rev | cut -b 5- | rev` nomj=`echo $j | rev | cut -b 5- | rev` counti="`cat $nomi.count`/`wc -l $nomi.ctr | cut -f 1 -d ' '`" countj="`cat $nomj.count`/`wc -l $nomj.ctr | cut -f 1 -d ' '`" cat $i $j | sort | uniq -d > ./Collisions/$nomi\#$nomj ### récupération des doublons entre 1 et 2 cat $i $j | rev | cut -b 2- | rev | uniq | sort | uniq -d > ./Collisions/$nomi\#$nomj\#10 ### Ligne compliquée : ### ## rev | cut -b 2- | rev : coupe le dernier caractère : ie arrondit à la dizaine de minute ### ## uniq : enlève les lignes successives identiques (le tout n'étant pas trié, les deux fichiers ne sont pas mélangés) ### ## sort | uniq -d : mélange les fichiers et récupère les doublons coll=`wc -l ./Collisions/$nomi\#$nomj | cut -f 1 -d ' ' ` ### Récupération du nombre de collisions coll10=`wc -l ./Collisions/$nomi\#$nomj\#10 | cut -f 1 -d ' ' ` if [ "$coll10" -ne "0" ] ### Si au moins une collision then echo "$nomi ($counti), $nomj ($countj) : $coll10 collisions dont $coll à la même minute" fi fi done done |
[modifier] Résultats sous forme de wikitable
Ce script codé en python prend tous les fichier *.ctr dans la directory courante et met les résultats sous forme d'une wikitable
# -*- coding: iso-8859-1 -*- # Auteur : Phe import re import os def fileext_match(file, ext): return file.endswith(ext) def get_file_list(root_dir): lst = [] for root, dirnames, files in os.walk(root_dir, False): files = filter(lambda x: not os.path.islink(root + '/' + x) and fileext_match(x, '.ctr'), files) lst.append( (root, dirnames, files) ) return lst def get_user_name(): file_list = get_file_list('./') result = [] for p in file_list[0][2]: result.append(p[0:len(p)-4]) result.sort() return result def get_data(user_name): result = {} for p in user_name: count_fd = open(p + '.count') count = count_fd.read() result[p] = int(count) for i in user_name: for j in user_name: if i >= j: continue fd_1 = open(i + '#' + j) nb_conflict_1 = len(fd_1.readlines()) fd_10 = open(i + '#' + j + '#10') nb_conflict_10 = len(fd_10.readlines()) result[(i, j)] = [ nb_conflict_1, nb_conflict_10 ] return result def create_table(user_name, result): print u'{| border="1" cellpadding="3"' print u'! Nom #edit ', for i in user_name: print u'!! ' + unicode(i[0:3], 'iso-8859-1'), print for i in user_name: print u'|-' print u'| ' print u'[http://tools.wikimedia.de/~interiot/cgi-bin/count_edits?dbname=frwiki_p&user=' + unicode(i, 'iso-8859-1') + ' ' + unicode(i, 'iso-8859-1')+ '] ' + unicode(result[i]) for j in user_name: print u'||', if i > j: print str(result[(j, i)][1]) + u'/' + str(result[(j, i)][0]), elif i < j: print str(result[(i, j)][1]) + u'/' + str(result[(i, j)][0]), print print u'|}' user_name = get_user_name() result = get_data(user_name) create_table(user_name, result)