Я пытаюсь получить вложения для списка из 1043 узлов с помощью word2vec. Когда я пытаюсь построить словарь, я обнаруживаю, что word2vec берет список списков с узлами и обрабатывает их как однозначные числа, например, что «143» становится «1», «4», «3».
Я уже пытался использовать все числа в виде отдельных записей и вижу, что это проблема форматирования, и использовал build_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», как сейчас. Спасибо за вашу помощь!
// Edit
Мне удалось это исправить, если у кого-то еще возникла конкретная проблема:
Вы должны отформатировать список, как указано [["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)