如何为 DL4J 导出带有 Ngram 权重的 Gensim Word2Vec 模型?

问题描述 投票:0回答:1

我对 nlp 很陌生。我正在尝试使用 dl4j 中的 gensim 训练的模型。我正在保存模型

w2v_model.wv.save_word2vec_format("path/to/w2v_model.bin", binary=True)

然后我加载它

Word2Vec w2vModel = WordVectorSerializer.readWord2VecModel("path/to/w2v_model.bin"); 

除了处理词汇外(OOV)单词外,该模型运行良好。在 Gensim 中,它似乎根据单词的 n-gram 来计算 OOV 单词的向量,但在 DL4J 中,它为它们提供了一个空向量。

我的问题是:

  1. 有没有办法将 n-gram 权重与模型一起从 Gensim 导出,以便 DL4J 可以使用它们?
  2. 如果无法导出 n-gram 权重,是否有一种方法可以在 DL4J 端重建它们,以达到与 Gensim 中类似的 OOV 单词结果?

任何指导或建议将不胜感激

java nlp gensim word2vec deeplearning4j
1个回答
0
投票

核心原始 word2vec 算法 - 以及 Gensim 中的

Word2Vec
模型类 - 无法使用字符 n-gram 合成 OOV 单词的向量。

这只是 FastText 模型(以及 Gensim 中的

FastText
模型类)的一个功能 - 因此,如果您看到在 Gensim 中工作,您的
w2v_model
变量实际上可能保存一个 Gensim
FastText
对象。

此外,Gensim 的

.save_word2vec_format()
(无论是
binary=False
还是
binary=True
)保存的普通{word,向量}每行格式不会保存任何子词n-gram,即使在
FastText
对象上使用也是如此。 (它只是保存词汇表中单词的全词向量。)

Gensim 的

FastText
可以以 Facebook 原始 FastText 实现也使用的完整原始模型格式保存模型 - 请参阅
FastText.save_facebook_model()

但是要将其引入 Java 环境,您需要找到一个真正的 FastText 实现,它也可以读取该格式。我没有看到任何证据表明 DL4J 中的

Word2Vec
类支持 FastText 功能或加载 FastText 模型。

is 一个

org.deeplearning4j.models.fasttext.FastText
类 – 它似乎通过另一个
com.github.jfasttext.JFastText
包装了 Facebook 原生 C++ FastText 实现。也就是说,它不是真正的 Java 实现,但它使 Java 代码可以访问模型。

我不知道这种方法的完整性/可靠性;对我来说,不是来自 Github 工程师的类 (

JFastText
) 通过
com.github
路径命名有点可疑,但想必
deeplearning4j
维护者知道他们在做什么,这可能是你的最佳选择加载功能齐全(character-n-gram features)的 FastText 模型以在 DL4J 中使用。

© www.soinside.com 2019 - 2024. All rights reserved.