Улучшение базовой, существующей модели GloVe
Я использую GloVe как часть моего исследования. Я скачал модели отсюда. Я использовал GloVe для классификации предложений. Предложения, которые я классифицирую, относятся к определенной области, скажем, к какой-то теме STEM. Однако, поскольку существующие модели GloVe обучаются в общем корпусе, они могут не дать наилучших результатов для моей конкретной задачи.
Итак, мой вопрос: как бы мне загрузить загрузочную модель и просто немного переобучить ее в моем собственном корпусе, чтобы также изучить семантику моего корпуса? Это было бы полезно, если бы это было возможно.
1 ответ
Немного покопавшись, я обнаружил эту проблему в git-репо. Кто-то предложил следующее:
Да, это не будет хорошо работать из-за настройки оптимизации. Но вы можете обучить векторы GloVe в своем собственном корпусе, а затем объединить их с предварительно подготовленными векторами GloVe для использования в вашем конечном приложении.
Так что это отвечает.
Я полагаю, что GloVe (глобальные векторы) не предназначен для добавления, поскольку он основан на общей статистике совпадений слов в корпусе из одного корпуса, известного только в начальное время обучения
Вы можете сделать, это использовать gensim.scripts.glove2word2vec
API для преобразования векторов GloVe в word2vec, но я не думаю, что вы можете продолжить обучение, так как его загрузка в KeyedVector не является полной моделью
Библиотека Mittens (устанавливается через pip) делает это, если ваш корпус / словарь не слишком велик или ваша оперативная память достаточно велика, чтобы обрабатывать всю матрицу совместной встречаемости.
3 шага
import csv
import numpy as np
from collections import Counter
from nltk.corpus import brown
from mittens import GloVe, Mittens
from sklearn.feature_extraction import stop_words
from sklearn.feature_extraction.text import CountVectorizer
1- Загрузить предварительно обученную модель - Mittens нуждается в предварительно обученной модели для загрузки в качестве словаря. Получите предварительно обученную модель по https://nlp.stanford.edu/projects/glove.
with open("glove.6B.100d.txt", encoding='utf-8') as f:
reader = csv.reader(f, delimiter=' ',quoting=csv.QUOTE_NONE)
embed = {line[0]: np.array(list(map(float, line[1:])))
for line in reader}
Предварительная обработка данных
sw = list(stop_words.ENGLISH_STOP_WORDS)
brown_data = brown.words()[:200000]
brown_nonstop = [token.lower() for token in brown_data if (token.lower() not in sw)]
oov = [token for token in brown_nonstop if token not in pre_glove.keys()]
Использование коричневого корпуса в качестве образца набора данных здесь и
new_vocab
представляет собой словарь, которого нет в предварительно натренированной перчатке. Матрица совместной встречаемости строится из new_vocab. Это разреженная матрица, требующая пространственной сложности O(n^2). При желании вы можете отфильтровать редкие слова new_vocab для экономии места
new_vocab_rare = [k for (k,v) in Counter(new_vocab).items() if v<=1]
corp_vocab = list(set(new_vocab) - set(new_vocab_rare))
удалите эти редкие слова и подготовьте набор данных
brown_tokens = [token for token in brown_nonstop if token not in new_vocab_rare]
brown_doc = [' '.join(brown_tokens)]
corp_vocab = list(set(new_vocab))
2- Построение матрицы совместной встречаемости:
sklearn's
CountVectorizer
преобразует документ в матрицу word-doc. Матричное умножение
Xt*X
дает матрицу совпадения слов и слов.
cv = CountVectorizer(ngram_range=(1,1), vocabulary=corp_vocab)
X = cv.fit_transform(brown_doc)
Xc = (X.T * X)
Xc.setdiag(0)
coocc_ar = Xc.toarray()
3- Точная настройка модели варежек - Создайте экземпляр модели и запустите функцию подгонки.
mittens_model = Mittens(n=50, max_iter=1000)
new_embeddings = mittens_model.fit(
coocc_ar,
vocab=corp_vocab,
initial_embedding_dict= pre_glove)
Сохраните модель как рассол для дальнейшего использования.
newglove = dict(zip(corp_vocab, new_embeddings))
f = open("repo_glove.pkl","wb")
pickle.dump(newglove, f)
f.close()