我遇到了与 Word2Vec
相关的问题据我了解:让我们在一个文本语料库上训练一个模型(以我的方式,它是一个约2 Gb大小的语料库) 让我们从该文本中取一行,并计算该行的向量(行的向量=单词向量的总和)。这会很不错。像这样:
for w in words:
coords += model[w]
然后让我们计算该向量的长度。标准库为:
import numpy as np
vectorLen = np.linalg.norm(coords)
为什么我们需要Word2Vec?是的,要将单词转换为向量 AND 上下文相关性(找到的单词和含义接近的单词具有相似的坐标)!
我想要的(我在等待什么)-如果我将文本的某些行并从字典中添加一些对于该行而言并不常见的词,然后再次计算该向量的长度,我将得到如果我只计算这行的向量而没有从字典中向该行添加一些反常的单词,则该值会有所不同。
但是实际上-此向量的值(在添加单词之前和之后)非常相似!而且-它们实际上是相同的!为什么我得到这个结果? 如果我对这条线的理解正确,则单词的坐标会完全相同(上下文接近),但是新单词的坐标会大不相同,并且会影响结果(新单词的行向量长度)!
E.x。这是我的W2V模型设置:
#Word2Vec model
model = gensim.models.Word2Vec(
sg=0,
size=300,
window=3,
min_count=1,
hs=0,
negative=5,
workers=10,
alpha=0.025,
min_alpha=0.025,
sample=1e-3,
iter=20
)
#prepare the model vocabulary
model.build_vocab(sentences, update=False)
#train model
model.train(sentences, epochs=model.iter, total_examples=model.corpus_count)
或者这个:
#Word2Vec model
model = gensim.models.Word2Vec(
sg=1,
size=100,
window=10,
min_count=1,
hs=0,
negative=5,
workers=10,
alpha=0.025,
min_alpha=0.025,
seed=7,
sample=1e-3,
hashfxn=hash,
iter=20
)
#prepare the model vocabulary
model.build_vocab(sentences, update=False)
出什么问题了?我如何获得必要的结果?
答案 0 :(得分:0)
为什么您需要“向量长度”进行显着更改,以作为“期望结果”?
字向量的长度(或相同的和)通常不是主要问题。实际上,在进行比较之前,通常先将字向量归一化为单位长度。 (有时,当做求和/平均值作为为多字游程创建矢量的简单方法时,可以在此类操作之前或之后对矢量进行单位归一化。)
通常,最受关注的是方向(角度)。
此外,将长度值描述为“非常相似”是什么意思?在没有显示您在测试中看到的实际长度的情况下,尚不清楚您对“应该”进行的更改的直觉是否正确。
请注意,在多维空间(尤其是高维空间)中,我们的直觉通常是错误的。
例如,尝试在二维空间中添加成对的random unit vectors,并查看总和的标准长度。如您所料,您可能会看到各种各样的结果,范围从接近0.0到接近2.0-表示离原点越来越近。
尝试在500d空间中添加一堆成对的随机单位向量。现在,总和的标准长度几乎总是接近1.4。从本质上讲,在有500个方向可以走的情况下,大多数总和不会显着地移近或移到原点,即使它们仍然分别从两个向量移开1.0。
您可能会用词向量观察到同样的事情。它们很好,但是您选择采用的度量(向量和的范数)在高维空间中不会改变您期望的方式。
另外,与您的主要问题无关,但与显示的word2vec参数有关:
min_count=1
可以保留更多的单词/信息,从而获得更好的向量。但是,保留此类稀有单词通常会损害单词向量的质量。词向量的质量需要许多不同的词用法示例。仅带有1个或几个示例的单词不会从这几个特有用法示例中获得良好的矢量,但是 do 会作为训练噪声/干扰来改善其他带有更多示例的单词向量。 alpha
学习率衰减到可忽略的值。将结尾min_alpha
设置为与开头alpha
相同的值将阻止这样做。 (通常,大多数用户不应该更改任何一个alpha
参数,如果根本需要修改,则更改起始值更为合理。)