首页 > 代码库 > 张乐C++最大熵模型的命令行实现方法

张乐C++最大熵模型的命令行实现方法

最近做了一个应用最大熵模型对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)测试:

将输出对每个事件的预测结果


输出详细的概率信息







张乐C++最大熵模型的命令行实现方法