我对 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 中,它为它们提供了一个空向量。
我的问题是:
任何指导或建议将不胜感激
核心原始 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 模型。
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 中使用。