用gensim和FastText嵌入单词,训练预训练向量

时间:2020-06-10 16:24:41

标签: python gensim word-embedding fasttext

我正尝试使用以下代码加载Facebook fasttext crawl-300d-2M.vec的预训练vec文件:

from gensim.models.fasttext import load_facebook_model, load_facebook_vectors

model_facebook = load_facebook_vectors('fasttext/crawl-300d-2M.vec')

但是它失败并出现下一个错误:

NotImplementedError: Supervised fastText models are not supported

无法加载此向量?

如果可能的话,之后我可以用自己的句子训练它吗?

谢谢。

整个错误跟踪:

---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-181-f8262e0857b8> in <module>
----> 1 model_facebook = load_facebook_vectors('fasttext/crawl-300d-2M.vec')

/opt/conda/lib/python3.7/site-packages/gensim/models/fasttext.py in load_facebook_vectors(path, encoding)
   1196 
   1197     """
-> 1198     model_wrapper = _load_fasttext_format(path, encoding=encoding, full_model=False)
   1199     return model_wrapper.wv
   1200 

/opt/conda/lib/python3.7/site-packages/gensim/models/fasttext.py in _load_fasttext_format(model_file, encoding, full_model)
   1220     """
   1221     with gensim.utils.open(model_file, 'rb') as fin:
-> 1222         m = gensim.models._fasttext_bin.load(fin, encoding=encoding, full_model=full_model)
   1223 
   1224     model = FastText(

/opt/conda/lib/python3.7/site-packages/gensim/models/_fasttext_bin.py in load(fin, encoding, full_model)
    339         model.update(dim=magic, ws=version)
    340 
--> 341     raw_vocab, vocab_size, nwords, ntokens = _load_vocab(fin, new_format, encoding=encoding)
    342     model.update(raw_vocab=raw_vocab, vocab_size=vocab_size, nwords=nwords, ntokens=ntokens)
    343 

/opt/conda/lib/python3.7/site-packages/gensim/models/_fasttext_bin.py in _load_vocab(fin, new_format, encoding)
    192     # Vocab stored by [Dictionary::save](https://github.com/facebookresearch/fastText/blob/master/src/dictionary.cc)
    193     if nlabels > 0:
--> 194         raise NotImplementedError("Supervised fastText models are not supported")
    195     logger.info("loading %s words for fastText model from %s", vocab_size, fin.name)
    196 

NotImplementedError: Supervised fastText models are not supported

1 个答案:

答案 0 :(得分:2)

我相信,但不确定,在这种特殊情况下,您会收到此错误,因为您正试图加载一组普通向量(FastText项目倾向于将其命名为以{{1}结尾的文件}),该方法旨在用于包含子词/模型信息的特定于FastText的格式。

结果是,它误解了文件的前导字节,因为使用FastText的“监督”模式将模型声明为一个模型。 (Gensim在那种不太常见的模式下确实不支持这样的完整模型。但是,它可能会从这种模型中加载最终向量,无论如何,您的文件都不是真正从该模式中来。)

将与.vec一起使用的已发布文件通常以load_facebook_vectors()结尾。有关更多详细信息,请参阅此方法的文档:

https://radimrehurek.com/gensim/models/fasttext.html#gensim.models.fasttext.load_facebook_vectors

因此,您可以:

  • 为此方法提供备用.bin命名的,Facebook-FastText格式的向量集(带有子词信息)。 (通过快速浏览他们的下载选项,我相信他们的文件(类似于您的第一次尝试)将被命名为.bin,大小约为7.24GB。)

  • 通过以下方式加载具有完整单词向量的文件:

crawl-300d-2M-subword.bin

在后一种情况下,将无法使用特定于FastText的功能(例如,使用子词向量来合成词汇外词的猜测向量),但该信息不在'crawl-300d-2M .vec”文件。 (如果您使用上面较大的 from gensim.models import KeyedVectors model = KeyedVectors.load_word2vec_format('fasttext/crawl-300d-2M.vec', binary=False) 文件和.bin方法,这些功能将可用。)