GibbsLDA utils.cpp分析
头文件
都看到了这儿,头文件有啥已经不重要了,都在心中。
函数
函数1:
int utils::parse_args(int argc, char ** argv, model * pmodel);
变量:
model_status就是当前model的状态,现在因为还不确定,所以是KNOWN。
dir就是存有model的文件夹的路径?
model_name是model的名称?
dfile肯定是最后要执行的file的名称。
alpha,beta,k,niters,savestep,twords,withrawdata这些都是文档中就有的参数。
然后就开始分析参数。
if (arg == "-est") {
model_status = MODEL_STATUS_EST;
} else if (arg == "-estc") {
model_status = MODEL_STATUS_ESTC;
} else if (arg == "-inf") {
model_status = MODEL_STATUS_INF;
}
以上是对于状态的确定
else if (arg == "-dir") {
dir = argv[++i];
}
以上是已经训练好的模型的文件夹的路径
else if (arg == "-dfile") {
dfile = argv[++i];
}
以上是要进行训练的或者要进行inference的文件的路径,以.dat结尾
else if (arg == "-model") {
model_name = argv[++i];
} else if (arg == "-alpha") {
alpha = atof(argv[++i]);
} else if (arg == "-beta") {
beta = atof(argv[++i]);
} else if (arg == "-ntopics") {
K = atoi(argv[++i]);
} else if (arg == "-niters") {
niters = atoi(argv[++i]);
} else if (arg == "-savestep") {
savestep = atoi(argv[++i]);
} else if (arg == "-twords") {
twords = atoi(argv[++i]);
} else if (arg == "-withrawdata") {
withrawdata = 1;
} else {
// any more?
}
以上是模型的名称和各种参数的设置。虽然说,这里面有withrawdata,但是似乎手册中并没有说道这一点,可能也用不到。
pmodel
pmodel是一个传入的model,似乎是,一个指针。因为已经确定了各种的参数,所以要讲各种参数设置到这个model的各项设置中,可以看到其中的设置很有趣,都是直接赋值,我想在pmodel的初始化过程中应该已经进行了文档中数值的初始化的操作。
string::size_type idx = dfile.find_last_of("/");
if (idx == string::npos) {
pmodel->dir = "./";
} else {
pmodel->dir = dfile.substr(0, idx + 1);
pmodel->dfile = dfile.substr(idx + 1, dfile.size() - pmodel->dir.size());
printf("dir = %s\n", pmodel->dir.c_str());
printf("dfile = %s\n", pmodel->dfile.c_str());
}
}
以上代码是为了确定model的文件夹和文件名。
下面的两段巨长的代码是分别是-estc 和 -inf的时候才会分别执行的。
if (model_status == MODEL_STATUS_INF) {
if (dir == "") {
printf("Please specify model directory please!\n");
return 1;
}
if (model_name == "") {
printf("Please specify model name for inference!\n");
return 1;
}
if (dfile == "") {
printf("Please specify the new data file for inference!\n");
return 1;
}
pmodel->model_status = model_status;
if (dir[dir.size() - 1] != '/') {
dir += "/";
}
pmodel->dir = dir;
pmodel->model_name = model_name;
pmodel->dfile = dfile;
if (niters > 0) {
pmodel->niters = niters;
} else {
// default number of Gibbs sampling iterations for doing inference
pmodel->niters = 20;
}
if (twords > 0) {
pmodel->twords = twords;
}
if (withrawdata > 0) {
pmodel->withrawstrs = withrawdata;
}
// read <model>.others file to assign values for ntopics, alpha, beta, etc.
if (read_and_parse(pmodel->dir + pmodel->model_name + pmodel->others_suffix, pmodel)) {
return 1;
}
}
这个源码缩进的方式我也是醉了。。
以上是inference的判断,需要文件夹,模型的名称和需要判断的文件的名称。
函数2:
int utils::read_and_parse(string filename, model * pmodel);
这个从文件进行读取的就很简单了。不过我觉得也只有在特殊情况-estc和-inf的情况才会使用的。
比较简单,不必多言。
函数3:
string utils::generate_model_name(int iter);
这个函数的作用就是产生输出的model的name。
可以看到对于不同的iter,前面需要进行0的补充操作。modelname = “model-buff”/”model-final”
函数4:
void utils::sort(vector<double> & probs, vector<int> & words);
根据prob的大小对于probs和words进行降序排序。
函数5:
void utils::quicksort(vector<pair<int, double> > & vect, int left, int right);
根据第二个元素double进行排序的小快排。也是降序排序。