|
begin process at 2008 07 19 16:39:23
Derniers logiciels
|
Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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 de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
Téléchargements
Logiciels à télécharger sur le même thème :
|
|