词向量的训练

 概述

词向量是概率语言模型的重要组成部分,通过用一个定长向量来表示语言中的一个词,文章中通过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))


最后,将计算好的词向量保存到文件中,可以得到各个词汇之间的关联性,相似度越大,关联性就越好。

猜你喜欢

转载自blog.csdn.net/m0_71145378/article/details/126909067