【发布时间】:2019-06-20 13:16:11
【问题描述】:
我正在尝试使用 word2vec 获取 1043 个节点列表的嵌入。当我尝试构建词汇表时,我发现 word2vec 获取带有节点的列表列表并将它们视为单个数字,例如“143”变为“1”、“4”、“3”。
我已经尝试将所有数字作为单个条目并查看它是否是格式问题并使用了 buil_vocab_from_freq 而不是 build_vocab,但这也只会产生错误('int' 类型的对象没有 len()) .
我的代码如下:
from gensim.models import Word2Vec
def generateEmbeddings(all_walks,dimension,min_count):
model = Word2Vec(min_count = min_count, size = dimension)
mylist = list(range(1,1043))
corpus = {}
j=1
for i in mylist:
corpus[str(i)] = j
j=j+1
#mylist = [str(i) for i in mylist]
print(corpus)
model.build_vocab_from_freq(corpus)
model.train(mylist, total_examples=model.corpus_count, epochs = 30)
#if it reaches this point it throws the error "14 not found in vocabulary"
print(model.wv.most_similar(positive=['14']))
return model
print(generateEmbeddings(all_walks,128,2))
我想获得例如嵌入。数字“14”而不是现在的“1”。感谢您的帮助!
//编辑
如果其他人遇到此特定问题,我设法解决了这个问题: 您必须将列表格式化为 [["1","102","43"],["54","43"]] 等。 您不能在运行时更改旧列表(或者至少它没有像我那样工作),因此您可以在运行时创建一个新列表
new_list = []
for i in all_walks:
temp_list = []
for j in i:
temp_list.append(str(j))
new_list.append(temp_list)
【问题讨论】:
-
all_walks是如何准备的,它的类型/内容是什么?Word2Vec期望它的训练语料库是一个可迭代的文本序列,其中每个文本都是一个字符串标记列表。您当前的代码片段中似乎没有任何内容可以访问(或创建)这样的训练语料库。 (整数列表 -list(range(1, 1043))- 不是每个项目都是令牌列表的序列。) -
all_walks 是一个类似 [[1,2,3],[1,2,4],[10,11,12],[10,14,15,900]] 的列表,其中包含一些 -一百个条目。
-
它需要是一个字符串列表列表才能成为
Word2Vec通常所期望的。例如:[['1','2','3'],['1','2','4'],['10','11','12'],['10','14','15','900']] -
好的,这确实做到了。我之前尝试过这个,但直到现在才设法通过创建一个带有两个 for 循环的新列表而不是在运行时更改 all_walks 来做到这一点。现在它已启动并运行,感谢您的帮助!