如何将FastText模型保存为vec格式?

11
我使用Python中的fasttext.train_unsupervised()函数来训练我的无监督模型。由于我将在fasttext.train_supervised()函数的pretrainedVectors参数中使用此文件,因此我希望将其保存为vec文件。但是,我在创建这个vec文件时遇到了困难。有人可以帮帮我吗? 提示:我能够将其保存为bin格式。如果您能建议一种将bin文件转换为vec文件的方法,那也会很有帮助。
2个回答

15
为了获得只包含所有单词向量的VEC文件,我从bin_to_vec官方示例中获得了灵感。
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)

1
数值错误:预训练向量的维度(7598805550878845300)与维度(300)不匹配!不幸的是,当我尝试使用以这种方式创建的vec文件时,它会给我这个错误。看起来它没有保留单词向量应该为300的维度。 - esin ildiz
我收到了类似的错误信息:"ValueError: Dimension of pretrained vectors (0) does not match dimension (100)!"。根据@darwin007的建议,我通过在文件的第一行添加代码输出 str(len(words)) + " " + str(f.get_dimension()) 来解决了这个问题。 - dshefman
1
我会非常谨慎地使用读/写类型“a”。实际上,在最后一次更改答案后,使用“a”没有任何价值。如果您多次运行代码行,则每次运行该代码行都会追加单词长度、维度和所有单词和向量。使用“w”而不是“a”将在每次运行代码时重写文件,这可能是您想要的。完整的代码行解决方案:with open(YOUR-VEC-FILE-PATH,'w') as file_out: - dshefman

1

你需要在vec文件的第一行添加单词数和维度,然后使用-preTrainedVectors参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,