Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python word2vec gensim多语言_Python_Nlp_Artificial Intelligence_Word2vec_Gensim - Fatal编程技术网

Python word2vec gensim多语言

Python word2vec gensim多语言,python,nlp,artificial-intelligence,word2vec,gensim,Python,Nlp,Artificial Intelligence,Word2vec,Gensim,这个问题完全超出了我的理解力。我正在使用gensim培训Word2Vec模型。我提供了多种语言的数据,即英语和印地语。当我试图找到最接近“人”的词时,我得到的是: model.wv.most_similar(positive = ['man']) Out[14]: [('woman', 0.7380284070968628), ('lady', 0.6933152675628662), ('monk', 0.6662989258766174), ('guy', 0.65131402015

这个问题完全超出了我的理解力。我正在使用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()

我假设你的印地语语料库和英语语料库中几乎没有单词,因为印地语语料库是用德瓦纳加里语写的,英语是用英语写的。简单地将两个小体加在一起形成一个模型是没有意义的。两种语言中的对应单词同时出现在文档的两个版本中,但不会出现在word嵌入中,以便Word2Vec找出最相似的单词

直到你的模特知道这一点

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

从单词embedings中,它永远无法分辨出

拉贾:国王:拉尼:王后

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

  • 制作独立的印地语语料库/模型
  • 维护和查找一些需要手动创建的英语->印地语单词对的数据
  • 在培训过程中,将输入的文档单词随机替换为相应文档中的对应单词

  • 这些可能足以给你一个想法。如果你只想做翻译,你也可以研究一下。你也可以详细阅读,了解它的作用。

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


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

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

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

    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)]
    
    不要担心俄语单词上奇怪的词性标签——这只是我使用的特定预训练模型的一个怪癖


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

    word2vec的工作方式是-如果两个单词出现在相似的上下文中,那么它们是相似的。如果在语料库中,两个具有相同含义的单词(例如“man”和“man”)आदमी') 出现在非常不同的上下文中,你的算法永远无法判断它们是否相似。这个问题的答案是-@kampta有一个问题,我拥有的印地语数据是英语数据的翻译。因此这些单词应该在或多或少相似的上下文中。你提到的链接有两篇文章,我将仔细阅读。但是你知道为什么吗从翻译后的印地语数据创建的嵌入比向量空间中的英语数据要远得多?上面的链接回答了您的问题-“考虑到word2vec模型的随机初始化以及算法/实现引入的其他随机性,即使是在完全相同的数据上运行的后续训练也不会将单词放在完全相同的位置"是的,但差别太大了。不仅如此,我还试着找出了10个与一些英语单词和一些印地语单词最接近的单词。英语单词显示只有英语单词接近,印地语单词显示只有印地语单词接近。我试了每种语言5个单词。这就是结果。也就是说,印地语和英语单词是在com中形成的完全不同的空间。如果我有两个不同的印地语和英语语料库,我同意你的说法,但我的印地语语料库实际上是英语语料库的翻译。在这个场景中我应该使用什么锚?我知道了,并提出了相应的建议。你可以从几百个印地语-英语翻译词对开始,从看看公认的答案,OPs问题似乎已经被正确识别,没有迹象表明原始语料库和翻译语料库是相同的,因此无法对它们进行推断