Соответствие слов и векторов в модели Word2Vec gensim

у меня было 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")

я нашел этот вопрос который похож, но не ответил.

4 ответов


Я долго искал, чтобы найти отображение между матрицей syn0 и словарем... вот ответ : используйте model.index2word Это просто список слов в правильном порядке !

этого нет в официальной документации (почему ?) но его можно найти непосредственно внутри исходного кода : https://github.com/RaRe-Technologies/gensim/blob/3b9bb59dac0d55a1cd6ca8f984cead38b9cb0860/gensim/models/word2vec.py#L441


если все, что вы хотите сделать, это карта a слово до вектор, вы можете просто использовать [] оператора, например,model["hello"] даст вам вектор, соответствующий hello.

Если вам нужно восстановить слово из вектора, вы можете просмотреть список векторов и проверить совпадение, как вы предлагаете. Однако, это неэффективно и не подходящие для Python. Удобным решением является использование similar_by_vector метод модели word2vec, например это:

import gensim

documents = [['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

model = gensim.models.Word2Vec(documents, min_count=1)
print model.similar_by_vector(model["survey"], topn=1)

выходы:

[('survey', 1.0000001192092896)]

где число представляет собой сходство.

однако этот метод по-прежнему неэффективен, так как он по-прежнему должен сканировать все векторы слов для поиска наиболее похожего. Лучшее решение вашей проблемы -найдите способ отслеживать Ваши векторы во время процесса кластеризации, поэтому вам не нужно полагаться на дорогостоящие обратные сопоставления.


поэтому я нашел простой способ сделать это, где nmodel - это имя вашей модели.

#zip the two lists containing vectors and words
zipped = zip(nmodel.wv.index2word, nmodel.wv.syn0)

#the resulting list contains `(word, wordvector)` tuples. We can extract the entry for any `word` or `vector` (replace with the word/vector you're looking for) using a list comprehension:
wordresult = [i for i in zipped if i[0] == word]
vecresult = [i for i in zipped if i[1] == vector]

это основано на gensim код. Для более старых версий gensim вам может потребоваться удалить wv после модели.


как упоминал @bpachev, gensim имеет возможность поиска по вектору, а именно similar_by_vector.

ответ использовать приблизительный алгоритм поиска ближайшего соседа, такой как FLANN.

общий доступ к gist, демонстрирующий тот же: https://gist.github.com/kampta/139f710ca91ed5fabaf9e6616d2c762b