word2vec gensim 多种语言

hit*_*n97 4 python nlp artificial-intelligence gensim word2vec

这个问题完全超出了我的想象。我正在使用 gensim 训练 Word2Vec 模型。我提供了多种语言的数据,即英语和印地语。当我试图找到最接近“man”的单词时,我得到的是:

\n\n
model.wv.most_similar(positive = [\'man\'])\nOut[14]: \n[(\'woman\', 0.7380284070968628),\n (\'lady\', 0.6933152675628662),\n (\'monk\', 0.6662989258766174),\n (\'guy\', 0.6513140201568604),\n (\'soldier\', 0.6491742134094238),\n (\'priest\', 0.6440571546554565),\n (\'farmer\', 0.6366012692451477),\n (\'sailor\', 0.6297377943992615),\n (\'knight\', 0.6290514469146729),\n (\'person\', 0.6288090944290161)]\n--------------------------------------------\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是,这些都是英文单词。然后我试图找到相同含义的印地语和英语单词之间的相似性,

\n\n
model.similarity(\'man\', \'\xe0\xa4\x86\xe0\xa4\xa6\xe0\xa4\xae\xe0\xa5\x80\')\n__main__:1: DeprecationWarning: Call to deprecated `similarity` (Method will \nbe removed in 4.0.0, use self.wv.similarity() instead).\nOut[13]: 0.078265618974427215\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个准确度应该比所有其他准确度都要好。我的印地语语料库是通过翻译英语语料库制作的。因此,这些词出现在类似的上下文中。因此他们应该很接近。

\n\n

这就是我在这里所做的:

\n\n
#Combining all the words together.\nall_reviews=HindiWordsList + EnglishWordsList\n\n#Training FastText model\ncpu_count=multiprocessing.cpu_count()\nmodel=Word2Vec(size=300,window=5,min_count=1,alpha=0.025,workers=cpu_count,max_vocab_size=None,negative=10)\nmodel.build_vocab(all_reviews)\nmodel.train(all_reviews,total_examples=model.corpus_count,epochs=model.iter)\nmodel.save("word2vec_combined_50.bin")\n
Run Code Online (Sandbox Code Playgroud)\n

big*_*g-o 7

我一直在处理一个非常相似的问题,并找到了一个相当强大的解决方案。本文表明,可以在使用不同语言训练的两个 Word2Vec 模型之间定义线性关系。这意味着您可以导出翻译矩阵,将词嵌入从一种语言模型转换为另一种语言模型的向量空间。这一切意味着什么?这意味着我可以从一种语言中取出一个单词,并在另一种语言中找到具有相似含义的单词。

\n\n

我已经编写了一个小型 Python 包来为您实现此功能:transvec。这是一个示例,我使用预训练的模型来搜索俄语单词并查找具有相似含义的英语单词:

\n\n
import gensim.downloader\nfrom transvec.transformers import TranslationWordVectorizer\n\n# Pretrained models in two different languages.\nru_model = gensim.downloader.load("word2vec-ruscorpora-300")\nen_model = gensim.downloader.load("glove-wiki-gigaword-300")\n\n# Training data: pairs of English words with their Russian translations.\n# The more you can provide, the better.\ntrain = [\n    ("king", "\xd1\x86\xd0\xb0\xd1\x80\xd1\x8c_NOUN"), ("tsar", "\xd1\x86\xd0\xb0\xd1\x80\xd1\x8c_NOUN"),\n    ("man", "\xd0\xbc\xd1\x83\xd0\xb6\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0_NOUN"), ("woman", "\xd0\xb6\xd0\xb5\xd0\xbd\xd1\x89\xd0\xb8\xd0\xbd\xd0\xb0_NOUN")\n]\n\nbilingual_model = TranslationWordVectorizer(en_model, ru_model).fit(train)\n\n# Find words with similar meanings across both languages.\nbilingual_model.similar_by_word("\xd1\x86\xd0\xb0\xd1\x80\xd0\xb8\xd1\x86\xd0\xb0_NOUN", 1) # "queen"\n# [(\'king\', 0.7763221263885498)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

不用担心俄语单词上奇怪的 POS 标签 - 这只是我使用的特定预训练模型的一个怪癖。

\n\n

所以基本上,如果您可以提供单词列表及其翻译,那么您可以训练 a将源语言语料库中存在的任何TranslationWordVectorizer单词翻译成目标语言。当我真正使用它时,我通过从数据中提取所有单独的俄语单词,通过谷歌翻译运行它们,然后保留所有翻译成英语单词的内容来生成一些训练数据。结果非常好(抱歉,我还没有关于基准测试的更多详细信息;它仍在进行中!)。

\n