2021SC@SDUSC
附所有代码链接:https://github.com/Jayshen0/ Unsupervised-Deep-Keyphrase-Generatio
本篇分析代码模块为:extract.py(二)
在上一篇博客里,我们对word2vec的思想以及部分代码进行了分析、学习,下面我们就来继续看一下word2vec模型整个过程到底是如何实现的。然后开始分析Doc2vec模型在本篇代码中是如何根据短语库来生成词向量的。
(二)Word2Vec模型源码再分析
附参考链接:机器学习算法实现解析——word2vec源码解析_null的专栏-CSDN博客_word2vec源码分析
1.预处理:实现对sigmoid函数的近似计算
在word2vec中,将区间[−6,6](设置的参数MAX_EXP为6)等距离划分成EXP_TABLE_SIZE等份,并将每个区间中的sigmoid值计算好存入到数组expTable中,需要使用时直接从数组中查找。
expTable = (real *)malloc((EXP_TABLE_SIZE + 1) * sizeof(real));// 申请EXP_TABLE_SIZE+1个空间
// 计算sigmoid值
for (i = 0; i < EXP_TABLE_SIZE; i++) {
expTable[i] = exp((i / (real)EXP_TABLE_SIZE * 2 - 1) * MAX_EXP); // Precompute the exp() table
expTable[i] = expTable[i] / (expTable[i] + 1); // Precompute f(x) = x / (x + 1)
}
2.构建词库
整个过程的流程如下:最主要的工作是对文本进行处理,包括低频词的处理,hash表的处理等。
(1)首先,会在词库中增加一个“< /s>”的词,同时,在读取文本的过程中,将换行符“\n”也表示成该词:
if (ch == '\n') {
strcpy(word, (char *)"</s>");// 换行符用</s>表示
return;
(2)在循环的过程中,不断去读取文件中的每一个词,并在词库中进行查找,若存在该词,则该词的词频+1,否则,在词库中增加该词。最终,会过滤掉一些低频词。在得到最终的词库之前,还需根据词库中的词频对词库中的词进行排序。
① 计算词的hash值
int GetWordHash(char *word) {
unsigned long long a, hash = 0;
for (a = 0; a < strlen(word); a++) hash = hash * 257 + word[a];
hash = hash % vocab_