word2vec gensim 多种语言

word2vec gensim multiple languages

这个问题完全让我头疼。我正在使用 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 model
cpu_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 找出最相似的词。

例如。直到你的模型知道

男:Aadmi::女:Aurat,

从单词嵌入中,它永远无法弄清楚

Raja:King::Rani:Queen

关系。为此,您需要 some 两个语料库之间的锚点。 以下是您可以尝试的一些建议:

  1. 制作独立的印地语corpus/model
  2. 维护和查找您必须手动创建的一些英语->印地语单词对的数据。
  3. 训练时用相应文档中的对应词随机替换输入文档词

这些可能足以给你一个想法。您还可以详细查看 seq2seq if you want only want to do translations. You can also read the Word2Vec theory 以了解它的作用。

看完评论后,我认为问题在于英语和印地语句子的语法结构大不相同。我使用过印地语 NLP 模型,要获得与英语相似的结果要困难得多(既然你提到了它)。

在印地语中,单词之间根本没有顺序,只有在拒绝它们时才会这样。此外,一个句子在甚至不是同一根语言的后裔的语言之间的翻译有些随机,你不能假设两个句子的上下文相似。

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

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

import gensim.downloader
from transvec.transformers import TranslationWordVectorizer

# Pretrained models in two different languages.
ru_model = gensim.downloader.load("word2vec-ruscorpora-300")
en_model = gensim.downloader.load("glove-wiki-gigaword-300")

# Training data: pairs of English words with their Russian translations.
# The more you can provide, the better.
train = [
    ("king", "царь_NOUN"), ("tsar", "царь_NOUN"),
    ("man", "мужчина_NOUN"), ("woman", "женщина_NOUN")
]

bilingual_model = TranslationWordVectorizer(en_model, ru_model).fit(train)

# Find words with similar meanings across both languages.
bilingual_model.similar_by_word("царица_NOUN", 1) # "queen"
# [('king', 0.7763221263885498)]

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

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