Word2Vec词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

您所在的位置:网站首页 日式榻榻米卧室装修风格效果图大全 Word2Vec词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

Word2Vec词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

2023-11-26 10:34| 来源: 网络整理| 查看: 265

目录

一、前言

二、Word2Vec词向量训练

2.1 数据输入格式

2.2词向量训练

三、词向量使用

四、词向量可视化

一、前言

        word2vec是静态词向量构建方法的一种,本文将介绍word2vec词向量是如何训练的,以及我们训练好的word2vec词向量如何使用,最后介绍了可视化word2vec词向量,即通过可视化图来查看训练的word2vec质量,本文为保姆级教程,会将数据输入格式等细节一并讲清楚。在开始本文前,首先说下本文使用的gensim版本为3.8.3(使用gensim的word2vec方法训练词向量),为确保进行本文所有流程,请与本文gensim版本一致,避免发生版本问题!本文也将会介绍藏文word2vec词向量的处理方法!

二、Word2Vec词向量训练 2.1 数据输入格式

        不同算法模型具有不同的数据输入格式要求,本文使用gensim库中更为便捷的函数LineSentence构建word2vec模型的输入数据,需要注意:

(1)需要将原始语料分词处理。对于中英文,可使用jieba分词;对于藏文,可采用基于音节的分词方法SentencePiece或者以词级别的分词方法;

(2)需要注意分词后语料的格式。一行存储一个文本。下面举例说明。

这是 第一个 文本(可能有许多句话组成)。 这是 第二个 文本(可能有许多句话组成)。

         上面举例为使用jieba分词后的中文句子,其他语种同理,分词后按照如上格式放置即可。因此在此需要将分词后的文本进行整合,按照如上格式整合为一个分词语料文本。

2.2词向量训练

先放代码:

from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence model = Word2Vec( LineSentence(open('data.txt', 'r', encoding='utf8')), sg = 0, size = 100, window = 3, min_count = 1, workers=8 ) # 词向量保存 model.wv.save_word2vec_format('data.vector', binary=False) # 模型保存 model.save('test.model')

        代码中前两行分别导入Word2Vec模型与处理数据的LineSentence方法,使用LineSentence方法可避免前期构建语料的复杂性。Word2Vec模型中第一个参数:

LineSentence(open('data.txt', 'r', encoding='utf8'))

        这个参数即为加载数据,只需将通过2.1部分处理的名为data.txt文件更换为你自己的分词语料文件即可。对于word2vec模型中其他参数在本文不进行过多介绍。

        按照如上所示代码即可训练word2vec模型,训练后按照如上代码保存词向量与模型即可,实际操作时更改名字即可。

三、词向量使用

        按照第二部分操作后已经保存了训练好的词向量及模型,下面介绍词向量的使用方法,先放代码:

import gensim # 1 通过模型加载词向量(recommend) model = gensim.models.Word2Vec.load('test.model') dic = model.wv.index2word print(dic) print(len(dic)) print(model.wv['提供']) print(model.most_similar('提供', topn=1)) # 2 通过词向量加载 vector = gensim.models.KeyedVectors.load_word2vec_format('data.vector') print(vector['提供'])

        在此介绍两种使用方法,1 通过模型加载词向量,在工程化的应用中,建议使用该种方法,加载速度快。2 使用保存的词向量加载,工程中不推荐,加载速度慢。

        model = gensim.models.Word2Vec.load('test.model') 为通过模型加载词向量,在实际使用中更改模型名称即可,dic = model.wv.index2word 为模型词向量对应的词表,在此需要注意,当我们想要获得的词不在word2vec模型的词表中,会发生错误!因此在工程中获取词向量时首先需要判断,如果词不在word2vec模型的词表中需要另做处理。model.wv['提供'] 为获取词“提供”对应的词向量,model.most_similar('提供', topn=1) 为获取词“提供”最相似的一个词,当然在实际应用中,model.wv['提供'] 最为常用。

        vector = gensim.models.KeyedVectors.load_word2vec_format('data.vector')为使用保存的词向量加载词向量,在实际使用中更改文件名称即可。vector['提供'] 为该种方法获取词向量的方法。

        至此词向量的使用方法及注意事项均介绍完毕!

四、词向量可视化

先上代码

from builtins import bytes, range import pandas as pd pd.options.mode.chained_assignment = None from sklearn.manifold import TSNE import gensim import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties font = FontProperties(fname="himalaya.ttf",size=20) def tsne_plot(model, words_num): labels = [] tokens = [] for word in model.wv.vocab: tokens.append(model[word]) labels.append(word) tsne_model = TSNE(perplexity=30, n_components=2, init='pca', n_iter=1000, random_state=23) new_values = tsne_model.fit_transform(tokens) x = [] y = [] for value in new_values: x.append(value[0]) y.append(value[1]) plt.figure(figsize=(10, 10)) for i in range(words_num): plt.scatter(x[i], y[i]) if b'\xe0' in bytes(labels[i],encoding="utf-8"): this_font = font else: this_font = 'SimHei' plt.annotate(labels[i], Fontproperties=this_font, xy=(x[i], y[i]), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom') plt.show() if __name__ == '__main__': model = gensim.models.Word2Vec.load('test.model') print(f'There are {len(model.wv.index2word)} words in vocab') word_num = int(input('please input how many words you want to plot:')) tsne_plot(model, word_num)

        上面代码看着可能比较复杂,实际使用sklearn库中的TSNE方法进行处理,以PCA降维的方式将词向量降为二维从而可以使用二维图绘图。上文中对于藏文及中文在matplotlib图中的显示均考虑,在此展示藏文可视化后的效果。

        上述代码在主函数中为了避免出错,首先输出了word2vec模型词表中共有多少词,然后输入小于等于词表长度的数字即可展示,不仅可以避免大于词表长度时的错误,也可避免词表中的词过多而展示不清楚的情况。

如有不理解请在留言区交流! 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3