如何使用Word2Vec获取单词列表的向量?

21

我想创建一个文本文件,基本上是一个字典,每个单词都与其通过word2vec训练得到的向量表示相对应。我假设这个过程是先训练word2vec,然后从我的列表中查找每个词并找到它的表示(然后保存在新的文本文件中)?

我对word2vec还很陌生,不知道该如何实现。我已经阅读了一些主要网站和Stack上的几个问题,但还没有找到好的教程。


这很简单。我以前做过这个。你想使用什么具体的语言吗?你可以直接使用作者的代码(用C++编写)来训练和提取向量。这是600-700行经过优化的代码,非常简单。如果需要,我可能能够帮忙提供确切的参数。 - Naman
1
https://code.google.com/p/word2vec/ 是原作者的代码。训练非常简单。唯一需要注意的是,它会将向量输出到二进制文件中。但你可以轻松地将其转换为文本文件。 - Naman
1
@patti_jane 如果您熟悉使用Python和gensim,可以查看https://radimrehurek.com/gensim/models/word2vec.html。它提供了一个很好的包装器和一些基本函数。如果您想要纯Python代码,我可以在我的个人电脑上给您。 - Naman
通过重构单词,我猜你的意思是想要加载从单词到向量的映射,对吗?model = Word2Vec.load_word2vec_format('/tmp/vectors.bin', binary=True) 可以完成你的工作。它将加载二进制文件,然后你就可以获取单词向量了。如果有帮助,请告诉我。 - Naman
@Naman 没错!所以我必须使用gensim吗?还有其他不用它的方法吗? - patti_jane
显示剩余3条评论
9个回答

25

直接访问的model[word]模型已经被弃用,并将在Gensim 4.0.0中移除,以便分离训练和嵌入。该命令应替换为简单的model.wv[word]

在Python中使用Gensim,在构建词汇表并完成模型训练后,您可以在model.wv.vocab中找到单词计数和采样信息,其中model是您的Word2Vec对象的变量名。

因此,要创建字典对象,您可以执行以下操作:

my_dict = dict({})
for idx, key in enumerate(model.wv.vocab):
    my_dict[key] = model.wv[key]
    # Or my_dict[key] = model.wv.get_vector(key)
    # Or my_dict[key] = model.wv.word_vec(key, use_norm=False)

现在你已经有了自己的字典,可以使用自己喜欢的任何方式将其写入文件。例如,您可以使用pickle库。或者,如果您正在使用Jupyter Notebook,它们有一个便捷的“魔法命令”%store my_dict > filename.txt。您的filename.txt将如下所示:

{'one': array([-0.06590105,  0.01573388,  0.00682817,  0.53970253, -0.20303348,
   -0.24792041,  0.08682659, -0.45504045,  0.89248925,  0.0655603 ,
   ......
   -0.8175681 ,  0.27659689,  0.22305458,  0.39095637,  0.43375066,
    0.36215973,  0.4040089 , -0.72396156,  0.3385369 , -0.600869  ],
  dtype=float32),
 'two': array([ 0.04694849,  0.13303463, -0.12208422,  0.02010536,  0.05969441,
   -0.04734801, -0.08465996,  0.10344813,  0.03990637,  0.07126121,
    ......
    0.31673026,  0.22282903, -0.18084198, -0.07555179,  0.22873943,
   -0.72985399, -0.05103955, -0.10911274, -0.27275378,  0.01439812],
  dtype=float32),
 'three': array([-0.21048863,  0.4945509 , -0.15050395, -0.29089224, -0.29454648,
    0.3420335 , -0.3419629 ,  0.87303966,  0.21656844, -0.07530259,
    ......
   -0.80034876,  0.02006451,  0.5299498 , -0.6286509 , -0.6182588 ,
   -1.0569025 ,  0.4557548 ,  0.4697938 ,  0.8928275 , -0.7877308 ],
  dtype=float32),
  'four': ......
}

您也可以查看Gensim的word2vec的本机保存/ 加载方法。


1
model.wv.get_vector()model.wv.word_vec()有什么区别? - E.K.
给定的方法现在已经被弃用 - undefined
又一个流行的开源Python数据科学库,喜欢破坏他们的API,因为他们懒得一开始就设计好。 - undefined

11
Gensim 教程讲解得非常清楚。首先,您应该创建 word2vec 模型——通过对文本进行训练来创建它,例如:

 model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)

或者通过加载预训练模型(例如,您可以在这里找到它们)。

然后迭代所有单词并在模型中检查它们的向量:

for word in words:
  vector = model[word]

有了这个,只需按您所需的格式编写单词和向量即可。


你好,你能否添加一下 words 到底是指什么。它是指 model.wv.vocab 的词汇表还是来自你的语料库中的单词? - Mitali Cyrus
应该是 list(model.wv.vocab.keys()) - TrickOrTreat

3
您可以直接通过以下方式获取向量:
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
model.wv.vectors

并通过单词

model.wv.vocab.keys()

今日免费次数已满, 请开通会员/明日再来

使用此方法,vectors 不对应于通过取 keys 获得的单词。也就是说,顺序不同,即使键已排序。 - Mitali Cyrus
尝试了几种方法后,我发现 model.wv[model.wv.vocab.keys()] 可以按键的顺序给出向量。 - Mitali Cyrus
嗨,获取向量后,它无法适应模型,你能帮我解决一下吗?我从早上就在摸索了。 - Aravind R

2

如果您想使用带有gensim包的Python,那么可以基于这个答案Gensim Word2Vec文档来进行操作,如下所示:

from gensim.models import Word2Vec

# Take some sample sentences
tokenized_sentences = [["here","is","one"],["and","here","is","another"]]

# Initialise model, for more information, please check the Gensim Word2vec documentation
model = Word2Vec(tokenized_sentences, size=100, window=2, min_count=0)

# Get the ordered list of words in the vocabulary
words = model.wv.vocab.keys()

# Make a dictionary
we_dict = {word:model.wv[word] for word in words}

你的方法没有保留单词的顺序。生成的字典包含的顺序是 and another here is one。有没有一种方法可以保留句子的顺序? - spectre
@spectre - Python字典不保留顺序,因此您可能需要使用有序字典。所以您可以import collections并定义we_dict = collections.OrderedDict()。只需记住使用循环而不是字典推导来保存结果即可。希望这有所帮助。 - Mitali Cyrus

1

Gensim 4.0更新:vocab方法已被弃用,解析单词向量的方式发生了变化

获取词汇表中按顺序排列的单词列表

words = list(w for w in model.wv.index_to_key)

获取“also”单词的向量

print(model.wv['also'])


1
由于您目前撰写的答案不够清晰,请[编辑]并添加更多细节,以帮助其他人理解此如何回答问题。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community

1
首先按照你说的方式训练你的Word2Vec模型。
要获取一组单词的键-向量对,你可以使用Gensim现在为KeyedVectors对象提供的便捷方法.vectors_for_all
示例:
words = ["apple", "machine", "learning]
word_vectors = model.wv.vectors_for_all(words)

结果也是一个KeyedVectors对象。在获取向量之后,您可以随心所欲地进行操作。

0

对于 gensim 4.0:

my_dict = dict({})

for word in word_list:
     my_dict[word] = model.wv.get_vector('0', norm = True) 

0

我建议使用this,你可以在这里找到任何你需要的工具,包括Word2Vec,FastText,Doc2Vec,KeyedVectors等等...


0

使用基本的Python:

all_vectors = []
for index, vector in enumerate(model.wv.vectors):
    vector_object = {}
    vector_object[list(model.wv.vocab.keys())[index]] = vector
    all_vectors.append(vector_object)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接