概述
词向量是概率语言模型的重要组成部分,通过用一个定长向量来表示语言中的一个词,文章中通过gensim训练词向量word2vec。
gensim的工作包括:训练大规模语义模型;将文本表示为语义向量;查找语义相关文档。
首先,训练前,通过jieba分词,创建成词汇词典,通过word2vec的方法CBOW或Skip-gram两种训练方法,通过深度神经网络的反向传播算法,可以训练出模型的参数,同时得到了所有的词对应的词向量,这里需要注意层次softmax的用法。
代码展示:
import os
import jieba
import logging as log
from gensim import corpora
from gensim import models
#设置日志的输出级别,默认INFO
log.basicConfig(level=log.DEBUG)
# 得到当前所加载的文件的物理的绝对路径
corpus_file = os.path.join(os.path.dirname(__file__),'lyrics','文本绝对路径.txt')
def read_lyrics(corpu_file):
'''读取语料并进行分词'''
lyrics_words = []
for line in open(corpus_file, encoding='utf-8'):
line = line.strip()
if line == '':
continue
lyrics_words.append(jieba.lcut(line))
# 返回分词词汇集
return lyrics_words
if __name__ == '__main__':
lyrics = read_lyrics(corpus_file)
log.debug(lyrics)
# 制作词汇字典
dictionary = corpora.Dictionary(lyrics)
log.debug(dictionary.token2id) # 调用词典对象返回词典,词和词对应的索引值
# 词汇转换为索引并计数(bag of word)
log.debug(dictionary.doc2bow('你 就 不要 送 我'.split()))
# 词汇转换为数学表示,(矢量)
bowcorpus = [dictionary.doc2bow(i) for i in lyrics]
log.debug(bowcorpus)
其次,将模型训练好的参数,通过余弦相似度计算每个词汇或每句之间的词向量的相似度。
import os
from gensim.models import Word2Vec,word2vec
from gensim.models.keyedvectors import KeyedVectors
# 语料文件
corpos_file = os.path.join(os.path.dirname(__file__),r'文件绝对路径.txt')
# 模型二进制存盘文件
save_bin_file = os.path.join(os.path.dirname(__file__),'embeddings','word2vec.model')
# 模型文本格式存盘文件
save_txt_file = os.path.join(os.path.dirname(__file__),'embeddings','word2vec.txt')
def train_word2vec():
# 保存文本的所有信息
sentences = word2vec.Text8Corpus(corpos_file) # 8 meaning 'by'
model = Word2Vec(sentences=sentences,vector_size=200)
# 模型训练保存
model.wv.save_word2vec_format(save_bin_file,binary=True)
model.wv.save_word2vec_format(save_txt_file)
def load_vectors():
# 加载存盘的词向量模型
# word_vectors = KeyedVectors.load_word2vec_format(save_bin_file,binary=True)
word_vectors = KeyedVectors.load_word2vec_format(save_txt_file)
return word_vectors
# 训练词向量
if __name__ == '__main__':
train_word2vec()
wv = load_vectors()
# 词汇数量
print('词典大小',len(wv.key_to_index))
# 词汇相似度
print(wv.similarity('词汇','词汇'))
# 获取最近似的词汇
print(wv.most_similar('词汇',topn=10))
最后,将计算好的词向量保存到文件中,可以得到各个词汇之间的关联性,相似度越大,关联性就越好。