#!/usr/bin/perl # FaitCooccurrencesDansFenetre.pl < PHILOLynx-dump-normaliseCordialLemmeCatBreveArticleEgalFenetre.CoocMaxDistance20MinCooc3 real 0m17.549s user 0m17.440s sys 0m0.100s wc -l PHILOLynx-dump-normaliseCordialLemmeCatBreve.ArticleEgalFenetre.CoocMaxDistance20MinCooc3 15884 PHILOLynx-dump-normaliseCordialLemmeCatBreve.ArticleEgalFenetre.CoocMaxDistance20MinCooc3 Format de sortie : ... A faire : Bugs et problèmes : DOC $ChaineUsage = "Usage : FaitCooccurrencesDansFenetre.pl \n" ; if (@ARGV != 4) {die $ChaineUsage ; } $FichierEntree = $ARGV[0] ; $CategoriesGardees = $ARGV[1] ; $DistancePlafond = $ARGV[2] ; $CooccurrencePlancher = $ARGV[3] ; %Cooccurrence2Frequence = () ; %Cooccurrence2Distance = () ; @TokensGardes = () ; @PositionTokensGardes = () ; $SeparateurTokens = "\t" ; $SeparateurTokenCategorie = "_" ; $NumeroLigne ; $Trace = 0 ; $PourWindows = 1 ; if ($PourWindows == 0) { $FinLigne = "\n" ; } else { $FinLigne = "\r\n" ; } $FinFenetre = "$FinLigne" ; open(ENTREE, $FichierEntree) ; while ($Ligne = ){ if ($Trace == 1) {print "$NumeroLigne\t$Ligne" ; } if ($Ligne eq $FinFenetre) { if ($Trace == 1) {print $Ligne ; } for ($l1 = 0 ; $l1 < $#TokensGardes ; $l1++) { for ($l2 = $l1 + 1 ; $l2 <= $#TokensGardes ; $l2++) { $Distance = $PositionTokensGardes[$l2] - $PositionTokensGardes[$l1] ; if ($Distance <= $DistancePlafond) { $Cooccurrence = "$TokensGardes[$l1]$SeparateurTokens$TokensGardes[$l2]" ; $Cooccurrence2Frequence{$Cooccurrence}++ ; $Cooccurrence2Distance{$Cooccurrence} .= "$Distance " ; } } } @TokensGardes = () ; @PositionTokensGardes = () ; $NumeroMot = 1 ; } else { chomp($Ligne) ; if ($PourWindows == 1) { chop($Ligne) ; } @ListeTokenCategorie = split(/$SeparateurTokenCategorie/, $Ligne) ; $Categorie = $ListeTokenCategorie[$#ListeTokenCategorie] ; if ($Categorie =~ /$CategoriesGardees/) { if ($Trace == 1) {print "\t\t$Ligne$FinLigne" ; } push(@TokensGardes, $Ligne) ; push(@PositionTokensGardes, $NumeroMot) ; } $NumeroMot++ ; } $NumeroLigne++ ; } close(ENTREE) ; imprimeEnTete() ; foreach $Cooccurrence (keys %Cooccurrence2Frequence) { @ListeCooccurrents = split(/$SeparateurTokens/, $Cooccurrence) ; $Cooccurrent1 = $ListeCooccurrents[0] ; $Cooccurrent2 = $ListeCooccurrents[1] ; $Frequence = $Cooccurrence2Frequence{$Cooccurrence} ; if ($Frequence >= $CooccurrencePlancher) { $Distances = $Cooccurrence2Distance{$Cooccurrence} ; chomp($Distances) ; @ListeDistances = split(/ /, $Distances) ; if (scalar(@ListeDistances) == 1) { $DistanceMoyenne = $ListeDistances[0] ; } else { $TotalDistances = 0 ; for ($i = 0 ; $i <= $#ListeDistances ; $i++) { $TotalDistances += $ListeDistances[$i] ; } $DistanceMoyenne = $TotalDistances / $Frequence , } print "$FinLigne" ; } } imprimeEnPied() ; sub imprimeEnTete{ print "$FinLigne$FinLigne" ; } sub imprimeEnPied{ print "$FinLigne" ; }