GibbsLDA dataset.h分析

GibbsLDA dataset.h分析

直觉上来说,可能和wordmap.txt有着很大关系,因为原文件中包含两个map,分别是mapid2word和mapword2id,来研读一下。

// map of words/terms [string => int]
typedef map<string, int> mapword2id;
// map of words/terms [int => string]
typedef map<int, string> mapid2word;

有document和dataset两个类。

class document:

完全就是一个建立的函数。各种构造函数。其中包含有一个int类型指针(int*)words,这个很关键,因为gibbsLDA就是使用的是map之后的数字来表示原始的字符串,所以我猜这个应该就是用int表示的一个一个的字符串了,string类型的原始字符串(string)rawstr,int类型的长度(int)length。

构造函数1:空构造函数,空赋值。

document() {
words = NULL;
rawstr = "";
length = 0; 
}

构造函数2:仅带有长度的构造函数。有了长度就来一个数组好了,words指向int表示的文章的数组,length纪录长度。

document(int length) {
this->length = length;
rawstr = "";
words = new int[length];    
}

构造函数3:带有长度和原始数据。

document(int length, int * words) {
this->length = length;
rawstr = "";
this->words = new int[length];
for (int i = 0; i < length; i++) {
    this->words[i] = words[i];
}
}

构造函数4:带有原始字符串的构造函数。

document(int length, int * words, string rawstr) {
this->length = length;
this->rawstr = rawstr;
this->words = new int[length];
for (int i = 0; i < length; i++) {
    this->words[i] = words[i];
}
}

构造函数5:用vector表示的向量中包含有int类型文章。

document(vector<int> & doc) {
this->length = doc.size();
rawstr = "";
this->words = new int[length];
for (int i = 0; i < length; i++) {
    this->words[i] = doc[i];
}
}

构造函数6:包含有原始字符串和vector的文章。

document(vector<int> & doc, string rawstr) {
this->length = doc.size();
this->rawstr = rawstr;
this->words = new int[length];
for (int i = 0; i < length; i++) {
    this->words[i] = doc[i];
}
}

析构函数:释放指针。

~document() {
if (words) {
    delete words;
}
}

可以发现对于class document来说,功能不算很多,就是记录原始数据文章的用处,其中rawstr为字符串,word为int类型的指针。

class dataset

主要也就是构造啊,插入啊什么的,也不算很复杂。

docs为指向诸多*documents的指针。(document **)docs。

_docs为在inference情况下使用的指针。

_id2id也是在inference情况下才会使用的。

M = number of documents.

V = number of words.

构造函数1:空构造函数

构造函数2:M篇文章的构造函数。

析构函数:主要是对于指针进行释放,也就是对于docs和_docs进行释放。

dellocate函数是个很神奇的函数,虽然还没有明白到底在什么情况下使用,它把所有的docs和_docs都清空了。

add_doc,在idx的位置添加一篇文章。

void add_doc(document * doc, int idx) {
if (0 <= idx && idx < M) {
    docs[idx] = doc;
}
}   

_add_doc作用同上,不过就是inference情况下使用。

所以目前就知道,可以构造和析构class dataset。

static int write_wordmap(string wordmapfile, mapword2id * pword2id);
static int read_wordmap(string wordmapfile, mapword2id * pword2id);
static int read_wordmap(string wordmapfile, mapid2word * pid2word);

int read_trndata(string dfile, string wordmapfile);
int read_newdata(string dfile, string wordmapfile);
int read_newdata_withrawstrs(string dfile, string wordmapfile);

这些函数,read_wordmap可能就是和wordmap.txt有关的,也就是str(word)和int(word)相互map的。

而read_trndata可能就是读取训练trndata.dat数据的函数,而read_newdata可能就是在inference的时候使用的函数。dfile就是文件路径,wordmapfile我想就是wordmap.txt吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值