词向量是自然语言分词在词空间中的表示,词向量之间的距离代表了分词的相似性,那么词向量在此空间中的分布到底是什么样的?https://blog.csdn.net/u010670689/article/details/75070918?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158719514419724839222071%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158719514419724839222071&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2
1、训练词向量
词向量的训练是一个无监督的过程,词的表述有两种方法:one-hot和词向量。
one-hot用来表示词非常简单,但是会有很多问题:1)任意两个词之间是孤立的,无法表示出语义层面上词与词之间的相关信息;2)词汇表很大,这样用百万维的向量表示简直是内存灾难。
Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。
词向量的训练有两种方法:
cbow
skip-gram

1.1 cbow模型
CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。

加载训练好的词向量:
w2v_model = gensim.models.KeyedVectors.load_word2vec_format('/wiki-news-300d-1M.vec', binary=True, encoding="ISO-8859-1")
embedding_matrix = np.zeros((len(vocab) + 1, 300))
for word, i in vocab.items():
    try:        
        embedding_vector = w2v_model[str(word)]        
        embedding_matrix[i] = embedding_vector    
    except KeyError:        
        continue
w2v_model = gensim.models.word2vec.Word2Vec.load('/w2v.w2v')
embedding_matrix = np.zeros((len(vocab) + 1, 300))
for word, i in vocab.items():
    try:        
        embedding_vector = w2v_model[str(word)]        
        embedding_matrix[i] = embedding_vector    
    except KeyError:        
        continue
embedding_matrix = {}
for i, line in enumerate(open('/wiki-news-300d-1M.vec','rb')):
    values = line.split()
    embedding_matrix[i] = numpy.asarray(values[1:], dtype='float64')