Gensim Word2Vec выбирает второстепенный набор векторов слов из предварительно обученной модели

1

У меня есть большая предварительная модель Word2Vec в gensim, из которой я хочу использовать предварительно обработанные словарные векторы для слоя внедрения в моей модели Keras.

Проблема в том, что размер вложения огромен, и мне не нужна большая часть векторов слов (потому что я знаю, какие слова могут быть введены как Input). Поэтому я хочу избавиться от них, чтобы уменьшить размер моего слоя внедрения.

Есть ли способ просто сохранить желаемые текстовые элементы (включая соответствующие индексы!), Основанные на белом списке слов?

Теги:
keras
gensim
word2vec
word-embedding

2 ответа

0

Благодаря этому ответу (я немного изменил код, чтобы сделать его лучше). Вы можете использовать этот код для решения вашей проблемы.

у нас есть все наши незначительные наборы слов в restricted_word_set (это может быть либо список или набор) и w2v наша модели, так что здесь функция:

import numpy as np

def restrict_w2v(w2v, restricted_word_set):
    new_vectors = []
    new_vocab = {}
    new_index2entity = []
    new_vectors_norm = []

    for i in range(len(w2v.vocab)):
        word = w2v.index2entity[i]
        vec = w2v.vectors[i]
        vocab = w2v.vocab[word]
        vec_norm = w2v.vectors_norm[i]
        if word in restricted_word_set:
            vocab.index = len(new_index2entity)
            new_index2entity.append(word)
            new_vocab[word] = vocab
            new_vectors.append(vec)
            new_vectors_norm.append(vec_norm)

    w2v.vocab = new_vocab
    w2v.vectors = np.array(new_vectors)
    w2v.index2entity = np.array(new_index2entity)
    w2v.index2word = np.array(new_index2entity)
    w2v.vectors_norm = np.array(new_vectors_norm)

ВНИМАНИЕ: когда вы впервые создаете модель, vectors_norm == None поэтому вы получите ошибку, если будете использовать эту функцию там. vectors_norm получит значение типа numpy.ndarray после первого использования. поэтому перед использованием функции попробуйте что-то вроде most_similar("cat") чтобы vectors_norm не было равным None.

Он переписывает все переменные, которые относятся к словам на основе Word2VecKeyedVectors.

Использование:

w2v = KeyedVectors.load_word2vec_format("GoogleNews-vectors-negative300.bin.gz", binary=True)
w2v.most_similar("beer")

[("пиво", 0.8409687876701355),
("лагер", 0,7733745574951172),
("Пиво", 0,71753990650177),
("напитки", 0,668931245803833),
("лагеры", 0,6570086479187012),
('Yuengling_Lager', 0.655455470085144),
("микровар", 0,6534324884414673),
('Brooklyn_Lager', 0.6501551866531372),
("suds", 0,6497018337249756),
('brewed_beer', 0.6490240097045898)]

restricted_word_set = {"beer", "wine", "computer", "python", "bash", "lagers"}
restrict_w2v(w2v, restricted_word_set)
w2v.most_similar("beer")

[("лагеры", 0,6570085287094116),
("вино", 0,6217695474624634),
('bash', 0,20583480596542358),
("компьютер", 0.06677375733852386),
('python', 0.005948573350906372)]

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

0

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

  1. Загрузите полные векторы, затем сохраните в формате простого для анализа - например, через .save_word2vec_format(..., binary=False). Этот формат почти не требует пояснений; напишите свой собственный код, чтобы удалить все строки из этого файла, которые не находятся в вашем белом списке (обязательно обновите объявление ведущей строки для ввода-подсчета). Существующий исходный код для load_word2vec_format() и save_word2vec_format() может быть поучительным. Затем у вас будет файл подмножества.

  2. Или, притворись, что собираешься обучить новую модель Word2Vec, используя свой интерес (с интересными словами). Но создайте модель и сделайте шаг build_vocab(). Теперь у вас есть необученная модель со случайными векторами, но это только правильный словарный запас. Возьмите свойство модели wv - экземпляр KeyedVectors с этим правильным словарем. Затем отдельно загрузите негабаритный векторный набор, а для каждого слова в KeyedVectors в правом размере скопируйте фактический вектор из большего набора. Затем сохраните подмножество правого размера.

  3. Или посмотрите на метод (возможно-broken-since-gensim-3.4) в Word2Vec intersect_word2vec_format(). Это более или менее пытается сделать то, что описано в (2) выше: с моделью в памяти, в которой есть словарь, который вы хотите, объединить только перекрывающиеся слова из другого набора word2vec, установленного на диске. Это либо сработает, либо предоставит шаблон для того, что вы хотите сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню