赞
踩
目录
word2vec是静态词向量构建方法的一种,本文将介绍word2vec词向量是如何训练的,以及我们训练好的word2vec词向量如何使用,最后介绍了可视化word2vec词向量,即通过可视化图来查看训练的word2vec质量,本文为保姆级教程,会将数据输入格式等细节一并讲清楚。在开始本文前,首先说下本文使用的gensim版本为3.8.3(使用gensim的word2vec方法训练词向量),为确保进行本文所有流程,请与本文gensim版本一致,避免发生版本问题!本文也将会介绍藏文word2vec词向量的处理方法!
不同算法模型具有不同的数据输入格式要求,本文使用gensim库中更为便捷的函数LineSentence构建word2vec模型的输入数据,需要注意:
(1)需要将原始语料分词处理。对于中英文,可使用jieba分词;对于藏文,可采用基于音节的分词方法SentencePiece或者以词级别的分词方法;
(2)需要注意分词后语料的格式。一行存储一个文本。下面举例说明。
- 这是 第一个 文本(可能有许多句话组成)。
- 这是 第二个 文本(可能有许多句话组成)。
上面举例为使用jieba分词后的中文句子,其他语种同理,分词后按照如上格式放置即可。因此在此需要将分词后的文本进行整合,按照如上格式整合为一个分词语料文本。
先放代码:
- 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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。