如何使用 Word2Vec 获取单词列表的向量?
Posted
技术标签:
【中文标题】如何使用 Word2Vec 获取单词列表的向量?【英文标题】:How to fetch vectors for a word list with Word2Vec? 【发布时间】:2015-10-05 02:35:03 【问题描述】:我想创建一个本质上是字典的文本文件,每个单词都通过 word2vec 与其矢量表示配对。我假设这个过程是首先训练 word2vec 然后从我的列表中查找每个单词并找到它的表示形式(然后将其保存在一个新的文本文件中)?
我是 word2vec 的新手,我不知道该怎么做。我已经阅读了几个主要网站,以及 Stack 上的几个问题,但还没有找到好的教程。
【问题讨论】:
这很容易。我过去曾这样做过。你想使用任何特定的语言吗?您可以直接使用作者的代码(在 C++ 中)来训练和提取向量。这是简单的 600-700 行优化代码。如果您需要,我可以帮助您提供确切的论据。 我更喜欢 Java,但我真正需要做的就是用任何语言制作一个字典,然后将该文本文件加载到我的 Java 程序中,这样任何语言都可以工作 code.google.com/p/word2vec 是原作者的代码。训练非常简单。唯一的是将向量输出到二进制文件中。您可以轻松地将其转换为文本文件。 @Naman 我正在尝试使用单词向量输出,正如您所说,有些单词只是表示为数字。我正在研究他们为单词分配二进制代码的部分,但仍然无法完全破译它。任何建议都会有很大帮助! @patti_jane 当然,如果您习惯使用 python 和 gensim,可以查看radimrehurek.com/gensim/models/word2vec.html。它为您提供了一个很好的包装器和一些基本功能。如果你想要纯 python 代码,我可以在我的个人电脑上给你。 【参考方案1】:直接访问 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)
现在您有了字典,您可以使用任何您喜欢的方式将其写入文件。例如,您可以使用the pickle library。或者,如果您使用的是 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 的原生 save / load 方法。
【讨论】:
model.wv.get_vector()
和model.wv.word_vec()
有什么区别?【参考方案2】:
Gensim tutorial解释的很清楚。
首先,您应该创建 word2vec 模型 - 通过在文本上进行训练,例如
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
或通过加载预训练模型(例如,您可以找到它们here)。
然后遍历所有单词并在模型中检查它们的向量:
for word in words:
vector = model[word]
有了它,只需编写你想要的格式的单词和矢量。
【讨论】:
嗨,你能补充一下words
的具体内容吗?无论是vocab
for model.wv.vocab
还是您语料库中的文字。
应该是list(model.wv.vocab.keys())
【参考方案3】:
如果您愿意将python
与gensim
包一起使用,那么在this answer 和Gensim Word2Vec Documentation 的基础上,您可以这样做
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 - Python 字典不保留顺序,因此您可能必须为此使用有序字典。所以你可以import collections
并定义we_dict = collections.OrderedDict()
。只要记住使用没有字典理解的循环来保存结果。希望对您有所帮助。【参考方案4】:
可以直接通过向量获取
model = Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)
model.wv.vectors
和单词通过
model.wv.vocab.keys()
希望对你有帮助!
【讨论】:
使用这种方法,vectors
与取keys
得到的词不对应。也就是说,顺序是不一样的,即使对键进行了排序。
在尝试了几件事后,我发现model.wv[model.wv.vocab.keys()]
给出了按键顺序排列的向量。【参考方案5】:
使用基本的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)
【讨论】:
【参考方案6】:对于 gensim 4.0:
my_dict = dict()
for word in word_list:
my_dict[word] = model.wv.get_vector('0', norm = True)
【讨论】:
【参考方案7】:Gensim 4.0 更新:vocab 方法被贬低,解析词向量的方式发生了变化
获取词汇表中单词的有序列表
words = list(w for w in model.wv.index_to_key)
获取'also'的向量
打印(model.wv['also'])
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于如何使用 Word2Vec 获取单词列表的向量?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用单词的向量表示(从 Word2Vec 等获得)作为分类器的特征?