Zum Inhalt springen

Benutzer:Jah/Hauptautoren

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 22. März 2005 um 20:30 Uhr durch Jah (Diskussion | Beiträge) (html entities richtig behandeln). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Um den Anteil der Autoren eines Artikel an dessen aktueller Version zu bestimmen, muss man zunächst den Artikel exportieren, wobei man das Häkchen bei der Option "Nur die aktuelle Version der Seite exportieren" entfernen muss. Bei Seiten mit einer sehr langen Versionsgeschichte funktioniert der Export leider häufig nicht, v.a. wenn der Server langsam ist.

Dann lässt man folgendes Perl-Script auf die XML-Datei los. Ausgegeben wird ein Wikiquelltext mit je nach Autor unterschiedlich farbig markiertem Text und im Anschluss die Anzahl der Wörter, die die Autoren beigetragen haben, und der Anteil an der Gesamtzahl der Wörter. Bilder, Tabellen und Weblinks werden z.Z. nicht mit berücksichtigt. Den Wikiquelltext kann man auf einer beliebigen Seite zur Vorschau bringen (aber nicht abspeichern!).

Beispielseite: Wikipedia:Hauptautoren/Lorentz-Transformation (von Lorentz-Transformation in der Version vom 27.2.2005)

#!/usr/bin/perl

$wgl = 5; # Wortgruppenlänge

while(<>) { $xml .= $_; }

for($id=1; $xml =~ /<revision>(.*?)<\/revision>/sg; $id++) {
	$version = $1;
	$version =~ /<contributor>(?:<ip>|<username>)(.*?)(?:<\/ip>|<\/username>)<\/contributor>/s;
	$autor[$id] = $1;
	$version =~ /<text>(.*?)<\/text>/s;
	$text = $1;

	# escapete Zeichen <,>,& rückumwandeln und (Inter-)Wikilinks entfernen:
	$text =~ s/\</</sg; $text =~ s/>/>/sg; $text =~ s/&/&/sg;
	$text =~ s/\[\[(.{2,3}|minnan|simple):(.+?)\]\]//sg;
	$text =~ s/\[\[(?!(?:Kategorie|Bild):)([^\]\|]*?\|)?([^\|]+?)\]\]/$2/sg;
	$text =~ s/\n{3,}/\n\n/sg;
	$text0 = $text;

	# Elemente entfernen, die nicht erkannt werden sollen
	$text =~ s/\{\{.*?\}\}//sg;
	$text =~ s/\{\|.*?\|\}//sg;
	$text =~ s/\[\[(Kategorie|Bild):.*?\]\]//isg;
	$text =~ s/\*? ?\[(http|mailto).*?\]//isg;
	$text =~ s/\*? ?(http|mailto):\S*//isg;
	$text =~ s/<math>.*?<\/math>//sg;
	$text =~ s/<.{1,10}?>//sg;
	$text =~ s/&(\w+|#(\d+|x[0-9A-Fa-f]+));//sg;

	@woerter = ();
	while($text =~ /[a-zA-ZäöüßÄÖÜÉéÀàÈèÙùÂâÊêÎîËëÆæÅ娸Çç]+/sg) {
	    push @woerter, $&;
	}
	for($i=0; $i<@woerter; $i++) {
		$id[$i] = 0;
	}
	for($i=0; $i<@woerter-$wgl+1; $i++) {
		$seq = join(" ", @woerter[$i..$i+$wgl-1]);
		if(defined $id{$seq}) {
			for($j=$i; $j<$i+$wgl; $j++) {
			    if($id[$j]==0||$id[$j]>$id{$seq}[$j-$i]) {
				$id[$j] = $id{$seq}[$j-$i];
			    }
			}
		}
	}
	for($i=0; $i<@woerter-$wgl+1; $i++) {
		$seq = join(" ", @woerter[$i..$i+$wgl-1]);
		for($j=$i; $j<$i+$wgl; $j++) {
			$id{$seq}[$j-$i] = $id[$j]==0?$id:$id[$j];
		}
	}
}

# nochmal die aktuelle Version auswerten:
for($i=0; $i<@woerter-$wgl+1; $i++) {
	$seq = join(" ", @woerter[$i..$i+$wgl-1]);
	for($j=$i; $j<$i+$wgl; $j++) {
		$id[$j] = $id{$seq}[$j-$i];
	}
}

for($i=0; $i<@woerter; $i++) {
	$woerter{$autor[$id[$i]]}++ if $id[$i]>0;
}
@autoren = sort {$woerter{$b} <=> $woerter{$a}} keys %woerter;
for($i=0; $i<@autoren; $i++) {
    if($i>5) {
	$farbe{$autoren[$i]} = "#000000";
    } else {
	$farbe{$autoren[$i]} = ("#bf0000", "#00bf00", "#0000bf", "#007f7f", "#7f007f", "#7f7f00")[$i];
    }
}

sub ersetze {
  $ersatz = "___".$ersatzNr++."___";
  $ersetzterBlock{$ersatz} = $_[0];
  $ersatz;
}

# die gleichen Elemente, die oben entfernt wurden, ersetzen:
$text0 =~ s/\{\{.*?\}\}/ersetze($&)/esg;
$text0 =~ s/\{\|.*?\|\}/ersetze($&)/esg;
$text0 =~ s/\[\[(Kategorie|Bild):.*?\]\]/ersetze($&)/iesg;
$text0 =~ s/\*? ?\[(http|mailto).*?\]/ersetze($&)/iesg;
$text0 =~ s/\*? ?(http|mailto):\S*/ersetze($&)/iesg;
$text0 =~ s/<math>.*?<\/math>/ersetze($&)/esg;
$text0 =~ s/<.{1,10}?>/ersetze($&)/esg;
$text0 =~ s/&(\w+|#(\d+|x[0-9A-Fa-f]+));/ersetze($&)/esg;

for($i=0; $i<@woerter; $i++) {
    $text0 =~ s/^(.*?)$woerter[$i]//sg;
    $markiertertext .= "$1<font color=\"$farbe{$autor[$id[$i]]}\">$woerter[$i]</font>"
}
$markiertertext .= $text0;

# ersetzte Elemente wieder zurückholen:
$markiertertext =~ s/___\d+___/$ersetzterBlock{$&}/sg;

print "$markiertertext\n----\n==Autoren dieses Artikels==\n";
print "{| cellspacing=\"0\" border=\"1\"\n";
print "! Wörter || Anteil || Benutzer\n";
print "|-\n";
foreach $autor (@autoren) {
	printf "| %5i || %4.1f\% || <font color=\"$farbe{$autor}\">%s</font>\n", $woerter{$autor}, 100*$woerter{$autor}/@woerter, $autor;
	print "|-\n";
}
print "|}\n";