张乐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)测试:

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

输出详细的概率信息

时间: 2024-11-03 12:21:41

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

linux下访问window的共享文件,在命令行实现方法

1.挂载共享目录 mount -t cifs //192.168.0.1/aa  /tmp/export -o username=text,password=test //192.168.0.1/aa   为:windows的共享目录 /tmp/export   为:挂在点 username=test   test为windows的账户 passowrd=test   test为windows的对应帐号密码 2.取消挂载 第一种:umount //192.168.0.1/aa 第二种:umoun

go语言执行windows下命令行的方法

转自:http://www.jb51.net/article/61727.htm 在golang里执行windows下的命令行,例如在golang里面调用 del d:\a.txt 命令 package main import( "fmt" "os/exec" ) func main(){ c := exec.Command("cmd", "/C", "del", "D:\\a.txt"

mysql命令行备份方法

1.备份命令 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql mysqldump -h 192.168.1.100 -p 3306 -uroot -ppassword --database cmdb > /data/backup/cmdb.sql 2.备份压缩 导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名

一张地图,告诉你NodeJS命令行调试器语句

NodeJS提供脚本调试. 进入node debug xx.js您可以进入调试模式. 版权声明:本文博客原创文章,博客,未经同意,不得转载.

(转载)在m文件里调用simulink模型---sim命令的用方法

在m文件里调用模型mdl关键是用sim命令. [ t, x, y ] = sim( model, timespan, options, ut) [ t, x, y1, y2, -, yn] = sim( model, timespan, options, ut) (1)model:需要进行仿真的系统模型框图名称: (2)timespan:系统仿真的时间范围(起始至终止时间),可有如下形式: tFinal:设置仿真终止时间.仿真起始时间默认为0: [tStarttFinal]:设置起始时间(tSt

程序:从命令行接收多个数字,求和之后输出结果

public class SumOfArguments { public static void main(String[] args) { // TODO Auto-generated method stub int sum = 0; int count=0;; String s=""; for(String str : args) {count++; s+=str; if(count!=args.length) s+="+"; sum += Integer.pa

ZMAN的学习笔记之Python篇:命令行解析

ZMAN的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:ZMAN  (http://www.cnblogs.com/zmanone/) 在Python中,对命令行的解析方式不唯一,本文将介绍两种方法:一种是用sys.argv手动设置,另一种是用argparse模块. 一.sys.argv是什么 首先看一个例子: import sys print(len(sys.argv)) for arg in sys.argv: print(arg) 将

magento数据库导入最好用命令行进行导入

特别是在本地进行调试时,往往在phpmyadmin里面无法顺利导入数据库,无论数据库有多小,有时真的无法导入.那么就尝试用命令行的方法进行导入,一般都会成功. 1.安装了phpmyadmin客户端后,通过win的开始菜单--> MYSQL --> MYSQL SERVER 5.6 --> MYSQL 5.6 COMMAND LINE CLIENT 进入 2.输入连接数据库的密码后,会看到 mysql> 提示符 3.在提示符后输入 mysql -u root -p这里输入密码 数据库

《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5  从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数据保存前执行一些操作. 解决方案 假设你有如图7-7所示的模型. 图7-7. 包含实体Technician和ServiceCall的模型 在这个模型中,每个技术员(technician)都有一些业务服务请求(service call),业务服务请求包含联系人姓名,问题.使用代码清单7-4,创建一个扩展方法获取