你如果尚未解除过word2Vec,这一篇详解值得一看:《机器学习:gensim之Word2Vec 详解》,以下则主要是我自己项目中使用gensim的Word2Vec中所遇到的问题以及详解
- 报错信息:
ValueError: invalid literal for int() with base 10: 'xx' KeyedVectors.load_word2vec_format()
- 报错原因:格式有问题
1、数据类型转换出现问题,不能转换成int(根源)
2、你传入的数据格式有问题(本人问题所在),这个具体看你使用KeyedVectors.load_word2vec_format()来加载什么,如果是加载训练好的词向量,就说明该词向量就有问题,如果是加载词库出现问题,则需要将词库处理成指定格式; - 解决方法
1、针对词库的问题,需要转换(我使用的是glove.42B.300d.txt)
from gensim.scripts.glove2word2vec import glove2word2vec
def transfer(gloveFile, word2vecFile):
glove2word2vec(gloveFile, word2vecFile)
if __name__ == '__main__':
# 注意修改成你自己的词库
transfer('data/glove.42B.300d.txt', 'data/glove_300d_w2v_format.txt')
2、针对训练出来的词向量的问题
首先就是要明确的是训练的出来的词向量文件头部会有两个数字,其表示的是整个词表的大小和维度,所以需要保证你训练出来的词向量最开头一行保存整个词表的大小和维度,我就是因为输出的词向量文本中没有这一行,所以报错!
原来的代码(主要是修改Word2Vec这一部分)
def word2vec_train(data_file,word_vec,save_model):
num_features = 100 # Word vector dimensionality
min_word_count = 1 # Minimum word count
num_workers = 16 # Number of threads to run in parallel
context = 4 # Context window size
downsampling = 1e-3 # Downsample setting for frequent words
f = open(word_vec, mode='w')
# 问题主要就是下面这一部分
sentences = word2vec.Text8Corpus(data_file)
model = word2vec.Word2Vec(sentences, workers=num_workers, \
size=num_features, min_count=min_word_count, \
window=context, sg=1, sample=downsampling)
# 保存模型
model.save(save_model)
# 打印日志
print(model)
for key in model.wv.vocab.keys():
x = model[key].tolist()
list_x = []
for var in x:
list_x.append(str(var))
list_x = " ".join(list_x)
f.write(key + ' ' + list_x + '\n')
return 0
更改后的代码(参数需要根据自己的需要)
def word2vec_train(data_file,word_vec,save_model):
"""
data_file:数据文件
word_vec:训练好的词向量文件
save_model:训练好的词模型(建议保存,下一次直接加载)
"""
num_features = 100 # Word vector dimensionality
min_word_count = 1 # Minimum word count
num_workers = 16 # Number of threads to run in parallel
context = 4 # Context window size
downsampling = 1e-3 # Downsample setting for frequent words
f = open(word_vec, mode='w')
# 问题主要就是下面这一部分
sentences = LineSentence(dataset_path)
# 训练word2vec模型(size为向量维度,window为词向量上下文最大距离,min_count需要计算词向量的最小词频)
model = word2vec.Word2Vec(sentences, num_features, min_word_count, num_workers,context, downsampling,)
# (iter随机梯度下降法中迭代的最大次数,sg为1是Skip-Gram模型)
# 保存word2vec模型(创建临时文件以便以后增量训练)
model.save("word2vec.model")
model.wv.save_word2vec_format(out_vector, binary=False)
# 打印日志
print(model)
for key in model.wv.vocab.keys():
x = model[key].tolist()
list_x = []
for var in x:
list_x.append(str(var))
list_x = " ".join(list_x)
f.write(key + ' ' + list_x + '\n')
return 0
如果你有任何疑问欢迎一起交流:d_zhao_work@163.com