#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))]
)
Я понятия не имею, почему!!!!