Как добавить числа с более чем одной цифрой в словарь word2vec - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь получить вложения для списка из 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)

1 Ответ

0 голосов
/ 21 июня 2019

Согласно нашему обсуждению выше, рабочий подход будет подпитывать Word2Vec ожидаемый тип корпуса - итеративную последовательность, где каждый элемент представляет собой список строковых токенов.

Таким образом, список списков строк будет работать, что-то вроде ...

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

... а не что-нибудь с необработанными целыми (например, list(range(1, 1043)).

...