先是各个参数。batch_size:训练数据一个输入多少个批次;skip_window:窗口大小,有点类似于滑动窗口;num_skips:一个词语产生多少个label,若为1,则取该词左边或右边当作1个label,若为2,则可取该词左右两边形成两个label。如下图,skip_window=1,num_skips=2的图如下所示,句首ID前补0,每一个单词具备左右两个词作为其label。
一、先是变量的定义
def generate_batch(batch_size, num_skips, skip_window):
global data_index
assert batch_size % num_skips == 0
assert num_skips <= 2 * skip_window
batch = np.ndarray(shape=(batch_size/num_skips), dtype=np.int32)
labels = np.ndarray(shape=(batch_size), dtype=np.int32)
span = 2 * skip_window + 1 # [ skip_window target skip_window ]
buffer = collections.deque(maxlen=span)
二、向队列中写入初始化数据
for _ in range(span):
buffer.append(data[data_index])
data_index = (data_index + 1) % len(data)
三、这里有两个循环,外层循环定义目标标签target在队列中心,目标标签不能取的值放进targets_to_avoid列表中。内层循环开始为skip_window(队列中心)找目标标签(一共有num_skips个),首先通过while循环窗口中找寻目标标签,排除skip_window和已经取过的值,找到后将该值添入targets_to_avoid列表中,最后将队列的值填入batch和labels中,并更新队列中的值。
tf.reduce_mean(tf.nn.sampled_softmax_loss())遇到Dimensions must be equal, but are 1 and 128 for 'sampled_softmax_loss/MatMul' (op: 'MatMul') with input shapes: [128,1], [64,128]问题时,参照https://stackoverflow.com/questions/46516168/word2vec-tutorial-tensorflow-typeerror-input-y-of-mul-op-has-type-float32解决方案,调换第三个、四个参数位置。
参考:
1.https://www.jianshu.com/p/f682066f0586
2.https://github.com/eecrazy/word2vec_chinese_annotation/blob/master/cbow.py