繁体   English   中英

word2vec gensim 多种语言

[英]word2vec gensim multiple languages

这个问题完全超出了我的头脑。 我正在使用 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")

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

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

例如。 直到你的模型知道

男:阿德米::女:奥拉特,

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

拉贾:国王::拉尼:女王

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

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

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

我一直在处理一个非常相似的问题,并遇到了一个相当强大的解决方案。 这篇论文表明,可以在两个用不同语言训练的 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将源语言语料库中存在的任何单词翻译成目标语言。 当我真正使用它时,我通过从我的数据中提取所有单独的俄语单词,通过谷歌翻译运行它们,然后将所有翻译成英语单词的内容保留下来,从而生成了一些训练数据。 结果非常好(抱歉,我还没有关于基准测试的更多细节;它仍在进行中!)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM