如何以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模型?的主要内容,如果未能解决你的问题,请参考以下文章

Fasttext .vec 和 .bin 文件的区别

FastText总结,fastText 源码分析

通过排除某些词汇来更快地加载 fasttext 模型

NLP-06fastText文本分类算法

Fasttext原理

fasttext模型 训练THUCNews