begin process at 2012 02 05 03:50:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > ANALYSE DES MOTS D'UN TEXTE

ANALYSE DES MOTS D'UN TEXTE


 Information sur la source

Note :
Aucune note
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é :10 634 / 368

Auteur : manta7

Ecrire un message privé
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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   source

Télécharger le zip


 Historique

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)

 Sources du même auteur

Source avec Zip MODIFIER LES SOUS TITRES. [LINUX]
Source avec Zip INTELLIGENCE ARTIFICIELLE AUX ÉCHECS.
RECHERCHE DE CHEMIN (RECURSIVITÉ ET BACKTRACKING)
** PALINDROME.CPP : RÉECRIT UN CHIFFRE OU UN TEXTE À L'ENVER...
-PROGRAMME SERVANT A CALCULER PI, TESTE SOUS VC++ ET DEVC++

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

 Sources en rapport avec celle ci

Source avec Zip ANALYSEUR SYNTAXIQUE DU LANGUAGE PASCAL (ANALYSE DESCENDANTE... par wiseman1989
Source avec Zip ANALYSEUR DE TEXTE (MAJ V2) par sholvaC
Source avec Zip GÉNÉRATEUR DE TEXTES ALÉATOIRES COHÉRENTS (CHAÎNES DE MARKOV... par CptPingu
Source avec Zip Source avec une capture ALGORITHME DE CRYPTAGE/DECRYPTAGE par besilent
Source avec Zip EDITEUR DE TEXTE EN LIGNE DE COMMANDE - C - DEVCPP - CHAINES... par pyronet

Commentaires et avis

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

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

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é

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

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.

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!

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.

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

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

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.

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

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


Discussions en rapport avec ce code source dans le forum

sauvegarde de fichier txt sur 30 premier caractere [ par Goorou ] besoin daide jexplique ce code set pour creer un fichier texte mais jaimerais que les caractere qui serons ecris dans le fichier sois les 30 premiere rechercher chaine de caractere dans texte [ par melkiorlenecrarque ] Bonjour! Je dois rechercher une chaine de caractere dans un buffer, Quelle est la maniere la plus optimis&#233;e, sachant que je programme avec les a Insertion texte dans un fichier [ par jeremy85rocher ] Bonjour &#224; tous.Mon probl&#232;me est le suivant : je souhaite cr&#233;er un programme console qui permet d'inserer du texte dans un fichier&nbsp; Donner un nom à un fichier texte en C++ lors de sa création [ par nanettelmontpel ] Bonjour!!Bon ben je crois que le titre r&#233;sume bien la chose....Voil&#224; j'aimerais dans mon programme que lors de la cr&#233;ation d'un fichier Fstream [ par tobratus ] Bonjour tout le monde, Voici en substance le probl&#232;me. Je lis un fichier texte avec certaines donn&#233;es binaires en mode texte. La lecture s Ecrire sur une bitmap [ par Mastersam ] Bonjour je cherche comment écrire du texte sur une bitmap. J'ai une idée de la méthode à utiliser, j'ai pensé à écrire dans un static texte puis récup Imprimer un texte en vertical [ par themaste ] Salut a tous!Voila, je suis un un petit programme d'impression, et j'aimerais pouvoir ecrire en vertical.J'utilise les fonctions des CDC comme textout Afficher texte sous titrage films [ par forthomme ] Bonjour,J'ai besoin de cr&#233;er et d'afficher un sous titrage pour un film &#233;tranger &#224; des fins personnelles (ma copine ne parle pas anglai créer un fichier texte dont le nom est une date [ par billybob13 ] J'aimerai cr&#233;er un fichier texte, avec fopen. Mais le nom du fichier doit &#234;tre une date du moment (now).Je ne vois pas comment faire. Envoyer du texte [ par razord ] Bonjour. Je voudrais faire un programme serveur qui attend une connection, et un programme client qui va se connecter au serveur, et qui va lui envoye


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,326 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales