Сбой 6 ГБ ОЗУ при векторизации текста с использованием Word2Vec

#python #machine-learning #bigdata #sentiment-analysis

#python #машинное обучение #bigdata #анализ настроений

Вопрос:

Я пытаюсь выполнить один базовый анализ настроений твитов с использованием word2vec и tfidf-score для набора данных, состоящего из 1,6 млн твитов, но мой 6 ГБ Gforce-Nvidia не может этого сделать. поскольку это мой первый практический проект, связанный с машинным обучением, мне интересно, что я делаю не так, потому что набор данных — это весь текст, который он содержит.не следует занимать столько оперативной памяти, из-за чего мой ноутбук зависает в функции tweet2vec или выдает ошибку памяти в части масштабирования. ниже приведена часть моего кода, в которой все рушится. последнее, что я пробовал с данными до 1 МЛН, и это сработало! итак, мне любопытно, что вызывает проблему

 # --------------- calculating word weight for using later in word2vec model amp; bringing words together ---------------
def word_weight(data):
    vectorizer = TfidfVectorizer(sublinear_tf=True, use_idf=True)
    d = dict()
    for index in tqdm(data, total=len(data), desc='Assigning weight to words'):
        # --------- try except caches the empty indexes ----------
        try:
            matrix = vectorizer.fit_transform([w for w in index])
            tfidf = dict(zip(vectorizer.get_feature_names(), vectorizer.idf_))
            d.update(tfidf)
        except ValueError:
            continue
    print("every word has weight nown"
          "--------------------------------------")
    return d


# ------------------- bringing tokens with weight to recreate tweets ----------------
def tweet2vec(tokens, size, tfidf):
    count = 0
    for index in tqdm(tokens, total=len(tokens), desc='creating sentence vectors'):
        # ---------- size is the dimension of word2vec model (200) ---------------
        vec = np.zeros(size)
        for word in index:
            try:
                vec  = model[word] * tfidf[word]
            except KeyError:
                continue
        tokens[count] = vec.tolist()
        count  = 1
    print("tweet vectors are ready for scaling for ML algorithmn"
          "-------------------------------------------------")
    return tokens


dataset = read_dataset('training.csv', ['target', 't_id', 'created_at', 'query', 'user', 'text'])
dataset = delete_unwanted_col(dataset, ['t_id', 'created_at', 'query', 'user'])
dataset_token = [pre_process(t) for t in tqdm(map(lambda t: t, dataset['text']),
                                              desc='cleaning text', total=len(dataset['text']))]

print('pre_process completed, list of tweet tokens is returnedn'
      '--------------------------------------------------------')
X = np.array(tweet2vec(dataset_token, 200, word_weight(dataset_token)))
print('scaling vectors ...')
X_scaled = scale(X)
print('features scaled!')
  

данные, переданные функции word_weight, представляют собой список в форме (1599999, 200), каждый индекс которого состоит из предварительно обработанных токенов tweet.
Я ценю ваше время и заранее отвечаю и, конечно, рад услышать лучшие подходы для обработки больших наборов данных

Ответ №1:

Если я правильно понял, он работает с 1 млн твитов, но не работает с 1,6 млн твитов? Итак, вы знаете, что код правильный.

Если графическому процессору не хватает памяти, когда вы считаете, что этого не должно быть, это может быть связано с предыдущим процессом. Используется nvidia-smi для проверки того, какие процессы используют графический процессор и сколько памяти. Если (перед запуском кода) вы обнаружите, что процессы python содержат большой фрагмент, это может быть сбой процесса или окно Jupyter все еще открыто и т. Д.

Я считаю полезным watch nvidia-smi (не уверен, есть ли эквивалент Windows) посмотреть, как изменяется память графического процессора по мере прохождения обучения. Обычно фрагмент резервируется в начале, а затем он остается довольно постоянным. Если вы видите, что он растет линейно, что-то может быть не так с кодом (вы перезагружаете модель на каждой итерации, что-то в этом роде?).

Комментарии:

1. дело в том, что я освобождаю память настолько, насколько могу, а используемая оперативная память составляет около 2 ГБ перед запуском кода, но когда мой код достигает функции tweet2vec, мой ноутбук абсолютно бесполезен, и вы ничего не можете с ним поделать. Я пробовал с другим ноутбуком с 8 ГБ ОЗУ, и он вернул ошибку памяти при масштабировании части. точный объем данных до зависания моего ноутбука равен (1373567). что касается кода, я понятия не имею, что с ним может быть не так, поскольку он работает с меньшими данными!!!

2. я должен исправить свой комментарий, все в порядке до 1373567-го данные (в функции tweet2vec), и у данных не должно быть проблем, потому что они перемешиваются при каждом запуске кода, а что касается модели, если вы имеете в виду атрибут, я должен сказать «нет», потому что модель просто дает векторы для данного слова

Ответ №2:

моя проблема была решена, когда я изменил код (функцию tweet2vec) на этот (w — вес слова)

 def tweet2vec(tokens, size, tfidf):
    # ------------- size is the dimension of word2vec model (200) ---------------
    vec = np.zeros(size).reshape(1, size)
    count = 0
    for word in tokens:
        try:
            vec  = model[word] * tfidf[word]
            count  = 1
        except KeyError:
            continue
    if count != 0:
        vec /= count
    return vec

X = np.concatenate([tweet2vec(token, 200, w) for token in tqdm(map(lambda token: token, dataset_token),
                                                               desc='creating tweet vectors',
                                                               total=len(dataset_token))]
  

)

Я понятия не имею, почему!!!!