Sau*_*jee 3 python vector gensim word2vec vector-space
我有一个Word2Vec模型,有很多单词向量.我可以这样访问一个单词向量.
word_vectors = gensim.models.Word2Vec.load(wordspace_path)
print(word_vectors['boy'])
Run Code Online (Sandbox Code Playgroud)
产量
[ -5.48055351e-01 1.08748421e-01 -3.50534245e-02 -9.02988110e-03...]
Run Code Online (Sandbox Code Playgroud)
现在我有一个合适的矢量表示,我想用word替换word_vectors ['boy'].
word_vectors['boy'] = [ -7.48055351e-01 3.08748421e-01 -2.50534245e-02 -10.02988110e-03...]
Run Code Online (Sandbox Code Playgroud)
但是引发了以下错误
TypeError: 'Word2Vec' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
有没有时尚或解决方法来做到这一点?一旦训练模型,那就是手动操纵单词向量?除了Gensim之外的其他平台有可能吗?
由于word2vec向量通常仅由迭代训练过程创建,然后被访问,因此gensim Word2Vec对象不支持通过其单词索引直接分配新值.
但是,就像在Python中一样,它的所有内部结构都是完全可见/可篡改的,并且由于它是开源的,您可以准确地查看它如何完成所有现有功能,并将其用作如何使用的模型做新事物.
具体来说,原始的单词向量是(在最新版本的gensim中)存储在Word2Vec被调用对象的属性中wv,而这个wv属性是一个实例KeyedVectors.如果你检查它的源代码,你可以看到通过字符串键(例如'boy')访问字向量,包括通过[]方法实现的索引__getitem__(),通过它的方法word_vec().您可以在本地安装或Github中查看该方法的来源:
在那里你会看到单词实际上被转换为整数索引(via self.vocab[word].index)然后用于访问内部syn0或syn0norm数组(取决于用户是访问原始或单位规范化的向量).如果你看看其他地方,这些地方都设置了,或者干脆在自己的控制台/代码检查它们(仿佛word_vectors.wv.syn0),你会看到这些numpy阵列,其做支持指数直接分配.
因此,您可以通过整数索引直接篡改其值,如下所示:
word_vectors.wv.syn0[word_vectors.wv.vocab['boy'].index] = [ -7.48055351e-01 3.08748421e-01 -2.50534245e-02 -10.02988110e-03...]
Run Code Online (Sandbox Code Playgroud)
然后,将来的访问word_vectors.wv['boy']将返回您更新的值.
笔记:
•如果要syn0norm更新,要获得正确的单位标准向量(如在most_similar()其他操作中使用的那样),最好先修改syn0,然后丢弃并重新计算syn0norm,通过:
word_vectors.wv.syn0norm = None
word_vectors.wv.init_sims()
Run Code Online (Sandbox Code Playgroud)
•添加新单词需要更多涉及对象篡改,因为它需要增长syn0(用更大的数组替换它),并更新vocabdict
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |