最近做了一个应用最大熵模型对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 30 train.txt
其中,maxent是运行命令;-m指示训练输出的模型的名字,由modelName给出;-i指示训练迭代的次数;train.txt是输入的特征文本。该形式不会有训练信息显示
2)测试:
将输出对每个事件的预测结果
maxent -p -m modelName -o output.txt test.txt
输出详细的概率信息
maxent -p -m modelName --detail -o output.txt test.txt