Можно ли повторно обучить модель word2vec (например, GoogleNews-vectors-negative300.bin) из корпуса предложений на Python?

Я использую предварительно обученный набор данных новостей Google для получения векторов слов с помощью библиотеки Gensim в python.

model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

После загрузки модели я конвертирую слова предложений обучающих обзоров в векторы

#reading all sentences from training file
with open('restaurantSentences', 'r') as infile:
x_train = infile.readlines()
#cleaning sentences
x_train = [review_to_wordlist(review,remove_stopwords=True) for review in x_train]
train_vecs = np.concatenate([buildWordVector(z, n_dim) for z in x_train])

В процессе word2Vec я получаю много ошибок для слов в моем корпусе, которых нет в модели. Проблема в том, как я могу переобучить уже предварительно обученную модель (например, GoogleNews-vectors-negative300.bin '), чтобы получить векторы слов для этих пропущенных слов.

Вот что я пробовал: Обучил новую модель на основе тренировочных предложений, которые у меня были.

# Set values for various parameters
num_features = 300    # Word vector dimensionality                      
min_word_count = 10   # Minimum word count                        
num_workers = 4       # Number of threads to run in parallel
context = 10          # Context window    size                                                                                    
downsampling = 1e-3   # Downsample setting for frequent words

sentences = gensim.models.word2vec.LineSentence("restaurantSentences")
# Initialize and train the model (this will take some time)
print "Training model..."
model = gensim.models.Word2Vec(sentences, workers=num_workers,size=num_features, min_count = min_word_count, 
                      window = context, sample = downsampling)


model.build_vocab(sentences)
model.train(sentences)
model.n_similarity(["food"], ["rice"])

Это сработало! но проблема в том, что у меня действительно небольшой набор данных и меньше ресурсов для обучения большой модели.

Второй способ, который я рассматриваю, - это расширить уже обученную модель, такую ​​как GoogleNews-vectors-negative300.bin.

model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
sentences = gensim.models.word2vec.LineSentence("restaurantSentences")
model.train(sentences)

Возможно ли это, и это хороший способ использования, пожалуйста, помогите мне


person Nomiluks    schedule 31.01.2016    source источник
comment
Возможный дубликат Обновить модель gensim word2vec   -  person Kamil Sindi    schedule 02.12.2016


Ответы (3)


Вот как я технически решил проблему:

Подготовка ввода данных с итеративным предложением от Radim Rehurek: https://rare-technologies.com/word2vec-tutorial/

sentences = MySentences('newcorpus')  

Настройка модели

model = gensim.models.Word2Vec(sentences)

Пересечение словаря с векторами слов Google

model.intersect_word2vec_format('GoogleNews-vectors-negative300.bin',
                                lockf=1.0,
                                binary=True)

Наконец, выполнение модели и обновление

model.train(sentences)

Предупреждение: с точки зрения существа, конечно, очень спорно, может ли корпус, который может быть очень маленьким, на самом деле "улучшить" векторы слов Google, обученные на массивном корпусе ...

person Chris Arnold    schedule 24.10.2016
comment
Ваш комментарий предполагает, что этот метод предназначен для улучшения векторов слов Google. В документации предполагается, что для улучшения вашей модели используются векторы Google, а не другие наоборот. (К существующему словарю слова не добавляются, но пересекающиеся слова принимают веса файла, а непересекающиеся слова остаются без изменений.) Я попробовал ваш метод и проверил размер корпуса моей модели. Он отражал новые данные обучения, а не Новости Google. - person lgallen; 10.05.2017
comment
Вы правы - возможно, термин улучшить здесь вводит в заблуждение. Код обновляет слова из нового корпуса и возвращает их вам. - person Chris Arnold; 11.05.2017
comment
Размер (словарь) векторов слов Google составляет около 3 000 000 слов, поэтому, если ваш корпус будет иметь гораздо меньший размер, например, около 10 000 слов, при пересечении, размер вашей модели будет по-прежнему составлять только 10 000, но слова в вашей модели будут напрямую присвоены веса из вектора слов Google, полностью игнорируя предыдущие веса из вашей исходной модели. Так что это не будет иметь никакого значения до тех пор, пока у вас тоже не будет очень большого корпуса для тренировок. - person Pranzell; 18.03.2019
comment
Я пробовал это: model.intersect_word2vec_format ('tweets_cbow_300', lockf = 1.0, binary = False, encoding = 'utf8') Он возвращает ошибку: UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0x80 в позиции 0: неверный начальный байт. Добавление этого: unicode_errors = 'ignore' не решает проблему. - person user3057109; 08.03.2020

Некоторые люди работают над расширением gensim, чтобы сделать возможным онлайн-обучение.

Пара запросов на вытягивание GitHub, за которыми вы, возможно, захотите следить, чтобы узнать, как продвигается эта работа:

Похоже, это улучшение может позволить обновить модель GoogleNews-vectors-negative300.bin.

person orluke    schedule 31.03.2016
comment
это отличные новости, .... я бы хотел пройти онлайн-обучение и просто жду этого :) - person Nomiluks; 31.03.2016

это возможно, если построитель модели не завершил обучение модели. в питоне это:

model.sims(replace=True) #finalize the model

Если модель не доработана, это идеальный способ получить модель с большим набором данных.

person Majid    schedule 15.08.2016