#!/usr/bin/perl

################################################################################
#	Lit le fichier SEGMENTE en phrases (une phrase par ligne passé en argument) 
# 	et extrait les phrases contenants les formes ne ou n'
#	Quelques calculs, voir section impression du rapport
################################################################################

open(FIC, $ARGV[0]);
open(RAPPORT,">Rapport_ExtraitNeg_$ARGV[0]");
open(NEG,">ExtraitNeg_$ARGV[0]");

############## Declarations ####################################################

$i = 0;		#compteur de phrases
$iV = 0;	#compteur de phrases vides
@ph = ();	#contient les phrases du fichier
@phlong = (); 	#contient les longuers des phrases en caracters sans LF

$j = 0;         #compteur de mots dans phrase
@phnbmot = ();  #contient le nombre des mots par phrases`

$k = 0;		#compteur de mots dans fichier entier
@mots = (); 	#contient les mots du fichiers
@motslong = ();	#contient les longuers des mots en caractàres

@slova = (); 	#tableau temporaire pour les mots de la phrase splitée

$iNeg = 0; 	#compteur des phrases négatives.
$kNeg = 0;	#compteur des formes négaive ne et n'
@phnbNeg = ();	#contient le nombre de formes négatives par phrase (0 inclus)
@phNeg = ();	#contient les phrases négatives

################ Lecture du fichier et Acquisition des tableaux ################

foreach $ligne(<FIC>)				#LECTURE DU FICHIER LIGNE PAR LIGNE
{
	@slova = ();				#vider la liste de mots tampon
	$j = 0;					#initialiser le compteur de mots dans la phrase
	$jNeg = 0; 				#initialiser le compteur de formes négatives dans une phrase
	
	if($ligne !~ /^$/)			#si la ligne lue n'est pas vide
	{
		$ph[$i] = $ligne;		#tableau de phrases
		
		# EXTRACTION NEGATION
		if (($ligne =~ /.*\sne\s.*/) || ($ligne =~ /.*\sn'.*/))
		{
			$phNeg[$iNeg] = $ligne; #stocke la phrase négative dans un tableau
			$iNeg++;
			print NEG $ligne;	#imprime la phrase négative dans le fichier	
		}
		
		chomp $ligne;			#enlever le car de la fin de ligne
		$phlong[$i] = length($ligne);	#stocker la longuer de phrases sans LF
		&Separate;			#appel du subprog Separate
		@slova = split(/\s/,$ligne);	#créer un tableau de mots à partir de la ligne
		foreach (@slova)		#inserer les mots de la phrase dans la listemots (linéaire)
		{
			$mots[$k] = $_;
			$motslong[$k] = length($_);
			$k++;			#nb de mots dans le fichier
			$j++;			#nb de mots dans la phrase
			
			# EXTRACTION NEGATION
			if (($_ eq "ne") || ($_ eq "n"))
			{
				$kNeg++;	#formes negatives dans le fichier
				$jNeg++;	#formes negatives dans la phrase	
			}
		}
		
		# EXTRACTION NEGATION
		if (($ligne =~ /.*\sne\s.*/) || ($ligne =~ /.*\sn\s.*/))
		{
			$phnbNeg[$iNeg-1] = $jNeg;	#stocke nb de neg dans les phrases négatives
		}
		
		$phnbmot[$i] = $j; 		#stocke nb de mots de la phrase
		$i++;				#compteur de phrases
	}
	else
	{
		$iV++; 	#compteur des lignes vides
	}
}


################ Imprimmer le rapport ##########################################

print RAPPORT "Fichier :  $ARGV[0] \n\n";

print RAPPORT "_______ Statistiques phrase négatives  (contenant ne ou n') ________\n\n";
print RAPPORT "Nombre de phrases : $i\n";
print RAPPORT "Nombre de lignes vides : $iV\n";
print RAPPORT "Nombre de phrases négatives : $iNeg\n";

$pourcentageNEG = $iNeg / ($i / 100);
print RAPPORT "Pourcentage des phrases négatives : $pourcentageNEG % \n";

print RAPPORT "\n_______ Statistiques formes négatives  (ne ou n') ________________\n\n";
print RAPPORT "Nombre de mots : $k\n";
print RAPPORT "Nombre de formes négatives : $kNeg\n";

$pourcentformesNEG = $kNeg / ($k / 100);
print RAPPORT "Pourcentage des formes négatives (par rapport à la totalité des mots) : $pourcentformesNEG %\n";

@phnbNegRES = &TrouveMaxNum(@phnbNeg);
print RAPPORT "Nombre moyen de formes négatives par phrase négative : $phnbNegRES[2] \n";
print RAPPORT "Phrase avec le plus de formes negative ($phnbNegRES[0] formes) : \n\t$phNeg[$phnbNegRES[1]]\n";


################################################################################
close(FIC);
close(RAPPORT);
close(NEG);
################################################################################


# SOUS-PROGRAMMES ##############################################################

################################################################################
#	Recherche l'élément le plus grand dans un tableau de nombre et
#	renvoi un tableau avec sa valeur [0] , son indexe  [1], la valeur moyenne
#	d'un élément [2] et le nombre d'éléments du tableau [3].  
################################################################################

sub TrouveMaxNum
{	
	my $i = 0;
	my $max = 0;
	my ($imax, $total, $moyenne, $el);
	
        foreach $el(@_) #lit le tableau passé en paramètre de la fonction
	{
		if ($max < $el)
		{
		    $max = $el ;
		    $imax = $i;
		}
		
		$i++;
		
		$total += $el; ##additionne toute les valeurs pour le calcul de la moyenne
        }
	
	$moyenne = $total / $i;

        return ($max, $imax, $moyenne, $i);
}

################################################################################
#	enlève la ponctuation
#	et remplace tout par espace pour une segmentation en mots graphiques	
################################################################################

sub Separate
{
	$ligne =~ s/\.//g;  #point par rien
	$ligne =~ s/,//g;   #point virgule par rien
	$ligne =~ s/;//g;   #virgule par rien
	$ligne =~ s/://g;   #virgule par rien
	$ligne =~ s/!//g;  
	$ligne =~ s/\?//g;
	
	$ligne =~ s/'/ /g;  #apostrophe par espace
	$ligne =~ s/"//g;   #quotes 
	$ligne =~ s/»//g;   #apostrophe 
	$ligne =~ s/«//g;   #apostrophe
	$ligne =~ s/«//g;   #apostrophe
	$ligne =~ s/«//g;   #apostrophe
	
	$ligne =~ s/\(//g;   
	$ligne =~ s/\)//g;   
	$ligne =~ s/\[//g;   
	$ligne =~ s/\]//g;   
	$ligne =~ s/\{//g;   
	$ligne =~ s/\}//g;   
	 
	$ligne =~ s/-t-/ /g;   
	$ligne =~ s/-/ /g;
	
	$ligne =~ s/  / /g; #deux espaces remplacé par 1  	 
}