Analyse des mots d'un texte

Soyez le premier à donner votre avis sur cette source.

Vue 13 474 fois - Téléchargée 555 fois

Description

C'est un petit programme qui analyser un texte et afficher tous les mots qui sont dans le dictionnaire, et va ensuite afficher tous les noms propres (comme marseille, john...)

C'est le début d'un projet (que je ne connais pas encore), si vous avez des idées pour développer un peu ce programme, et en faire la base de quelque chose de plus grand, n'hésitez pas à m'apporter vos suggestions !

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "stdbi.h"
#include "lex.yy.c"

extern char lexeme[];
extern int valeur;

typedef struct { //Structure du dictionnaire
	char* mot;
	int occ;
}sdico;

typedef struct { //Structure du texte
	char *mot;
	int *nombre;
	int type; //0 : mot dans le dico, 1 : pas dans le dico, 2 : entier
} stexte;
	
void lexeme_minuscule() //Convertit lexeme en minuscule
{
	int taille, i;
	taille=strlen(lexeme);
	for(i=0;i<taille;i++)
		lexeme[i]=tolower(lexeme[i]);
	return;
}

/*int present(sdico *dico, int taille) //Renvoie si lexeme est présent dans le dico
{
	int i;
	for(i=0;i<taille;i++)
	{
		if(strcmp(dico[i].mot,lexeme) == 0)
			return i;
	}
	return 0;
}*/
	

int present(sdico *dico, int inf, int sup) //Fonction dichotomique
 {

	 int milieu;

	 if (sup<inf)
		 return -1;

	milieu = ((inf + sup)/2);
	 
	 if ( strcmp(lexeme, dico[milieu].mot) == 0 )
		return milieu;
	 if ( strcmp(lexeme, dico[milieu].mot) < 0 )
		 return(present(dico, inf, milieu-1));
	 return(present(dico, milieu+1, sup));
	 
 } 

int main(int argc, char** argv)
{
	/*VARIABLES*/
	int uc, i=0, tdico=0, ttexte=0, taille, temp; 
	
	/*STRUCTURES*/
	sdico *dico;
	stexte *texte;
	dico=malloc(1*sizeof(sdico));
	texte=malloc(1*sizeof(stexte));
	
	/*TEST DES ARGUMENTS*/
	if(argc<=1) { fprintf(stderr, "absence de fichier source\n"); exit(1); } //Test du fichier source
	
	/*REDIRECTION DE L'ENTREE YYIN DANS LE DICTIONNAIRE*/
	yyin=fopen("dico.dic","r");
	
	/*STOCKAGE DU DICTIONNAIRE DANS LA STRUCTURE DICO*/
	uc=yylex();
	while(uc!=0)
	{
		if(uc==NOMBRE)
			printf("%d : NOMBRE\n", valeur);
		else if(uc==MOT)
		{
			taille=strlen(lexeme)+1;
			dico=realloc(dico,++i*sizeof(sdico));
			dico[i-1].mot=malloc(sizeof(char)*taille);
			strcpy(dico[i-1].mot, lexeme);
		}
			
		uc=yylex();
	}
	tdico=i;
	
	/*REDIRECTION DE L'ENTREE YYIN DANS LE DICTIONNAIRE*/
	if( (yyin=fopen(argv[1],"r")) == 0 )
	{ fprintf(stderr, "fichier source inexistant\n"); exit(1); }
	
	
	/*STOCKAGE DU TEXTE DANS LA STRUCTURE TEXTE*/
	uc=yylex();
	while(uc!=0)
	{
		
		
		if(uc==MOT)
		{
			texte=realloc(texte,++ttexte*sizeof(stexte));
			lexeme_minuscule(); //Transforme lexeme en minuscule
			
			texte[ttexte-1].mot=malloc( strlen(lexeme)+1 * sizeof(char) );
			
			if( (temp=present(dico, 0, tdico)) != 0 ) //Si lexeme est un mot connu
				texte[ttexte-1].type=0;
			
			else //Si lexeme n'est pas un mot connu
				texte[ttexte-1].type=1;
			
			strcpy(texte[ttexte-1].mot, lexeme);
			//puts(lexeme);
		}
		else if(uc==NOMBRE)
		{
			texte=realloc(texte,++ttexte*sizeof(stexte));
			texte[ttexte-1].nombre=malloc(sizeof(int));
			
			texte[ttexte-1].nombre[0]=valeur;
			
			texte[ttexte-1].type=2;
		}
		uc=yylex();
	}
	
	
	/*AFFICHAGE*/
	for(i=0;i<ttexte;i++)
	{
		printf("%d : ",i);
		if(texte[i].type == 2)
			printf("%d : %d\n", texte[i].nombre[0], texte[i].type);
		else
			printf("%s : %d\n", texte[i].mot, texte[i].type);
		
	}
	
	
	/*LIBERATION DE LA MEMOIRE*/
	free(dico);	
	free(texte);
	
	return 0;
}

Conclusion :


J'ai aussi codé un peu en lex (essayez c'est tout simple et tres puissant) pour la liste des mots.

Executable sous linux de la maniere :
./main fichier : avec fichier qui le texte a analyser

Télécharger le dictionnaire sur : http://www.pallier.org/ressources/dicofr/liste.de.mots.francais.frgut.txt
Et renommer le dans votre dossier dico.dic

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est pas le problème de se renseigner ou pas. La remarque de dire qu'on inclus pas des .c est justifiée. C'est peut être la facon courante de faire avec lex/yacc, mais c'est pas plus compliqué de faire un .h qui déclare les fonctions à appeler.

Sinon, je trouve qu'il y a encore plus de malloc de que free, bizarre...

Dans ta fonction present:
Au lieu d'évaluer 2 fois strcmp(lexeme, dico[milieu].mot), il faudrait le faire 1 fois et mettre le résultat dans une variable locale.

Ton système d'allocation à base de realloc me semble bien peu optimisé (à chaque nouveau mot tu fais une réallocation).
En C++, avec des map<string>, on peut faire la même chose, en plus optimisé et plus simple à comprendre.
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
4
je suis d'accord avec manta7 il a qu'à se renseigner sur lex avant de poster
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
manta7, ton agressivité n'est pas du tout justifiée. gamemonde a juste fait remarquer qu'en principe, on n'inclue pas des .c, uniquement des .h. Il se trouve qu'ici tu n'a pas le choix car tu travailles avec un générateur de code (qui génère du code sale).
Essaie de rester un peu plus cordial à l'avenir.
Messages postés
105
Date d'inscription
samedi 25 janvier 2003
Statut
Membre
Dernière intervention
13 décembre 2008

Déja on écrit "sais tu" et non "c'est tu"
Ensuite si tu avais jeté un coup d'oeil tu comprendrais que le fichier lex.yy.c je ne vais l'inclure qu'une seule fois et c'est tout
Messages postés
338
Date d'inscription
samedi 9 août 2003
Statut
Membre
Dernière intervention
9 juillet 2011
2
c'est tu au moins pourquoi je dis cela. en programmation lorsque le Préprocesseur va voir ton include et bien il va ajouté le fichier .c puisque ce fichier contient des fonctions si . par hasard tu augmente la grosseur de ton projet et tu veux inclure encore ce même fichier . l'éditeur de lien va t'envoyé des erreurs disant que cette fonction a déjà été défini.

j'ai jamais dit que c'étais pas possible mais pas suggéré .
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.