bonjour,
j'ai écrit la fonction ci-dessous qui calcule
tfidf
mon programme est bien exécutable et donne de bons résultats si j'affiche avec cout, mais je veux afficher dans un fichier de sortie, et dans ce cas j'ai eu de mauvaises résultats (il m'affiche les tfidf du dernier fichier seulement aolrs que j'ai 3 fichiers dans le dossier "in")
Code C/C++ :
void calcultfidf( const std::string& filename,const std::string folder)
{ std::multiset<std::string>::const_iterator iter;
std::ofstream ofs ("tfidf.txt");
std::multiset<std::string> liste;
DIR* rep = opendir(folder.c_str());
std::map<std::string, int> map;
fillMap(map, filename);
int nbtotal=0;
int nbfic=0;
int som = 0;
float idf;
float tf;
typedef std::map<std::string, int>::const_iterator iter3;
for (iter3 it = map.begin(); it != map.end(); ++it)
som += it->second;
std::cout << "Les tfidf du document " << filename <<std::endl<<std::endl;
for (iter3 it = map.begin(); it != map.end(); ++it)
{if (som !=0)
{
tf= (float)it->second / som;
std::cout << "* tf du mot " << it->first << " est " << tf << std::endl;
}
if (rep)
{
struct dirent* lecture;
while ((lecture = readdir(rep)))
{
nbtotal++;
if (!isValid(lecture->d_name))
continue;
std::string filename = lecture->d_name;
fillSet (liste, folder + "/" + filename);
}
for (iter=liste.begin(); iter!=liste.end(); iter++)
{
if (it->first == *iter)
nbfic++;
}
}
closedir(rep);
if (nbfic == 0)
idf = 0;
else
idf = log(((float) nbtotal-2) / nbfic);
std::cout<< "* tfidf du mot " << it->first << " est " << tf * idf<<std::endl<<std::endl<<std::endl;
nbfic=0;
}
}
et le main est le suivant:
Code C/C++ :
int main()
{ static const std::string folder = "in";
DIR* rep1 = opendir(folder.c_str());
if (rep1)
{ struct dirent* lecture1;
while ((lecture1 = readdir(rep1)))
{
if (!isValid(lecture1->d_name))
continue;
calcultfidf (folder + "/" + lecture1->d_name, folder);
}
closedir(rep1);
}
system("pause");
return (0);
}
j'espère bien avoir votre aide car ça me bloque et c'est vraiment obligatoire que j'aurai le résultat dans un fichier.