|
Trouver une ressource
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
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
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
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
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ée, sachant que je programme avec les a
Insertion texte dans un fichier [ par jeremy85rocher ]
Bonjour à tous.Mon problème est le suivant : je souhaite créer un programme console qui permet d'inserer du texte dans un fichier
Donner un nom à un fichier texte en C++ lors de sa création [ par nanettelmontpel ]
Bonjour!!Bon ben je crois que le titre résume bien la chose....Voilà j'aimerais dans mon programme que lors de la création d'un fichier
Fstream [ par tobratus ]
Bonjour tout le monde, Voici en substance le problème. Je lis un fichier texte avec certaines donné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éer et d'afficher un sous titrage pour un film étranger à 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éer un fichier texte, avec fopen. Mais le nom du fichier doit ê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
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|