Соответствующие слова и векторы в gensim модели Word2Vec

У меня была реализация 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 Solutions collect form web for “Соответствующие слова и векторы в gensim модели Word2Vec”

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

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

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

Если вам нужно восстановить слово из вектора, вы можете прокрутить список векторов и проверить соответствие, как вы предлагаете. Однако это неэффективно, а не питонично. Удобным решением является использование метода 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)] 

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

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

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

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

Совместное использование демонстрации того же: https://gist.github.com/kampta/139f710ca91ed5fabaf9e6616d2c762b

Поэтому я нашел простой способ сделать это, где 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 после модели.

  • использование Word2VecModel.transform () не работает в функции карты
  • Как использовать предварительно обработанную модель Word2Vec в Tensorflow
  • Ошибка Word2Vec
  • Объект 'file' не имеет атрибута 'rfind'
  • У объекта TensorFlow 'module' нет атрибута 'global_variables_initializer'
  • Как рассчитать схожесть предложения, используя модель word2vec gensim с python
  • Python: gensim: RuntimeError: вы должны сначала создать словарь перед обучением модели
  • Словарь Python Gensim word2vec
  •  
    Interesting Posts for Van-Lav

    «Пустой набор тестов», запуская тесты Django с Pycharm (тесты обнаруживаются, если они запускаются из оболочки)

    Лучшая практика при использовании объекта httplib2.Http ()

    Использование python для открытия cmd и автоматического ввода пароля

    Python: найдите `sys.argv` перед загрузкой модуля` sys`

    Как мне получить virtualenv, чтобы предпочесть его локальные библиотеки по глобальным библиотекам

    django просмотров – 502 плохой шлюз

    Изменение размера виджета списка Tkinter при изменении размера окна

    Декартово произведение Python из n списков с n неизвестным во время кодирования

    Почему вычитание быстрее, чем добавление в Python?

    python продолжается, если условие не выполнено

    запустить команду linux grep из подпроцесса python

    Как захватить Shift + PrintScreen с pyHook?

    Как я могу конвертировать временные интервалы окон в таймшоны, которые понимает pytz?

    Получите наименьшие значения N из массива numpy, игнорируя inf и nan

    Как использовать ртутный (Hg) в приложении Python?

    Python - лучший язык программирования в мире.