词向量训练实战——Word2vector、Glove、Doc2vector

目录

  • 一、基于gensim(版本:3.8.3)的Word2vector
    • 1、模型训练
    • 2、模型使用:获取词、词向量、词之间词向量比较等
    • 3、word2vector的保存和加载
  • 2、Glove
  • 3、补充句向量:Doc2Vec

一、基于gensim(版本:3.8.3)的Word2vector

【进行token2id,方便后续利用word2vector进行embedding】

1、模型训练

import pprint
import gensim
from gensim.models.word2vec import Word2Vec
from gensim.corpora.dictionary import Dictionary
sentense='按我的理解,优化过程的第一步其实就是求梯度。这个过程就是根据输入的损失函数,提取其中的变量,进行梯度下降,使整个损失函数达到最小值。'
sentense_words=[[w for w in jieba.cut(sentense) if w not in [',','。','的']]] # 若不分词,直接将句子作为sentense_words的元素,输入到Word2Vec得到的是字向量。
w2v_model=Word2Vec(sentense_words,
                   size=25,  # 词向量维度
                   min_count=1,  # 词频阈值
                   window=5,
                   workers=6, # Use these many worker threads to train the model
                   sg=1, # Default 0, 1 for skip-gram; otherwise CBOW.
                   hs=1, # Default 0(使用w2v_model.syn1时必须为1), If 1, hierarchical softmax(Huffman Softmax) will be used for model training. If 0, and negative is non-zero, negative sampling will be used.
                   iter=10) # 参数还有很多,包括negative=5,表明使用负采样,并指定负采样使用的“噪音词数”

# 另外,可以基于gensim的词向量模型生成LDA的输入corpus:[[(词索引, 词频),...],]
from gensim import corpora
dictionary = corpora.Dictionary(sentences_cutted_list) # 将documents中的所有词进行索引编码,循环dictionary.items()可以打印出每个词的索引及词,参数必须是list[list]
corpus = [dictionary.doc2bow(text) for text in sentences_cutted_list] # [[(词索引, 词频),...],]

2、模型使用:获取词、词向量、词之间词向量比较等

# 获取词典
wv_vocab = w2v_model.wv.vocab
print('该w2v模型的词典:', wv_vocab)

# 获取所有词
wv_word1 = w2v_model.wv.vocab.keys() # 结果:dict_keys(['按', '我', '理解', '优化', '过程', '第一步', '其实', '就是', '求', '梯度', '这个', '根据', '输入', '损失', '函数'])
wv_word12 = w2v_model.wv.index2word # 结果:['过程', '就是', '按', '我', '理解', '优化', '第一步', '其实', '求', '梯度', '这个', '根据', '输入', '损失', '函数']

# 生成{word: index}
dictionary=Dictionary()
dictionary.doc2bow(w2v_model.wv.vocab.keys(), allow_update=True) # 对所给的词表生成word-index对照
print('该w2v模型的word_index:',{k:v for k,v in dictionary.items()})

# 获取某个词的词向量(改词必须包含在模型词典中)
print('词典中‘优化’的词向量:',w2v_model['优化'])

# 获取词向量的大矩阵,第i行表示vocab中下标为i的词
vec = w2v_model.wv.syn0 # vec为array类型,gensim4.0.0之后使用 w2v_model.wv.vectors

上述结果:
词向量训练实战——Word2vector、Glove、Doc2vector_第1张图片

3、word2vector的保存和加载

模型保存:

w2v_model.save(file_W2V_model) # 保存完整模型,可以加载后进行再训练
w2v_model.wv.save_word2vec_format(file_W2V_model_vector, binary=False) # 保存词及其对应的词向量

(注:保存词及其向量时,文件第一行为:词数 向量维度,一般文件格式为TXT或bin)
加载保存的w2v模型:
两种保存方式分别对应的加载方式:
在这里插入图片描述
在这里插入图片描述
(注:第二种方法model = gensim.models.KeyedVectors.load_word2vec_format(file_name),可以使用model.vocab,获取词与词不知道的啥,如下:
词向量训练实战——Word2vector、Glove、Doc2vector_第2张图片

2、Glove

1、下载安装:https://github.com/stanfordnlp/GloVe
下载GitHub上整个文件:
词向量训练实战——Word2vector、Glove、Doc2vector_第3张图片
2、linux训练词向量(参考:https://blog.csdn.net/Totoro1745/article/details/82286483
【是基于C语言环境的,所以必须保证有gcc】
1)在当前路径下运行:make
2)修改demo.sh的内容
demo.sh文件:
词向量训练实战——Word2vector、Glove、Doc2vector_第4张图片
3)开始训练
运行demo.sh文件:sh demo.sh
4)训练完成后,使用python中gensim模块调用,然后跟gensim的word2vec模型一样使用:
在这里插入图片描述
(注:将glove词向量文件转化为word2vec文件:)
在这里插入图片描述

3、补充句向量:Doc2Vec

doc2vec英文原文
训练doc2vec的两种方式:
PV-DM:每一句话用唯一的向量来表示,用矩阵D的某一列来代表。每一个词也用唯一的向量来表示,用矩阵W的某一列来表示。每次从一句话中滑动采样固定长度(window)的词,取其中一个词作预测词,其他的作为输入词。输入词对应的词向量Word Vector本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词
词向量训练实战——Word2vector、Glove、Doc2vector_第5张图片
PV-DBOW句子向量Paragraph vector作为输入(刚开始的时候进行初始化),在每次迭代的时候,从文本中采样得到一个窗口,再从这个窗口中随机采样一个单词作为预测任务,让模型去预测。
词向量训练实战——Word2vector、Glove、Doc2vector_第6张图片

from gensim.models.doc2vec import Doc2Vec,TaggedDocument
tagged_data = [TaggedDocument(words=_d, tags=[str(i)]) for i, _d in enumerate(content_cutted)]
d2v_model=Doc2Vec(documents= tagged_data,
                  dm=1, # If `dm=1`(Default), 'distributed memory' (PV-DM) is used; Otherwise, `distributed bag of words` (PV-DBOW) is employed.
                  vector_size=125, # Default 100.
                  window=5,
                  min_count=3
                  )
# 获取tag是8的句向量
print(d2v_model.docvecs['8']) # array类型,效果同d2v_model[8]==d2v_model.docvecs[8]
# 获取tag=1的句子与其他句子的相似度
print(d2v_model.docvecs.most_similar('1')) # 计算tag=‘1’的句子与其他所有句子的cosin相似度[('5', 0.9994447231292725), ('8', 0.9993512630462646)]
# 获取tag=0和tag=1两个句子的相似度
print(d2v_model.docvecs.similarity('0','1')) # 0.9992348

保存和加载(方式同word2vec):下面两种方式效果一样

# 方式一
self.d2v_model.save('data/word2vector_model.model')
self.d2v_model.save_word2vec_format('data/word2vector.txt')
# 方式二
Doc2Vec.save(self.d2v_model, model_file)
Doc2Vec.save_word2vec_format(self.d2v_model, vec_file)

你可能感兴趣的:(Python类,word2vec,机器学习,自然语言处理,python)