Я хочу обучить еще 4 модели Word2ve c и усреднить полученные матрицы встраивания - PullRequest
0 голосов
/ 29 мая 2020

Я написал приведенный ниже код. Я использовал Used spacy, чтобы ограничить слова в твитах содержательными словами, то есть существительными, глаголами и прилагательными. Преобразуйте слова в нижний регистр и добавьте POS с подчеркиванием. Например:

love_VERB old fashioneds_NOUN

теперь я хочу обучить еще 4 модели Word2ve c и усреднить полученные матрицы встраивания. но я понятия не имею, не могли бы вы мне помочь?

# Tokenization of each document
from gensim.models.word2vec import FAST_VERSION
from gensim.models import Word2Vec
import spacy
import pandas as pd
from zipfile import ZipFile
import wget

url = 'https://raw.githubusercontent.com/dirkhovy/NLPclass/master/data/reviews.full.tsv.zip'
wget.download(url, 'reviews.full.tsv.zip')

with ZipFile('reviews.full.tsv.zip', 'r') as zf:
    zf.extractall()

# nrows , max amount of rows
df = pd.read_csv('reviews.full.tsv', sep='\t', nrows=100000)
documents = df.text.values.tolist()

nlp = spacy.load('en_core_web_sm')  # you can use other methods
# excluded tags
included_tags = {"NOUN", "VERB", "ADJ"}


vocab = [s for s in new_sentences]

sentences = documents[:103]  # first 10 sentences
new_sentences = []
for sentence in sentences:
    new_sentence = []
    for token in nlp(sentence):
        if token.pos_ in included_tags:
            new_sentence.append(token.text.lower()+'_'+token.pos_)
    new_sentences.append(new_sentence)


# initialize model
w2v_model = Word2Vec(
                     size=100,
                     window=15,
                     sample=0.0001,
                     iter=200,
                     negative=5,
                     min_count=1,  # <-- it seems your min_count was too high
                     workers=-1,
                     hs=0
                     )


new_sentences


w2v_model.build_vocab(vocab)

w2v_model.train(vocab, 
                total_examples=w2v_model.corpus_count, 
                epochs=w2v_model.epochs)
w2v_model.wv['car_NOUN']

1 Ответ

1 голос
/ 29 мая 2020

Нет причин усреднять вместе векторы из нескольких прогонов обучения; это скорее уничтожит ценность отдельных прогонов, чем принесет какую-либо пользу.

Ни один прогон не создает «правильных» конечных позиций, и не все они приближаются к некоторым идеализированным позициям. Скорее, каждый просто создает набор векторов, который внутренне сопоставим с другими в том же совместно обученном наборе. Сравнение или комбинации с векторами из других, не чередующихся обучающих прогонов обычно будут бессмысленными.

Вместо этого стремитесь к одному адекватному пробегу. Если векторы много перемещаются при повторных запусках, это нормально. Но каждая реконфигурация должна быть примерно такой же полезной, если она используется для дословных сравнений или анализа окрестностей / направлений слов или в качестве входных данных для последующих алгоритмов. Если их полезность сильно различается, вероятно, существуют другие несоответствия в данных или параметрах модели. (Например: слишком мало данных - word2ve c требует много для получения значимых результатов - или модель, которая слишком велика для данных, что делает ее склонной к переобучению.)

Другие наблюдения о вашей настройке:

  • Всего 103 предложения / текста - это мало для word2vec; не следует ожидать, что векторы из такого прогона будут иметь какое-либо значение, которое обычно предоставляет алгоритм. (Запуск такого крошечного набора данных может быть полезен для проверки отсутствия ошибок остановки в процессе или для ознакомления с шагами / API, но результаты ничего вам не скажут.)

  • min_count=1 почти всегда плохая идея в word2ve c и подобных алгоритмах. Слова, которые появляются только один раз (или несколько раз), не имеют разнообразия тонко-разных применений, которые необходимы для тренировки его в уравновешенной позиции по отношению к другим словам - поэтому они заканчиваются слабыми / странными конечными позициями и явным количество таких слов снижает эффективность обучения другим, более частым словам. Обычная практика отказа от редких слов обычно дает лучшие результаты.

  • iter=200 - крайний вариант, который обычно полезен только для того, чтобы попытаться выжать результаты из неадекватных данных. (В таком случае вам, возможно, также придется уменьшить вектор- size с обычных 100-с лишним измерений.) Поэтому, если вам кажется, что это нужно, получение большего количества данных должно быть главным приоритетом. (Использование в 20 раз большего количества данных намного лучше, чем использование в 20 раз большего количества итераций для небольших данных, но требует того же времени на обучение.)

...