一、Word2Vec
Word2Vec是一个可以将语言中字词转化为向量形式表达的模型。也称Word Embeddings,中文称为“词向量”。
Word2Vec也是一种计算非常高效的,可以从原始语料中学习字词空间向量的预测模型。主要有CBOW和Skip—Gram两种模式。
CBOW是从原始语句(eg:中国的首都是____)来推测目标字词(eg:北京),主要对小型数据比较合适,
Skip—Gram与CBOW想法,它是从目标字词推测出原始语句,它在大型语料中表现的更好。
二、一些相关概念
One—Hot 向量:只有一个值为1,其余都为0的向量。
假设语料库中有3000个单词,为每个词编个序号,一个词对应一个One—Hot向量(比如,中国是排号为2562,则“中国”这个词的One—Hot向量第2562个为1,其余为0),则语料库的One—Hot向量为3000维。这样构成的一个句子就变成了一个稀疏矩阵。
使用One—Hot有一个问题,就是对特征(即语料库中的词)编码是随机的,任何两个词之间是没有关联信息的。
向量表达(Vector Repressentations)可以解决这个问题。向量空间模型可以将字词转为连续值(相当于One—Hot编码的离散值)的向量表达,并且将其中意思相近的词映射到向量空间中相近的位置。
向量空间模型主要依赖的假设是相同语境中出现的词其语义也相近。
向量空间模型分为两类,一个是计数模型(统计在语料库中,相邻出现的词的频率,在把这些计数统计结果转为小而稠密的矩阵),另一个是预测模型(根据一个词周围相邻的词推测出这个词,以及它的空间向量)
三、实现(CPU)
我们这次实现的是Skip—Gram模式的Word2Vec。(代码来自Tensorflow的开源实现)
训练样本的构造,以“the quick brown fox jumped over the lazy dog“这句话为例。先构造一个语境与目标词汇的映射关系,其中语境包括一个单词左边和右边的词汇,设滑窗尺寸为1,则制造的映射关系包括[the , brown]指向quick、[brown, jumped] 指向fox等。数据集变成了(quick, the)、(quick, brown)、 (brown,quick)、(brown, fox)等。
目标:在训练时,希望模型能从目标词汇quick预测出语境the,同时也需要制造随机的词汇作为负样本(类似于噪声),我们希望预测的概率分布在正样本the熵尽可能大,而在随机产生的负样本上尽可能小。
import collections
import math
import os
import random
import zipfile
import numpy as np
import urllib
import tensorflow as tf
#定义下载文本数据的函数,这里使用urllib.request.urlretrieve下载数据的压缩文件并核对文件尺寸。
url = 'http://mattmahoney.net/dc/'
def maybe_download(filename, expected_bytes):
if not os.path.exists(filename):
filename, _ = urllib.request.urlretrieve(url + filename, filename)
statinfo = os.stat(filename)
if statinfo.st_size == expected_bytes:
print('Found and verified', filename)
else:
print(statinfo.st_size)
raise Exception