如何将 gensim Word2Vec 模型转换为 FastText 模型?

How to convert gensim Word2Vec model to FastText model?

我有一个 Word2Vec 模型,它是在一个巨大的语料库上训练的。在将此模型用于神经网络应用程序时,我遇到了很多 "Out of Vocabulary" 个单词。现在我需要为这些 "Out of Vocabulary" 个词找到词嵌入。所以我做了一些谷歌搜索,发现 Facebook 最近为此发布了一个 FastText 库。现在我的问题是如何将现有的 word2vec 模型或 Keyedvectors 转换为 FastText 模型?

FastText 能够通过在初始训练中包含来自原始语料库的子词片段来为子词片段创建向量。然后,当遇到词汇外 ('OOV') 单词时,它会使用它识别的片段为这些单词构建一个向量。对于具有重复 word-root/prefix/suffix 模式的语言,这会产生比随机猜测 OOV 词更好的向量。

但是,FastText 进程不会 从最终的全词向量中提取这些子词向量。因此,没有简单的方法可以将全词向量转换为还包含子词向量的 FastText 模型。

可能有可行的方法来近似相同的效果,例如通过获取具有相同子词片段的所有已知词,并提取一些常见的 average/vector-component 分配给子词。或者将 OOV 词建模为与 OOV 词相距较短编辑距离的词汇表中词的某个平均值。但这些技术并不完全是 FastText,只是模糊地类似于它,它们的工作情况如何,或者可以通过调整工作,将是一个实验性的问题。所以,这不是抢现成库的问题。

this blog post by Sebastien Ruder 中提到了一些研究论文以及其他 OOV 引导想法。

如果您需要 FastText OOV 功能,最好的方法是在用于传统全词向量的同一语料库上从头开始训练 FastText 向量。

这是代码片段:

txt_model = KeyedVectors.load(model_name)
model.wv.save_word2vec_format('{}.txt'.format(model_name), binary=False)

其中模型名称是 Word2Vec 训练模型的名称。

然而,gensim(自 3.2.0 起)具有以下内容:

from gensim.models import FastText
model = FastText(sentences, workers=num_workers)
model.wv.save_word2vec_format('{}.txt'.format(model_name), binary=False)

但是您仍然需要将其保存为文本文件,因为 FastText 无法解释二进制词嵌入。