У меня был gensim Word2Vec вычислить некоторые слова вложения для меня. Насколько мне известно, все было совершенно фантастически; теперь я собираю создаваемые слова векторов, надеясь получить семантические группировки.
В качестве следующего шага я хотел бы взглянуть на слова (а не на векторы), содержащиеся в каждом кластере. То есть если у меня есть вектор вложений [x, y, z]
, я хотел бы узнать, какое фактическое слово представляет этот вектор. Я могу получить слова/элементы Vocab, вызвав model.vocab
и векторы слов через model.syn0
. Но я не мог найти место, где они явно совпадают.
Это было сложнее, чем я ожидал, и я чувствую, что, возможно, я пропустил очевидный способ сделать это. Любая помощь приветствуется!
Проблема:
Сопоставьте слова с векторами вложения, созданными Word2Vec ()
- как это сделать?
Мой подход:
После создания модели (код ниже *) теперь я хотел бы сопоставить индексы, назначенные каждому слову (в фазе build_vocab()
), векторной матрице, выводимой как model.syn0
.
Таким образом,
for i in range (0, newmod.syn0.shape[0]): #iterate over all words in model
print i
word= [k for k in newmod.vocab if newmod.vocab[k].__dict__['index']==i] #get the word out of the internal dicationary by its index
wordvector= newmod.syn0[i] #get the vector with the corresponding index
print wordvector == newmod[word] #testing: compare result of looking up the word in the model -- this prints True
-
Есть ли лучший способ сделать это, например. путем подачи вектора в модель в соответствии с словом?
-
Это даже дает мне правильные результаты?
* Мой код для создания векторов слов:
model = Word2Vec(size=1000, min_count=5, workers=4, sg=1)
model.build_vocab(sentencefeeder(folderlist)) #sentencefeeder puts out sentences as lists of strings
model.save("newmodel")
Я нашел этот вопрос, который аналогичен, но на самом деле не был дан ответ.