2015-04-12 5 views
2

Я погрузочные предварительно подготовленные векторы из двоичного файла, созданный из кода word2vec C-то вроде:Gensim word2vec увеличить или объединить предварительно подготовленные векторы

model_1 = Word2Vec.load_word2vec_format('vectors.bin', binary=True) 

Я использую эти векторы для создания векторных представлений предложения, содержащие слова, которые могут не иметь уже существующих векторов в vectors.bin. Например, если vectors.bin не имеет связанного вектора для слова «йогурт», и я стараюсь

yogurt_vector = model_1['yogurt'] 

я KeyError: 'yogurt', что делает здравый смысл. Я хочу, чтобы иметь возможность принимать слова предложения, которые не имеют соответствующих векторов, и добавлять представления для них в model_1. Я знаю от this post, что вы не можете продолжать тренировать векторы С. Есть ли способ обучить новую модель, скажем model_2, для слов без векторов и слияния model_2 с model_1?

В качестве альтернативы, есть ли способ проверить, содержит ли модель слово, прежде чем я на самом деле попытаюсь его восстановить, чтобы я мог хотя бы избежать KeyError?

ответ

4

Как избежать ошибок клавишных легко:

[x for x in 'this model hus everything'.split() if x in model_1.vocab] 

Чем сложнее проблемы слияния нового слова в существующей модель. Проблема в том, что word2vec вычисляет вероятность того, что 2 слова находятся рядом друг с другом, и если слово «йогурт» не было в первом теле, которое было обучено модели, оно не рядом с каким-либо из этих слов, поэтому вторая модель не будет коррелировать с первым.

Вы можете посмотреть на внутренности, когда модель сохранена (использует numpy.save), и мне было бы интересно работать с вами, чтобы придумать код, чтобы добавить словарь.

+0

Это хороший момент, для большинства приложений функция слияния была бы бесполезна, поскольку новые добавленные векторы не имели бы структурированного отношения к любому из слов в исходной модели. В моем случае мне просто нужно было представить какое-то представление для новых слов; Я закончил тем, что просто игнорировал слова без представления в оригинальной модели. – aconkey

0

Это отличный вопрос, и, к сожалению, нет возможности добавить к лексике без изменения внутренних компонентов кода. Проверьте это обсуждение: https://groups.google.com/forum/#!searchin/word2vec-toolkit/online $ 20word2vec/word2vec-инструментарий/L9zoczopPUQ/_Zmy57TzxUQJ

Мой совет должен игнорировать слова, которые не в словаре, и использовать только те, которые находятся в словаре. Если вы используете Python, вы можете сделать это:

for word in wordlist: 
    if word in model.vocab: 
     present.append(word) 
    else: 
     # this is all the words that are absent for your model 
     # might be useful for debugging. Ignore if you dont need this info 
     absent.append(word) 

<Do whatever you want with the words in the list 'present'>  
0

возможной альтернативой для обработки отсутствующих/отсутствующие слов подсказываются YoonKim в «сверточной нейронных сетях для Предложения классификации»

Его код: https://github.com/yoonkim/CNN_sentence/blob/master/process_data.py#L88

def add_unknown_words(word_vecs, vocab, min_df=1, k=300): 
    """ 
    For words that occur in at least min_df documents, create a separate word vector.  
    0.25 is chosen so the unknown vectors have (approximately) same variance as pre-trained ones 
    """ 
    for word in vocab: 
     if word not in word_vecs and vocab[word] >= min_df: 
      word_vecs[word] = np.random.uniform(-0.25,0.25,k) 

Но это работает bcoz, вы используете модель для поиска соответствующих векторов. Функциональность, подобная сходству и т. Д., Теряется

Смежные вопросы