我试图导入gensim.
我有以下代码
import gensim
model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-
vectors-negative300.bin', binary=True)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
ImportError Traceback (most recent call
last)
<ipython-input-5-50007be813d4> in <module>()
----> 1 import gensim
2 model = gensim.models.Word2Vec.load_word2vec_format('./model
/GoogleNews-vectors-negative300.bin', binary=True)
ImportError: No module named 'gensim'
Run Code Online (Sandbox Code Playgroud)
我在python中安装了gensim.我使用genssim作为word2vec.
我有一个生成器(一个产生东西的函数),但是当试图将它传递给gensim.Word2Vec
我时,我得到以下错误:
TypeError:您不能将生成器作为句子参数传递.尝试一个迭代器.
发生器不是一种迭代器吗?如果没有,我如何从中制作迭代器?
看一下库代码,它似乎只是简单地迭代句子for x in enumerate(sentences)
,这对我的生成器来说效果很好.那么是什么导致错误?
我正在使用Word2Vec,其中包含大约11,000,000个令牌的数据集,它们希望同时进行单词相似性(作为下游任务的同义词提取的一部分),但我不太清楚我应该使用Word2Vec多少维度.根据令牌/句子的数量,是否有人对要考虑的维度范围有一个良好的启发式?
使用该gensim.models.Word2Vec
库,您可以提供一个模型和一个"单词",您可以为其找到最相似的单词列表:
model = gensim.models.Word2Vec.load_word2vec_format(model_file, binary=True)
model.most_similar(positive=[WORD], topn=N)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能将系统作为输入模型和"向量",并要求系统返回顶部相似的单词(它们的向量非常接近给定的向量).类似的东西:
model.most_similar(positive=[VECTOR], topn=N)
Run Code Online (Sandbox Code Playgroud)
我需要这个功能用于双语设置,其中我有2个模型(英语和德语),以及一些英语单词,我需要找到他们最相似的德国候选人.我想要做的是从英语模型中获取每个英语单词的向量:
model_EN = gensim.models.Word2Vec.load_word2vec_format(model_file_EN, binary=True)
vector_w_en=model_EN[WORD_EN]
Run Code Online (Sandbox Code Playgroud)
然后用这些向量查询德国模型.
model_DE = gensim.models.Word2Vec.load_word2vec_format(model_file_DE, binary=True)
model_DE.most_similar(positive=[vector_w_en], topn=N)
Run Code Online (Sandbox Code Playgroud)
我已经使用word2vec包中的原始距离函数在C中实现了这一点.但是,现在我需要它在python中,以便能够将它与我的其他脚本集成.
你知道在gensim.models.Word2Vec
库或其他类似的库中是否已经有一个方法可以做到这一点吗?我需要自己实施吗?
我尝试了几种加载google news word2vec向量的方法(https://code.google.com/archive/p/word2vec/):
en_nlp = spacy.load('en',vector=False)
en_nlp.vocab.load_vectors_from_bin_loc('GoogleNews-vectors-negative300.bin')
Run Code Online (Sandbox Code Playgroud)
以上给出:
MemoryError: Error assigning 18446744072820359357 bytes
Run Code Online (Sandbox Code Playgroud)
我也试过.gz打包向量; 或者使用gensim将它们加载并保存为新格式:
from gensim.models.word2vec import Word2Vec
model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
model.save_word2vec_format('googlenews2.txt')
Run Code Online (Sandbox Code Playgroud)
然后,该文件包含每行上的单词及其单词向量.我试着加载它们:
en_nlp.vocab.load_vectors('googlenews2.txt')
Run Code Online (Sandbox Code Playgroud)
但它返回"0".
这样做的正确方法是什么?
更新:
我可以将自己创建的文件加载到spacy中.我在每一行使用带有"string 0.0 0.0 ...."的test.txt文件.然后使用.bzip2将此txt压缩到test.txt.bz2.然后我创建一个spacy兼容的二进制文件:
spacy.vocab.write_binary_vectors('test.txt.bz2', 'test.bin')
Run Code Online (Sandbox Code Playgroud)
我可以加载到spacy:
nlp.vocab.load_vectors_from_bin_loc('test.bin')
Run Code Online (Sandbox Code Playgroud)
这有效!但是,当我为googlenews2.txt执行相同的过程时,我收到以下错误:
lib/python3.6/site-packages/spacy/cfile.pyx in spacy.cfile.CFile.read_into (spacy/cfile.cpp:1279)()
OSError:
Run Code Online (Sandbox Code Playgroud) 我使用Gensim Python包来学习神经语言模型,我知道你可以提供一个训练语料库来学习模型.然而,已经存在许多以文本格式可用的预计算单词向量(例如http://www-nlp.stanford.edu/projects/glove/).有没有办法初始化一个只使用一些预先计算的向量的Gensim Word2Vec模型,而不是从头开始学习向量?
谢谢!
我正在考虑在Web爬行转储上大量超过10 TB +的大规模数据上训练word2vec.
我个人训练c实施GoogleNews-2012转储(1.5gb)在我的iMac上花了大约3个小时来训练和生成向量(对速度印象深刻).我没有尝试python实现虽然:(我读到某处,在300向量长度的wiki转储(11gb)上生成向量大约需要9天生成.
如何加速word2vec?我是否需要在2-3天内使用分布式模型或我需要哪种类型的硬件?我有8gb内存的iMac.
哪一个更快?Gensim python或C实现?
我看到word2vec实现不支持GPU培训.
我正在使用Word2vec通过gensim与Google在Google新闻上训练的预训练矢量.我注意到我可以通过对Word2Vec
对象进行直接索引查找来访问的单词vector 不是单位向量:
>>> import numpy
>>> from gensim.models import Word2Vec
>>> w2v = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
>>> king_vector = w2v['king']
>>> numpy.linalg.norm(king_vector)
2.9022589
Run Code Online (Sandbox Code Playgroud)
但是,在该most_similar
方法中,不使用这些非单位矢量; 相反,从未记录的.syn0norm
属性中使用规范化版本,该属性仅包含单位向量:
>>> w2v.init_sims()
>>> unit_king_vector = w2v.syn0norm[w2v.vocab['king'].index]
>>> numpy.linalg.norm(unit_king_vector)
0.99999994
Run Code Online (Sandbox Code Playgroud)
较大的向量只是单位向量的放大版本:
>>> king_vector - numpy.linalg.norm(king_vector) * unit_king_vector
array([ 0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
0.00000000e+00, -1.86264515e-09, 0.00000000e+00,
-7.45058060e-09, 0.00000000e+00, 3.72529030e-09,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
... (some lines omitted) ...
-1.86264515e-09, -3.72529030e-09, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, …
Run Code Online (Sandbox Code Playgroud) 我有gensim Word2Vec实现为我计算一些单词嵌入.据我所知,一切都非常奇妙; 现在我正在聚集创建的单词vector,希望得到一些语义分组.
下一步,我想看一下每个集群中包含的单词(而不是向量).即如果我有嵌入的向量[x, y, z]
,我想找出这个向量代表的实际单词.我可以通过调用model.vocab
和单词向量来获得单词/ Vocab项目model.syn0
.但我找不到这些明确匹配的位置.
这比我想象的要复杂得多,我觉得我可能会错过这种明显的做法.任何帮助表示赞赏!
将单词与嵌入向量相匹配Word2Vec ()
- 如何进行?
在创建模型(下面的代码*)之后,我现在想要将分配给每个单词的索引(在build_vocab()
阶段期间)与输出的向量矩阵相匹配model.syn0
.从而
for i in range (0, newmod.syn0.shape[0]): #iterate over all words in model
print i
word= [k for k in newmod.vocab if newmod.vocab[k].__dict__['index']==i] #get the word out of the internal dicationary by its index
wordvector= newmod.syn0[i] #get the vector with the corresponding index
print wordvector == newmod[word] #testing: compare result of looking up …
Run Code Online (Sandbox Code Playgroud) 我知道这问题已经被提出,但我仍然无法找到解决方案.
我想word2vec
在自定义数据集上使用gensim ,但现在我仍然在弄清楚数据集必须采用的格式.我看了一下这篇文章,其中输入基本上是一个列表列表(一个包含其他列表的大列表,这些列表是来自NLTK Brown语料库的标记化句子).所以我认为这是我必须用于命令的输入格式word2vec.Word2Vec()
.但是,它不适用于我的小测试集,我不明白为什么.
我尝试过的:
这有效:
from gensim.models import word2vec
from nltk.corpus import brown
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
brown_vecs = word2vec.Word2Vec(brown.sents())
Run Code Online (Sandbox Code Playgroud)
这不起作用:
sentences = [ "the quick brown fox jumps over the lazy dogs","yoyoyo you go home now to sleep"]
vocab = [s.encode('utf-8').split() for s in sentences]
voc_vec = word2vec.Word2Vec(vocab)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它不适用于"模拟"数据,即使它具有与布朗语料库中的句子相同的数据结构:
词汇:
[['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dogs'], ['yoyoyo', 'you', 'go', 'home', 'now', 'to', …
Run Code Online (Sandbox Code Playgroud)