【问题标题】:word2vec gensim multiple languagesword2vec gensim 多种语言
【发布时间】:2018-07-08 15:46:00
【问题描述】:

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

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")

【问题讨论】:

  • word2vec 的工作方式是 - 如果两个词出现在相似的上下文中,则它们是相似的。如果在您的语料库中,具有相同含义的两个单词(例如“man”和“आदमी”)出现在非常不同的上下文中,您的算法永远无法判断它们是相似的
  • 查看此问题的答案 - stackoverflow.com/questions/45571295/…
  • @kampta 有一个问题,我拥有的印地语数据是英文数据的翻译。因此,这些词应该在或多或少相似的上下文中。你提到的链接有2篇论文,我会通过它们。但是你知道为什么从翻译的印地语数据创建的嵌入比向量空间中的英语数据要远吗?
  • 以上链接回答了您的问题 - “鉴于 word2vec 模型的随机初始化以及算法/实现引入的其他随机化,即使后续训练在完全相同的数据上运行也不会放置单词到完全相同的地方”
  • 是的,但差别太大了。不仅如此,我还试图找出与一些英语单词和一些印地语单词最接近的 10 个单词。英语的一个显示只有英语的接近它,印地语的显示只有印地语的接近。我尝试了每种语言的 5 个单词。这就是结果。 IE。印地语和英语单词是在完全不同的空间中形成的。

标签: python nlp artificial-intelligence word2vec gensim


【解决方案1】:

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

我已经为您编写了一个小的 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 将源语言语料库中存在的任何单词翻译成目标语言。当我真正使用它时,我通过从我的数据中提取所有单个的俄语单词,通过谷歌翻译运行它们,然后将所有翻译成一个单词的东西保留在英语中,从而生成了一些训练数据。结果非常好(抱歉,我还没有关于基准测试的更多细节;它仍在进行中!)。

【讨论】:

    【解决方案2】:

    首先,你应该真正使用 self.wv.similarity()。

    我假设在印地语语料库和英语语料库之间几乎不存在任何单词,因为印地语语料库是梵文,而英语是英语。简单地将两个语料库加在一起来制作一个模型是没有意义的。两种语言的对应词同时出现在文档的两个版本中,但不会出现在 Word2Vec 的词嵌入中以找出最相似的词。

    例如。直到你的模型知道

    男人:Aadmi::女人:奥拉特,

    从词嵌入中,它永远无法分辨出

    Raja:King::Rani:Queen

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

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

    这些可能足以给你一个想法。如果您只想进行翻译,也可以查看seq2seq。您还可以详细阅读Word2Vec theory 以了解它的作用。

    【讨论】:

    • 如果我有两个不同的印地语和英语语料库,我会同意你的说法,但我拥有的印地语语料库实际上是英文语料库的翻译。在这种情况下我应该使用什么锚?
    • 我明白了,并提出了相应的建议。您可以从几百个印地语-英语翻译的单词对开始,然后从那里开始工作。
    【解决方案3】:

    阅读完 cmets 后,我认为问题在于英语和印地语句子之间的语法结构非常不同。我使用过印地语 NLP 模型,但要获得与英语相似的结果要困难得多(因为你提到了它)。

    在印地语中,单词之间根本没有顺序,只有在拒绝它们时。此外,即使不是同一根语言的后代的语言之间的句子翻译也有些随机,您不能假设两个句子的上下文相似。

    【讨论】:

    • 查看接受的答案 OPs 问题似乎已经被正确识别,没有迹象表明原文和翻译的语料库是相同的,因此无法在它们之间进行推断
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2018-03-16
    • 2019-10-09
    相关资源
    最近更新 更多