如何在word2vec-vocabulary中添加多于一位的数字

时间:2019-06-20 13:16:11

标签: python gensim word2vec

我正在尝试使用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)

1 个答案:

答案 0 :(得分:0)

根据上面的讨论,工作方法将为Word2Vec提供所需的语料库-一个可迭代的序列,其中每个项目都是一个字符串令牌的列表。

因此,一个字符串列表列表将起作用,就像...

[
  ['1','2','3'],
  ['1','2','4'],
  ['10','11','12'],
  ['10','14','15','900']
]

...而不是其中包含原始整数的任何内容(例如list(range(1, 1043))。