GibbsLDA utils.cpp分析

本文档分析了GibbsLDA的utils.cpp文件,包括头文件、五个关键函数的功能和参数解析。函数1用于设置模型状态和参数;函数2负责从文件读取数据;函数3生成输出模型的名称;函数4和5实现按概率降序排序。
摘要由CSDN通过智能技术生成

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进行排序的小快排。也是降序排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值