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

目录

一、前言

二、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模型词表中共有多少词,然后输入小于等于词表长度的数字即可展示,不仅可以避免大于词表长度时的错误,也可避免词表中的词过多而展示不清楚的情况。

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

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

你可能感兴趣的:(word2vec,python,word2vec,机器学习,深度学习)