GibbsLDA dataset.cpp分析

GibbsLDA dataset.cpp分析

头文件

#include <stdio.h>
#include <stdlib.h>
#include "constants.h"
#include "strtokenizer.h"
#include "dataset.h"

头文件有两个标准库和三个自己的头文件。

constant设置了两类常量,buf的大小和MODEL的类型。

strtokenizer的作用就是parse字符串。

dataset的作用就是class dataset中包含有docs指向一篇又一篇的document.

函数

函数1:

dataset::write_wordmap(string wordmapfile, mapword2id * pword2id);

作用是将pword2id输出到wordmapfile中。

函数2:

int dataset::read_wordmap(string wordmapfile, mapword2id * pword2id);

作用是首先读入一个数字,长度要小于512。之后的文章也是长度小于512.(啊,这不要命吗!这么小,再看看)

是来构造word->id的map映射。

函数3:

int dataset::read_wordmap(string wordmapfile, mapid2word * pid2word);

流程和上面的差不多,不过是构造id->map的映射。

函数4:

int dataset::read_trndata(string dfile, string wordmapfile);

输入参数为文件地址和wordmapfile。

第一行首先就是构造了word2id的实体。这个很正确。

然后,然后,这时候buff就是很长很长的1M的BUFF_SIZE_LONG,原来如此。

BUF_SIZE_就是读取每一行的时候的长度大小,对于wordmap来说,确实就不需要太长的BUF_SIZE,所以使用的是BUF_SIZE_SHORT,对于文件来说,就需要长的BUF_SIZE_LONG,这种情况下,就能够很好的处理读入的差别了。原来是在这儿用到了啊。不错不错。

读入文章,第一行,首先读取行数的多少。

因为是对于训练数据来说的,所以如果docs中有东西的话,那就删除之。

然后一行一行地进行读取,切割,如果有一行是空的,那么久返回1,就不能正确的进行read_trndata这个函数。

分词分完了,要开始添加文章了!

首先建立document

document * pdoc = new document(length);

对于parse之后的结果,每次从strtok中进行token的调用,然后检测是否在map中存在,执行两个步骤1.加入document 2.加入map

将文章加入到dataset中。

将word2id进行写出。-->每次执行的时候最先产生的文件就是wordmap.txt,应该就是这么出来的。

函数5:

int dataset::read_newdata(string dfile, string wordmapfile)

这个就要注意了,就不仅仅和之前trndata一样了,就开始有变化了。

首先是除了word2id还构造了id2_id;注意,这个前面没有下划线_,所以相对来说可能是_id2_id的替身?

那么首先读取wordmap,也就是将训练好的wordmap进行读取,这在上一个函数中也是没有的,因为要train嘛,所以要自力更生,而这个就是用已有的wordmap来进行inference。

依旧是打开文件。

然后清空docs,对于_docs进行赋值。不过既然用了_docs,那为什么还需要docs呢?接着看看。

下面就是来一行一行的读取文档,对于其中的词语进行查找,如果没有查找到,作者写了很有意思的一段话:

// word not found, i.e., word unseen in training data

// do anything? (future decision)

也就是说,对于没有出现过的词语是不予考虑的。

如果找到了关键词:那么就进行_id的插入。我现在终于明白”_id2id”和”id2_id”是怎么断句了。

“_id2id” = “_id 2 id”

“id2_id” = “id 2 _id”

所以对于map来说,其实除了word2id之外,还有inference和train两个id集合之间的map关系。

不过为什么需要两个呢?一个不可以吗?对于inference的文档来说,使用原来train的集合中的map关系。

不管怎么说,如果是inference,那么读取的文档中的word2id都是按照新的索引来进行映射的,包括map,包括_docs。

函数6:

int dataset::read_newdata_withrawstrs(string dfile, string wordmapfile);

这个函数的名称感觉和上一个read_newdata感觉差不多,但是多了一个withrawstrs,所以我觉得还是会有一些差别的。

其实就是一点点,因为名称中加了一个_withrawstrs,那么其实按照之前看过的代码来说,只有在构造documents的时候才会发现有str进行传入纪录原来的文档。

这样就不难发现了:

int dataset::read_newdata(string dfile, string wordmapfile):

// allocate memory for new doc
document * pdoc = new document(doc);
document * _pdoc = new document(_doc);


int dataset::read_newdata_withrawstrs(string dfile, string wordmapfile):

// allocate memory for new doc
document * pdoc = new document(doc, line);
document * _pdoc = new document(_doc, line);

至此,dataset.cpp分析完成,那么按照农村包围城市的策略,读取数据,存储方式等等的都差不多了,还有最后最艰苦的两个部分,分别是model和util,先跑个步。

看代码真的是比看文科的东西好太多,前几天复习经济管理,我靠,看着看着都要睡着了,完全就是浪费时间!我觉得还是这种需要思考的东西非常nice!

跑个步锻炼一下,我发现最近我的肚子大了,唉。。。每天30分钟还是不能消耗掉一日三餐加上诸多巧克力,看来还是要恢复健身了,等研究生确定了之后,抓紧恢复,这健身停了,食量没减,有点尴尬。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值