如何以vec格式保存fasttext模型?
Posted
技术标签:
【中文标题】如何以vec格式保存fasttext模型?【英文标题】:How to save fasttext model in vec format? 【发布时间】:2020-02-08 18:11:40 【问题描述】:我在 python 中使用fasttext.train_unsupervised()
函数训练了我的无监督模型。我想将它保存为 vec 文件,因为我将在 fasttext.train_supervised()
函数中将此文件用于 pretrainedVectors
参数。 pretrainedVectors
只接受 vec 文件,但我无法创建这个 vec 文件。有人可以帮我吗?
附言。我能够以 bin 格式保存它。如果您建议我一种将 bin 文件转换为 vec 文件的方法,那也会很有帮助。
【问题讨论】:
【参考方案1】:为了获取仅包含所有单词向量的 VEC 文件,我从 bin_to_vec official example 获得灵感。
from fasttext import load_model
# original BIN model loading
f = load_model(YOUR-BIN-MODEL-PATH)
lines=[]
# get all words from model
words = f.get_words()
with open(YOUR-VEC-FILE-PATH,'w') as file_out:
# the first line must contain number of total words and vector dimension
file_out.write(str(len(words)) + " " + str(f.get_dimension()) + "\n")
# line by line, you append vectors to VEC file
for w in words:
v = f.get_word_vector(w)
vstr = ""
for vi in v:
vstr += " " + str(vi)
try:
file_out.write(w + vstr+'\n')
except:
pass
获得的VEC文件可能很大。 要减小文件大小,您可以调整矢量组件的格式。
如果您只想保留 4 位小数,可以将 vstr += " " + str(vi)
替换为
vstr += " " + ":.4f".format(vi)
【讨论】:
ValueError: 预训练向量的维度 (7598805550878845300) 与维度 (300) 不匹配!不幸的是,当我尝试使用以这种方式创建的 vec 文件时,它给了我这个错误。似乎它没有保留应该为 300 的词向量的维度。 我收到了类似的错误:“ValueError:预训练向量的维度 (0) 与维度 (100) 不匹配!”按照@darwin007 的建议,我通过将以下代码的输出添加到文件的第一行来解决了这个问题: str(len(words)) + " " + str(f.get_dimension()) 我会非常谨慎地使用读/写类型“a”。实际上,在最后一次更改答案之后使用“a”没有任何价值。如果您多次运行该行代码,您最终将在每次运行该行代码时附加单词长度、维度以及所有单词和向量。每次运行代码时,使用“w”而不是“a”将重写文件,这可能是您想要的。全线解决方案:使用 open(YOUR-VEC-FILE-PATH,'w') as file_out:【参考方案2】:你应该在你的 vec 文件的第一行添加单词 num 和 dimension,而不是使用 -preTrainedVectors para
【讨论】:
以上是关于如何以vec格式保存fasttext模型?的主要内容,如果未能解决你的问题,请参考以下文章