Соответствие слов и векторов в модели 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
.
общий доступ к gist, демонстрирующий тот же: https://gist.github.com/kampta/139f710ca91ed5fabaf9e6616d2c762b