最近做了一个应用最大熵模型对movie-review做二元情感分类的项目。
其中最大熵模型应用的是张乐教授的最大熵工具http://homepages.inf.ed.ac.uk/lzhang10/maxent_toolkit.html。
分析数据movie-review应用的是Bo-Pang http://www.cs.cornell.edu/people/pabo/movie-review-data/
其中movie-review如下图所示,由于movie-review的储存格式不是最大熵模型需要的格式,所以要对movie-review的数据进行整理
。
最大熵模型要求每行第一个词表示类别,所以就需要将上面的txt文件存储格式转化一下。
应在下面的C++程序转化数据:
/*********************************************** *创建人:李航前 *创建时间:2014.12.14 *创建目的:为张乐的最大熵分类器提供格式转换功能 ************************************************/ #include <string> #include <iostream> #include <fstream> #include <io.h> #include <set> using namespace std; void ReadFile(set<string>& a,char* dir){ //读取dir文件夹中所有txt文件名,并把文件名存储到set数组中 //dir代表文件路径名,a代表set数组名 _finddata_t fileDir; //char* dir="temp\\*.txt"; long lfDir; if((lfDir = _findfirst(dir,&fileDir))==-1l) printf("No file is found\n"); else{ do{ a.insert(fileDir.name); }while( _findnext( lfDir, &fileDir ) == 0 ); } _findclose(lfDir); } int main(){ char* fileName1="pos\\*.txt";//pos文件夹的所有txt文件 char* fileName2="neg\\*.txt";//neg文件夹的所有txt文件 set<string> posFile;//用于存储pos文件夹中所有txt文件名 set<string> negFile;//用于存储neg文件夹中所有txt文件名 ReadFile(posFile,fileName1); ReadFile(negFile,fileName2); ofstream outfile;//新建一个文件输出流 outfile.open("result.txt");//输出结果的文件命名为result.txt ifstream infile;//新建一个文件输入流 string sentence;//用于转换文件格式的字符串 for(set<string>::iterator iIter=posFile.begin();iIter!=posFile.end();iIter++){ infile.open("pos\\"+*iIter); if (!infile){ cout<<"can not open file"<<endl; system("pause"); break; } outfile<<endl<<"pos "; while(true){ infile>>sentence; //判断是否读到文件末尾,如果读到文件末尾,则跳出while()循环 if(infile.eof()) break; outfile<<sentence<<" "; } infile.close(); } for(set<string>::iterator jIter=negFile.begin();jIter!=negFile.end();jIter++){ infile.open("neg\\"+*jIter); if (!infile){ cout<<"can not open file"<<endl; system("pause"); break; } outfile<<endl<<"neg "; while(true){ infile>>sentence; //判断是否读到文件末尾,如果读到文件末尾,则跳出while()循环 if(infile.eof()) break; outfile<<sentence<<" "; } infile.close(); } outfile.close(); /*for(set<string>::iterator iIter=posFile.begin();iIter!=posFile.end();iIter++){ outfile<<*iIter<<" "; } outfile<<endl; for(set<string>::iterator jIter=negFile.begin();jIter!=negFile.end();jIter++){ outfile<<*jIter<<" "; } */ system("pause"); return 0; }
我们取90%的数据作为训练数据,取10%的数据作为测试数据。训练数据转化得到得到一个result.txt文件,用这些格式的数据训练Model,然后测试数据进行测试。
1)训练命令:
其中,maxent是运行命令;-m指示训练输出的模型的名字,由modelName给出;-i指示训练迭代的次数;train.txt是输入的特征文本。该形式不会有训练信息显示
2)测试:
将输出对每个事件的预测结果
输出详细的概率信息
时间: 2024-11-03 12:21:41