diff --git a/outils/stats-corpus/README.md b/outils/stats-corpus/README.md new file mode 100644 index 0000000..1c60f9a --- /dev/null +++ b/outils/stats-corpus/README.md @@ -0,0 +1,41 @@ +stat-corpus +=============== + +Outil de statistiques descriptives sur les corpus ISTEX extrait par **harvestCorpus.pl** + +Permet de faire des statistiques sur les fichiers extraits d’ISTEX en utilisant le fichier +de métadonnées “logRequete.txt” (cf. l’option “-v” du programme “harvestCorpus.pl”). + +Si les fichiers XML éditeurs ont été extraits, il permet aussi de vérifier s’ils sont structurés +ou non. + +Le résultat comprend, en plus de l’en-tête, une ligne par document avec des champs séparés par +des tabulations (format TSV). + +### Usage +``` + statsCorpus.pl -l logfile ( -p préfixe | -c corpus ) [ -r répertoire ] [ -s sortie ] + statsCorpus.pl -h +``` + +### Options +``` + -l indique le nom du fichier “logfile” contenant les métadonnées ISTEX au format JSON + créé par l’option “-v” du programme “harvestCorpus.pl”. + Par défaut, ce fichier s’appelle “logRequete.txt” et se trouve dans le répertoire des + fichiers déchargés depuis le serveur ISTEX. + -c indique le nom du fichier “corpus” généré par le programme “harvestCorpus.pl” permettant + de faire le lien entre l’identifiant ISTEX d’un document et le nom des fichiers + extraits correspondants. + -p indique le préfixe utilisé au début du nom des fichiers déchargés par le programme + “harvestCorpus.pl”. + -r indique le répertoire où se trouve les fichiers XML éditeurs déchargés par le programme + “harvestCorpus.pl”. + -s indique le nom du fichier de sortie. Sinon, la sortie se fait sur la sortie standard. +``` + +### Exemple +``` + statsCorpus.pl -l Arthropodes/logRequete.txt -c Arthropodes_v2b.corpus -r Arthropodes + statsCorpus.pl -l Vieillissement/logRequete.txt -p Vieil_ -r Vieillissement -s Vieil.tsv +``` diff --git a/outils/stats-corpus/statsCorpus.pl b/outils/stats-corpus/statsCorpus.pl new file mode 100755 index 0000000..c9c96d8 --- /dev/null +++ b/outils/stats-corpus/statsCorpus.pl @@ -0,0 +1,275 @@ +#!/usr/bin/perl + + +# Déclaration des pragmas +use strict; +use utf8; +use open qw/:std :utf8/; + +# Appel des modules externes de base +use Encode qw(decode_utf8 encode_utf8 is_utf8); +use Getopt::Long; + +# Appel des modules spécifiques à l'application +## use URI::Encode qw(uri_encode uri_decode); +## use LWP::Simple; +use JSON; +## use Text::Unidecode; + +my ($programme) = $0 =~ m|^(?:.*/)?(.+)|; + +my $version = "1.2.4"; +my $dateModif = "29 Septembre 2017"; + +# Variables +my $aide = 0; +my $corpus = ""; +my $logfile = ""; +my $prefixe = ""; +my $repertoire = ""; +my $sortie = ""; + +eval { + $SIG{__WARN__} = sub {usage(1);}; + GetOptions( + "corpus=s" => \$corpus, + "help" => \$aide, + "logfile=s" => \$logfile, + "prefixe=s" => \$prefixe, + "repertoire=s" => \$repertoire, + "sortie=s" => \$sortie, + ); + }; +$SIG{__WARN__} = sub {warn $_[0];}; +# “ machin ” +if ( $aide ) { + print "Programme : \n “$programme”, version $version ($dateModif)\n"; + print " Permet de faire des statistiques sur les fichiers extraits d’ISTEX en utilisant le fichier \n"; + print " de métadonnées “logRequete.txt” (cf. l’option “-v” du programme “harvestCorpus.pl”). \n"; +# print " \n"; + print " Si les fichiers XML éditeurs ont été extraits, il permet aussi de vérifier s’ils sont \n"; + print " structurés ou non. \n"; + print "\nUsage : \n $programme -l logfile ( -p préfixe | -c corpus ) [ -r répertoire ] [ -s sortie ]\n"; + print " $programme -h\n"; + print "\nOptions : \n"; + print " -l indique le nom du fichier “logfile” contenant les métadonnées ISTEX au format JSON \n"; + print " créé par l’option “-v” du programme “harvestCorpus.pl”. \n"; + print " Par défaut, ce fichier s’appelle “logRequete.txt” et se trouve dans le répertoire des \n"; + print " fichiers déchargés depuis le serveur ISTEX. \n"; + print " -c indique le nom du fichier “corpus” généré par le programme “harvestCorpus.pl” permettant \n"; + print " de faire le lien entre l’identifiant ISTEX d’un document et le nom des fichiers \n"; + print " extraits correspondants.\n"; + print " -p indique le préfixe utilisé au début du nom des fichiers déchargés par le programme \n"; + print " “harvestCorpus.pl”. \n"; + print " -r indique le répertoire où se trouve les fichiers XML éditeurs déchargés par le programme \n"; + print " “harvestCorpus.pl”.\n"; + print " -s indique le nom du fichier de sortie. Sinon, la sortie se fait sur la sortie standard. \n"; + print "\nExemples : \n"; + print " $programme -l Arthropodes/logRequete.txt -c Arthropodes_v2b.corpus -r Arthropodes\n"; + print " $programme -l Vieillissement/logRequete.txt -p Vieil_ -r Vieillissement -s Vieil.tsv\n\n"; + + exit 0; + } + +usage(2) if not $logfile; + +my $format = ""; +my $json = ""; +my $racine = ""; +my $num = 0; +my $total = 0; +my %racine = (); + +if ( $corpus ) { + open(TAB, "<:utf8", $corpus) or die "$!,"; + while() { + if ( /^id /o ) { + chomp; + s/\r//go; # Au cas où ... + my ($type, $id, $com, $nom) = split(/\s+/); + $racine{$id} = $nom; + } + } + close TAB; + } + +if ( $sortie ) { + open(OUT, ">:utf8", $sortie) or die "\"$sortie\" : $!,"; + } +else { + open(OUT, ">&STDOUT") or die "$!,"; + binmode(OUT, ">:utf8"); + } +print OUT "\x{FEFF}Identifiant ISTEX\tNom de fichier\tÉditeur\tScore qualité\tVersion PDF"; +print OUT "\tXML structuré\tDate de publication\tTitre\tRevue\tISSN\te-ISSN\tType de publication"; +print OUT "\tType de document\tCatégories WoS\tCatégories Science-Metrix\tCatégories INIST\n"; + +open(INP, "<:raw", $logfile) or die "$!,"; +while() { + if ( /^# (\w+_\d+)/ ) { + $racine = $1; + next; + } + elsif ( /^#/ ) { + next; + } + $json .= $_; + if ( /^\}/o ) { + my $perl = decode_json $json; + my %top = %{$perl}; + $total = $top{'total'}; + if ( $total > 0 ) { + $format = sprintf("%%0%dd", length($total) + 1); + my @hits = @{$top{'hits'}}; + foreach my $hit (@hits) { + $num ++; + my $fichier = undef; + my $xml = undef; + my %hit = %{$hit}; + my $id = $hit{'id'}; + if ( $racine ) { + $fichier = $racine; + $racine = ""; + } + elsif ( $racine{$id} ) { + $fichier = $racine{$id}; + } + elsif ( $prefixe ) { + $fichier = "$prefixe" . sprintf($format, $num); + } + if ( defined $fichier ) { + if ( $repertoire ) { + $xml = "$repertoire/$fichier.xml"; + } + } + else { + $fichier = "Nom de fichier inconnu"; + } + my $titre = $hit{'title'}; + my $nom = $hit{'corpusName'}; + my $date = ""; + if ( $hit{'copyrightDate'} ) { + $date = $hit{'copyrightDate'}; + } + elsif ( $hit{'publicationDate'} ) { + $date = $hit{'publicationDate'}; + } + my $langues = ""; + if ( defined $hit{'language'} ) { + $langues = join(" ; ", @{$hit{'language'}}); + } + my $wos = ""; + my $scienceMetrix = ""; + my $inist = ""; + if ( defined $hit{'categories'} ) { + my %categories = %{$hit{'categories'}}; + if ( defined $categories{'wos'} ) { + $wos = join(" ; ", @{$categories{'wos'}}); + } + if ( defined $categories{'scienceMetrix'} ) { + $scienceMetrix = join(" ; ", @{$categories{'scienceMetrix'}}); + } + if ( defined $categories{'inist'} ) { + $inist = join(" ; ", @{$categories{'inist'}}); + } + } + my $genre = ""; + if ( defined $hit{'genre'} ) { + $genre = join(", ", @{$hit{'genre'}}); + } + my $pdfVersion = ""; + my $score = ""; + if ( defined $hit{'qualityIndicators'} ) { + my %indicateurs = %{$hit{'qualityIndicators'}}; + if ( defined $indicateurs{'pdfVersion'} ) { + $pdfVersion = $indicateurs{'pdfVersion'}; + } + if ( defined $indicateurs{'score'} ) { + $score = $indicateurs{'score'}; + } + } + my $revue = ""; + my $issn = ""; + my $eissn = ""; + my $dt = ""; + if ( defined $hit{'host'} ) { + my %host = %{$hit{'host'}}; + if ( defined $host{'title'} ) { + $revue = $host{'title'} + } + if ( defined $host{'issn'} ) { + $issn = join("/", @{$host{'issn'}}); + } + if ( defined $host{'eissn'} ) { + $eissn = join("/", @{$host{'eissn'}}); + } + if ( defined $host{'genre'} ) { + $dt = join(", ", @{$host{'genre'}}); + } + } + my $structure = "Inconnu"; + if ( defined $xml and -f $xml ) { + $structure = "Non"; + my $texte = ""; + open(XML, "<:utf8", $xml) or die "$!,"; + while() { + tr/\n\r/ /s; + $texte .= $_; + } + close XML; + # Wiley + if ( $texte =~ m|xmlns="http://www.wiley.com/namespaces/wiley"|o ) { + $structure = "Oui" if $texte =~ /\s*\s*\s*|oi; + } + # Brill + elsif ( $texte =~ m|http://dtd.nlm.nih.gov/publishing|o or + $texte =~ m|Brill|o ) { + $structure = "Oui" if $texte =~ m|\s*Oxford University Press|o ) { + $structure = "Oui" if $texte =~ m|\s*Emerald Group Publishing Limited|o or + $texte =~ m|MCB UP Ltd|o ) { + $structure = "Oui" if $texte =~ m|\s*\s*(BMJ|British Medical Journal) Publishing Group/o ) { + $structure = "Oui" if $texte =~ m|\s*\s*

|o; + } + } + print OUT "$id\t$fichier\t$nom\t$score\t$pdfVersion\t$structure\t$date\t$titre"; + print OUT "\t$revue\t$issn\t$eissn\t$genre\t$dt\t$wos\t$scienceMetrix\t$inist\n"; + } + } + else { + ; + } + $json = ""; + } + } + +exit 0; + + +sub usage +{ +print STDERR "Usage : $programme -l logfile ( -p préfixe | -c corpus ) [ -r répertoire ] [ -s sortie ] \n"; +print STDERR " $programme -h \n"; + +exit shift; +}