Word2Vec程序解析

word2vec主要的层次结构

Word2Vec程序解析_第1张图片


vocab是一个结构体数组。

*Vocab_hash是一个hash链表。

vocab存入词的时候实际是按照先后顺序存储的。为了方便查找,在词存入的时候顺便把词在链表中的位置存入到vocab_hash中,而该词的vocab_hash位置有hash(word)决定,这样查找起来很快。

 

ReadWord:逐个字符读入词(一个汉字是不是拆成两个字符读入呢?)

GetWordHash: hash = hash*257+word[i];

SearchVocab: 在vocab中查找对应的词,返回-1是没有找到,否则返回vocab_hash[hash]。

ReadWordIndex: 返回词在vocab中的位置。

AddWordToVocab:向vocab中插入新词,并在vocab_hash中插入新词的位置。

SortVocab:把vocab中的所有词整理了一遍,出现次数少于最低次数的丢掉,并重新分配了空间。

ReduceVocab:也是重新整理,将出现次数少的词干掉,只是并不重新分配空间,只是将次数不达标的词对应的vocab空间free掉。每被执行一次,min_reduce自增一次。(此函数是为保证vocab最大容量为21M而做的,如果trainfile里的词量太大,只有保留频次高的词。)

 

LearnVocabFromTrainFile:

Word2Vec程序解析_第2张图片



SaveVocab:将vocab中的word和cn写入到输出文件中。

 

TrainModel:

其实网络的实现都是在TrainModelThread中,神经网络分成多线程计算,计算完成之后再进行k-mean聚类。TrainModel生成线程,配置线程。

Word2Vec程序解析_第3张图片



InitNet:给第一层syn0、syn1、syn1neg分配空间。并给syn0赋初始值。并生成二叉树。

CreateBinaryTree:生成一棵节点数为2*vocab_size+1个节点的huffman树,并根据词频给给每个词设定其在huffman树的位置。

TrainModelThread:实现神经网络。(下一节细看这块。)

你可能感兴趣的:(NLP)