请稍侯

word2vec源码阅读-词典的建立

30 June 2016

word2vec采用数组的形式存储词典,在词典中查找某个词采用hash的形式,将字符串映射到数组的下标。
下面先给出词典的基本数据结构

struct vocab_word {
  long long cn;
  int *point;
  char *word, *code, codelen;
};

const int vocab_hash_size = 30000000;
struct vocab_word *vocab;
int *vocab_hash;
long long vocab_max_size = 1000, vocab_size = 0;

首先,开设一个长度是vocab_max_size的数组,用以记录词语信息;
开设一个长度是vocab_hash_size的整形数据vocab_hash,保存词语和hash值的对应关系,并将每个分量初始化为-1。
当有新的词语加入词典时,调用下面的函数。

int AddWordToVocab(char *word) {
  unsigned int hash, length = strlen(word) + 1;
  if (length > MAX_STRING) length = MAX_STRING;
  vocab[vocab_size].word = (char *)calloc(length, sizeof(char));
  strcpy(vocab[vocab_size].word, word);
  vocab[vocab_size].cn = 0;
  vocab_size++;
  // Reallocate memory if needed
  if (vocab_size + 2 >= vocab_max_size) {
    vocab_max_size += 1000;
    vocab = (struct vocab_word *)realloc(vocab, vocab_max_size * sizeof(struct vocab_word));
  }
  hash = GetWordHash(word);
  while (vocab_hash[hash] != -1) hash = (hash + 1) % vocab_hash_size;
  vocab_hash[hash] = vocab_size - 1;
  return vocab_size - 1;
}

本作品由 pskun 创作