如何将 Pandas DataFrame 中加载的嵌入转换为 Gensim 模型?

问题描述 投票:0回答:2

我有一个 DataFrame,其中索引是单词,并且有 100 列浮点数,这样对于每个单词,我将其嵌入为 100d 向量。我想将我的 DataFrame 对象转换为 gensim 模型对象,以便我可以使用它的方法;特别是

gensim.models.keyedvectors.most_similar()
,以便我可以在我的子集中搜索相似的单词。

哪种方法是首选?

谢谢

python pandas gensim
2个回答
8
投票

不确定执行此操作的“首选”方式是什么,但 gensim 期望的格式非常容易复制:

data = pd.DataFrame([[0.15941701, 0.84058299],
                     [0.12190033, 0.87809967],
                     [0.06293788, 0.93706212]],
                    index=["these", "be", "words"])

np.savetxt('test.txt', data.reset_index().values, 
           delimiter=" ", 
           header="{} {}".format(len(data), len(data.columns)),
           comments="",
           fmt=["%s"] + ["%.18e"]*len(data.columns))

标题是2个空格分隔的整数,词汇表中的单词数和单词向量的长度。每行的第一列是单词本身。其余列是词向量的元素。 fmt 的怪异之处在于将第一个元素格式化为字符串,其余元素格式化为浮点数。

然后可以将其加载到 gensim 中并执行任何操作:

import gensim

from gensim.models.keyedvectors import KeyedVectors
word_vectors = KeyedVectors.load_word2vec_format('test.txt', binary=False)

word_vectors.similarity('these', 'words')

0
投票

对于其他最终在这里寻找相对快速答案的人来说,Ken Syme 的答案几乎对我有用,我只需将

fmt=["%s"] + ["%.18e"]*len(data.columns)
更改为
fmt="%s"

还要注意OP的df已经有单词作为索引,所以如果你自己的df有自动生成的数字作为索引,单词作为第一个数据列“单词”,你需要执行一个额外的步骤,如

df.set_index('words')
在此处给出的
reset_index().values
之前。

© www.soinside.com 2019 - 2024. All rights reserved.