这个问题完全超出了我的理解范围。我正在使用gensim训练一个Word2Vec模型。我提供了多种语言的数据,即英语和印地语。当我试图查找与’man’最接近的词时,我得到了以下结果:
model.wv.most_similar(positive = ['man'])Out[14]: [('woman', 0.7380284070968628), ('lady', 0.6933152675628662), ('monk', 0.6662989258766174), ('guy', 0.6513140201568604), ('soldier', 0.6491742134094238), ('priest', 0.6440571546554565), ('farmer', 0.6366012692451477), ('sailor', 0.6297377943992615), ('knight', 0.6290514469146729), ('person', 0.6288090944290161)]--------------------------------------------
问题是,这些都是英语单词。然后我尝试查找相同意义的印地语和英语单词之间的相似性,
model.similarity('man', 'आदमी')__main__:1: DeprecationWarning: Call to deprecated `similarity` (Method will be removed in 4.0.0, use self.wv.similarity() instead).Out[13]: 0.078265618974427215
这个准确度本应比其他所有准确度都要高。我拥有的印地语语料库是通过翻译英语语料库制作的。因此,单词出现在相似的上下文中。因此,它们应该很接近。
这是我在这里所做的:
#Combining all the words together.all_reviews=HindiWordsList + EnglishWordsList#Training FastText modelcpu_count=multiprocessing.cpu_count()model=Word2Vec(size=300,window=5,min_count=1,alpha=0.025,workers=cpu_count,max_vocab_size=None,negative=10)model.build_vocab(all_reviews)model.train(all_reviews,total_examples=model.corpus_count,epochs=model.iter)model.save("word2vec_combined_50.bin")
回答:
首先,你真的应该使用self.wv.similarity()。
我假设在你的印地语语料库和英语语料库之间几乎没有单词是相同的,因为印地语语料库使用的是梵文字母,而英语使用的是英语。简单地将两个语料库加在一起来制作模型是没有意义的。两种语言中的对应词在文档的两个版本中共同出现,但不在你的词嵌入中,Word2Vec无法找出最相似的词。
例如,直到你的模型知道
Man:Aadmi::Woman:Aurat,
从词嵌入中,它永远无法理解
Raja:King::Rani:Queen
的关系。为了做到这一点,你需要在两个语料库之间建立某种锚点。以下是一些你可以尝试的建议:
- 创建一个独立的印地语语料库/模型
- 维护并查找一些你需要手动创建的英语-印地语词对数据
- 在训练时随机用对应文档中的对应词替换输入文档中的词
这些建议可能足以给你一些启发。如果你只想进行翻译,你还可以查看seq2seq。你还可以详细阅读Word2Vec理论,以了解它是如何工作的。