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)