【发布时间】:2022-01-22 16:45:44
【问题描述】:
这是我从google word2vec.c下载的word2vec的一段代码:
// Reduces the vocabulary by removing infrequent tokens
void ReduceVocab() {
int a, b = 0;
unsigned int hash;
for (a = 0; a < vocab_size; a++) if (vocab[a].cn > min_reduce) {
vocab[b].cn = vocab[a].cn;
vocab[b].word = vocab[a].word;
b++;
} else free(vocab[a].word);
vocab_size = b;
for (a = 0; a < vocab_hash_size; a++) vocab_hash[a] = -1;
for (a = 0; a < vocab_size; a++) {
// Hash will be re-computed, as it is not actual
hash = GetWordHash(vocab[a].word);
while (vocab_hash[hash] != -1) hash = (hash + 1) % vocab_hash_size;
vocab_hash[hash] = a;
}
fflush(stdout);
min_reduce++;
}
在LearnVocabFromTrainFile 函数中调用。
假设min_reduce=5
因此,如果输入文件不是那么好,我的意思是如果一个词说“你好”,出现在ReduceVocab 调用时出现4,并且vocab 将从自身中删除hello。
后来,当ReduceVocab 再次调用时,幸运的是hello 出现了5 次.. 似乎ReduceVocab 将再次删除hello。
事实上,hello 出现了 9 次,应该在 vocab 中,但是上面的代码删除了它。
这并不重要,因为这种情况似乎很少发生。只是想知道我的分析是否正确,或者我错过了代码中的某些内容。
感谢您的建议。
【问题讨论】:
-
变量声明很重要。请发布一个完整的示例,其中包含所有声明以及使用该函数的某种上下文。见minimal reproducible example
-
谢谢,我已经添加了我下载代码的网址。