maybe_download
下载text8.zip.可以手工下载下来.然后指定text8.zip的路径.
read_data
解压text8.zip,把数据读入到data中. data是一个长数组,保存了所有单词.单词之间用空格分开.text8.zip解决后是一个文本文件,这个文本文件的内容非常简单只有字母组成的单词,单词之间用空格分开,没有别的字符.
build_dataset
将出现次数最多的前50000个词和出现的次数放到数据结构count中.count是个dict,每个元素是个list,list的第0个元素是单词,list的第1个元素是出现次数.dictionary的key是单词,value是单词对应的一个编号. data和words相对对应,words是个单词的list,data是个编号的list,惟一要注意的地方是当单词不在最常用的50000个时,编号为0. 最后把所有不常用的单词(不在top 50000中)记为UNK,出现资料为所有不常用的单词之和.reverse_dictionary也是一个dict,只是把dictionary的key和value反过来了.
generate_batch
作用是给点一个单词,找到它前面和后面的单词.batch_size=8单词是8个词作为一个句子.skip_window=2,表示一个单词的前2个和后2个单词可能当成它周围的单词.num_skips=4表示在每个单词的前后一共选4个单词,认为这4个单词是它周围的单词.返回值batch相当于基准单词,labels相当于基准单词周围的单词.
词向量的构造
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
构造了一个结构为(50000, 128)的词向量.
embed = tf.nn.embedding_lookup(embeddings, train_inputs)
每次从词向量中取出train_inputs去训练.
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings / norm
把词向量化为单位向量.
valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings, valid_dataset) # 取出16个 (16*128)
similarity = tf.matmul(valid_embeddings, normalized_embeddings, transpose_b=True) # 16*50000 选出的16个单词和50000个词的相似度
先从所有单位词向量中选出16个词向量,结构为(16*128). valid_embeddings乘以normalized_embeddings的转置(128,50000)后,得到一个结构为(16,50000)的矩阵.表示选出的16个单词和50000个单词的相似度.
top n相似度
sim = similarity.eval() # 16*50000
for i in xrange(valid_size): # 0...15
valid_word = reverse_dictionary[valid_examples[i]] # 选16个单词
top_k = 8 # number of nearest neighbors
nearest = (-sim[i, :]).argsort()[1:top_k + 1] # 相似度最大的是它自己,所以[1,top_k+1],nearest保存最大相似度的索引
log_str = "Nearest to %s:" % valid_word
for k in xrange(top_k):
close_word = reverse_dictionary[nearest[k]] # 由索引找到单词
log_str = "%s %s," % (log_str, close_word)
print(log_str)