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

wljmcqd8  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(110)

我有一个DataFrame,其中索引是单词,我有100列浮点数,这样对于每个单词,我都将其嵌入为100d向量。我想将DataFrame对象转换为gensim model object,以便可以使用它的方法;特别是gensim.models.keyedvectors.most_similar(),这样我就可以在我的子集中搜索类似的单词。
哪种方法更好?
谢谢

5kgi1eie

5kgi1eie1#

不知道“首选”的方式是什么,但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')
jobtbby3

jobtbby32#

对于其他人在这里寻找一个相对快速的答案,Ken Syme的答案几乎对我有用,我只需要将fmt=["%s"] + ["%.18e"]*len(data.columns)更改为fmt="%s"
还要注意,OP的df已经有单词作为索引,所以如果你自己的df有自动生成的数字作为索引,单词作为第一个数据列“单词”,你需要在这里给出的reset_index().values之前做一个额外的步骤,比如df.set_index('words')

相关问题