word2vec是训练词向量的方法,tensorflow自带的word2vec代码实现的是Skip-gram方法,即使用中心词来预测周边词。
代码比较简单,BP的一个前向后向过程,主要学习BP网络的搭建方法
</pre><pre code_snippet_id="1951995" snippet_file_name="blog_20161027_1_6826181" name="code" class="python">def maybe_download(filename, expected_bytes)数据下载方法,下载完毕是一个zip文件,只有一行,全是单词,单词之间以空格分隔
def read_data(filename):
读数据,输出一个list,里面的每个项是一个词
def build_dataset(words):
return data, count, dictionary, reverse_dictionary
data是词的list
count是一个counter,保存词和词频
dictionary是一个dict,保存词和词序号
reverse_dictionary是字典的翻转,存储词序号和词
def generate_batch(batch_size, num_skips, skip_window)
每次调用,随机选择数据,构造一个batch
batch_size,batch的大小
num_skips, 训练样本的源端要使用几次,出于n-skip算法的原因,一个中心词要对应多个周边词
skip_windows,左右各考虑多少个词,skip_windows*2=num_skips
return batch, labels
batch数据,numpy多维数组,形状[batch_size]
label数据,numpy多维数组,形状[batch_size, 1],最终的训练数据实际上是成对的,即“一个中心词-->一个周边词”,所以一维矩阵就可以。
此处用了二维矩阵,应该是出于nce_loss函数的需求。
构造网络:
train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
valid_dataset = tf.constant(valid_examples, dtype=tf.int32)
两个placeholder变量,用来接通训练数据。一个constant用来保存开发集数据。
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, embedding_size], stddev=1.0 / math.sqrt(embedding_size)))
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))
待训练的变量