void Word2Vec::make_table() { table.resize(table_size); size_t vocab_size = vocab.size(); float power = 0.75f; float train_words_pow = 0.0f; vector<float> word_range(vocab.size()); for(size_t i = 0; i != vocab_size; ++i) { word_range[i] = pow((float)vocab[i]->count, power); train_words_pow += word_range[i]; } size_t idx = 0; float d1 = word_range[idx] / train_words_pow; float scope = table_size * d1; for(int i = 0; i < table_size; ++i) { table[i] = idx; if(i > scope && idx < vocab_size - 1) { d1 += word_range[++idx] / train_words_pow; scope = table_size * d1; } else if(idx == vocab_size - 1) { for(; i < table_size; ++i) table[i] = idx; break; } } }
void fn_echo (inode_state& state, const wordvec& words){ DEBUGF ('c', state); DEBUGF ('c', words); cout << word_range (words.cbegin() + 1, words.cend()) << endl; }