NLP系列(4)Word2Vec 字&词向量的训练和使用
word2vec 是静态词向量构建方法的一种,与 Embedding 词向量相似。本文将介绍 word2vec 词向量是如何训练的,训练好的 word2vec 词向量如何使用。由于不同的 gensim 的版本不同,在调用一些函数时会有差异。隐藏本文的 gensim 的版本为 ,以下代码都依此版本为准。...
前言
word2vec 是静态词向量构建方法的一种,与 Embedding 词向量相似。本文将介绍 word2vec 词向量是如何训练的,训练好的 word2vec 词向量如何使用。由于不同的 gensim 的版本不同,在调用一些函数时会有差异。隐藏本文的 gensim 的版本为 4.2.0 ,以下代码都依此版本为准。
数据
本文使用的数据是 THUCNews 中train.txt、dev.txt、test.txt 中所有的中文数据,一共用20000条。
图1 训练数据
字向量
处理数据
# 得到每一行的数据 []
datas = open('data/word.txt', 'r', encoding='gbk').read().split("\n")
# 得到一行的单个字 [[],...,[]]
word_datas = [[i for i in data if i != " "] for data in datas]
图2 将数据处理成字
训练
model = Word2Vec(
word_datas, # 需要训练的文本
vector_size=10, # 词向量的维度
window=2, # 句子中当前单词和预测单词之间的最大距离
min_count=1, # 忽略总频率低于此的所有单词 出现的频率小于 min_count 不用作词向量
workers=8, # 使用这些工作线程来训练模型(使用多核机器进行更快的训练)
sg=0, # 训练方法 1:skip-gram 0;CBOW。
epochs=10 # 语料库上的迭代次数
)
图3 模型结构内容1
训练好字向量后,我们使用最多的是 index_to_key 、 key_to_index 、字向量,根据前面两个,就可以对文字进行编码与解码。
图4 模型结构内容2
注:模型中的 index_to_key 、 key_to_index 、字向量 都可以单独保存
pkl.dump([model.wv.index_to_key, model.wv.key_to_index, model.wv.vectors], open("PartialWeight.pkl", "wb"))
保存模型
# 字向量保存
model.wv.save_word2vec_format('word_data.vector', # 保存路径
binary=False # 如果为 True,则数据将以二进制 word2vec 格式保存,否则将以纯文本格式保存
)
# 模型保存
model.save('word.model')
通过保存字向量(word_data.vector),第一行第一个数字表示一共有多少字,第二个数字表示一个字用10的数字表示。
比如:0 --> [0.99632174 2.0563052 -0.72112525 3.789005 -4.6471505 -2.838667 -4.621025 4.180826 3.625088 3.2602801]
图6 字向量部分内容
使用
加载模型
# 1 通过模型加载词向量(recommend)
model = gensim.models.Word2Vec.load('word.model')
# 2 通过字向量加载
vector = KeyedVectors.load_word2vec_format('word_data.vector')
查看
model.wv.index_to_key
图7 查看 index_to_key 的部分内容
model.wv['提'] --》通过模型进行查看
图8 通过模型进行查看字 “提” 的向量
vector['提'] --》通过字向量进行查看
图9 通过字向量进行查看字 “提” 的向量
可以发现两种方法得到的结果都是一样的
词向量
处理数据
datas = open("data/word.txt", "r", encoding="gbk").read().split("\n")
words_datas = [[i for i in (jieba.cut(data))] for data in datas]
图10 将数据处理成词
训练与保存模型
model = Word2Vec(words_datas, vector_size=10, window=2, min_count=1, workers=8, sg=0, epochs=10)
model.wv.save_word2vec_format('words_data.vector', binary=False)
model.save('words.model')
源码获取
硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!
更多推荐
所有评论(0)