begin process at 2008 07 19 16:39:23
1 212 905 membres
227 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ANALYSE DES MOTS D'UN TEXTE


Information sur la source

Catégorie :Fichiers / Disque Classé sous : texte, analyse, caractere, frequent, noms Niveau : Initié Date de création : 16/02/2008 Date de mise à jour : 16/02/2008 23:06:43 Vu / téléchargé: 4 046 / 181

Note :
Aucune note

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

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

  • #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;
  • }
#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
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   source

Télécharger le zip

16 février 2008 19:48:07 :
structure améliorée
16 février 2008 19:52:45 :
Meilleur commentaire
16 février 2008 22:54:38 :
recherche dichotomique
16 février 2008 23:06:43 :
ajout du fichier lex.yy.c (génération du fichier analyse.lex)
  • signaler à un administrateur
    Commentaire de acx01b le 16/02/2008 22:39:13

    salut

    pour la recherche dans le dictionnaire: soit le dico est trié est tu fais ta recherche par dichotomie, soit il est trié en arbre si tu as besoin de pouvoir rajouter de nouveaux éléments, dans tous les cas il faut pouvoir faire la recherche en log n si le dico est très grand

  • signaler à un administrateur
    Commentaire de manta7 le 16/02/2008 22:41:04

    ok si le dico est stocké en mémoire mais avec les fichiers comment faire en log n ? c'est pas possible

  • signaler à un administrateur
    Commentaire de manta7 le 16/02/2008 22:55:31

    J'avais oublié que mon dictionnaire était stocké en mémoire :)
    C'est bon c'est corrigé

  • signaler à un administrateur
    Commentaire de gamemonde le 16/02/2008 22:56:48

    if(argc<=1) { fprintf(stderr, "absence de fichier source\n"); exit(1);

    tu as quand meme alloué des pointeurs ou sont les free?

    #include "lex.yy.c" // pas vu le fichier et on n'inclu pas de fichier .c mais des fichiers .h

  • signaler à un administrateur
    Commentaire de manta7 le 16/02/2008 23:00:16

    Ouais c'etait pas génant parce que j'avais alloué une toute petite taille mais bon c'est corrigé
    Et pour ton information pour le lex il faut inclure le fichier lex.yy.c qui a été généré avec la commande lex sous linux, documente toi avant plutot.

  • signaler à un administrateur
    Commentaire de gamemonde le 17/02/2008 00:47:36

    1 - toujours desalloué avant de quitter c'est la base en mémoire
    2 - comment peux tu dire "informe toi avant" ça aurais pus être toi qui aurait créer ce fichier . il n'est pas mentionné nul part que ça venait d'une commande linux.

    mais bon moi je suis sur windows donc bonne continuation!

  • signaler à un administrateur
    Commentaire de manta7 le 17/02/2008 01:24:14

    je dis "informe toi avant" parce que j'ai envie de le dire ok ? tu me dis on met toujours des .h dans les include et bien moi je te dis non, c'est tout.

  • signaler à un administrateur
    Commentaire de gamemonde le 17/02/2008 02:00:36

    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é .

  • signaler à un administrateur
    Commentaire de manta7 le 17/02/2008 11:10:21

    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

  • signaler à un administrateur
    Commentaire de vecchio56 le 17/02/2008 11:22:53 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de acx01b le 17/02/2008 13:48:15

    je suis d'accord avec manta7 il a qu'à se renseigner sur lex avant de poster

  • signaler à un administrateur
    Commentaire de vecchio56 le 17/02/2008 14:11:29 administrateur CS

    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.

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS