Подготовьте данные для проекта «Анализ настроений».

вступление

Анализ настроений — это простой способ понять, как работает машинное обучение. Представьте, что у вас есть предложение «Большое спасибо за помощь», для вас это заведомо положительное предложение, а для машины все не так просто. Вот почему мы должны использовать архитектуры нейронных сетей.

Вы можете найти много информации об этом в других статьях на этом носителе. Типа здесь или здесь. Не хочу повторять одну и ту же фразу из каждой статьи. Вместо этого я хотел бы сосредоточиться на более технической стороне.

Немного технической речи — правильно используйте свое оборудование

Прежде чем мы даже начнем, мы должны сказать одну вещь. Ключ в науке о данных — правильное использование всех инструментов. Это означает, что если у вас есть ЦП с более чем 1ядром, используйте это преимущество. Обратите внимание, что использование большего количества ядер быстро увеличивает скорость работы программы. Конечно, мы должны обращаться с этим осторожно. Больше ядер означает, что требуется больше оперативной памяти. Это еще один ключ в нашем мире — оптимизация.

К сожалению, нет хорошего совета, как это сделать. Метод проб и ошибок ждет нас, но я здесь, чтобы помочь вам принять более взвешенное решение.

Стоит ли использовать многоядерность?

Ну, в нашем проекте мы используем огромный набор данных для обучения, это более 120 ГБ данных. Это значение будет уменьшено, потому что мы удалим ненужные данные, но все равно это огромно. Вот почему мы должны рассматривать многопроцессорность.

Представьте, что у вас есть набор данных для обработки. Можно просто запустить скрипт и дождаться его завершения, а можно реализовать многопроцессорность и использовать преимущества своего процессора. У вас 8-ядерный процессор? Отлично используйте все 8 ядер, скрипт будет выполняться намного быстрее. Разве это не очевидно?

В моей цели я буду использовать 5 ядер. Просто потому, что у меня 6-ядерный процессор, и это был бы самый быстрый вариант.

Библиотеки и настройка

Давайте поговорим об окружающей среде, с которой нужно работать. Я использую Python 3.8 с новейшей библиотекой pandas и некоторыми встроенными библиотеками.

Загрузите файл (просмотрите набор данных) и разархивируйте

Давайте начнем. Во-первых, мы должны загрузить набор данных. Я нашел отличный файл с огромным количеством данных, как я посчитал, это было около 230 миллионов строк. Скачать его можно отсюда: [ссылка для скачивания данных]. В нашем проекте мы будем использовать сырые данные отзывов (34 ГБ) — все 233,1 млн отзывов.

Чтобы разархивировать этот файл, я использовал внешнее программное обеспечение. На мой взгляд, не стоит писать скрипт для распаковки одного файла.

Разделение данных

Поскольку у нас есть заархивированный файл, убедитесь, что у вас достаточно места на диске для хранения разархивированного файла, потому что этот файл весит примерно 120 ГБ.

Давайте попробуем открыть это.

У нас здесь «MemoryError», этот файл слишком велик, чтобы сразу его обработать. Существует несколько возможностей работы с набором данных. Я решил упростить этот случай, и я использовал чистый код Python без каких-либо причудливых библиотек, у меня это сработало просто отлично. Как мы можем определить размер файлов? Один из самых простых способов — сохранить файл по количеству строк.

Звучит здорово, не так ли? Мы можем обработать его в памяти, обработать, сохранить и взять другой файл. Однако помните ли вы, что мы говорили о многопроцессорности? Гораздо быстрее использовать 5 ядер, точнее почти на 70% быстрее!

В чем проблема? Представьте, что вы работаете с такими файлами размером 2 ГБ и хотите открыть шесть из них. Это почти 12 ГБ оперативной памяти. Если у вас достаточно оперативной памяти, чтобы сделать это, продолжайте. К сожалению, в моем случае у меня всего 16 ГБ оперативной памяти. Вот почему я решил оперировать 1,2 миллиона строк. Это позволяет мне защититься на данный момент от любых непредвиденных ошибок.

Каждый файл в выходных данных весит около 0,6 ГБ, что в моем случае достаточно для его обработки в ОЗУ. Если у вас есть проблемы с этим, пожалуйста, уменьшите переменную в соответствии с вашими потребностями. Если вам нужно больше места на диске, вы можете пойти прямо и удалить этот один большой файл.

Выходной файл выглядит следующим образом:

Преобразование данных

Вы помните, что я говорил об использовании ядер? Здесь у нас есть идеальная цель, чтобы проверить это. Как мы видим, в этом коде я добавил несколько строк, отвечающих за многопроцессорность.

Однако, прежде чем мы будем использовать многопроцессорную обработку, мы должны поговорить о том, как строится функция.

Следующий шаг, который нам нужно сделать, это преобразовать этот набор данных прямо во фрейм данных. Это почему? С фреймом данных работать намного проще.

Хорошо, теперь вы можете открыть файл, и мы можем начать обработку. Если мы посмотрим на данные, то увидим, что там много строк с форматом .json. Итак, распаковываем эти данные в формат thedictionary на python. После этого мы можем создать наш фрейм данных из ранее созданной переменной.

Фильтрация данных

Все эти данные содержат много беспорядка и ненужных столбцов. В нашем случае мы сосредоточены только на партитуре и тексте. Остальные данные мы можем удалить из файлов. Это даст нам больше места на диске. Я буду использовать функцию фильтра от панд, чтобы сделать это.

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

Кроме того, в этот момент мы можем объявить максимальную длину предложений. Нейронная сеть имеет некоторые ограничения, например размер статического входного слоя. Вот почему я решил установить для входного слоя значение 100. Это позволяет нам удалять все предложения, содержащие более 100 слов в предложении. Если вы не все понимаете, это нормально. В следующих статьях я расскажу больше об этой теме. Здесь мы сосредоточимся на очистке данных для анализа настроений.

Однако перед отрезком длины мы можем использовать регулярное выражение для удаления ненужных данных в предложениях. Это довольно сложно, но для упрощения мы можем представить, что нам не нужны URL, хэштеги и т. д. в наших предложениях. Если мы удалим весь этот беспорядок из предложения, мы сможем уменьшить количество слов в каждом предложении, и благодаря этому мы сможем получить больше данных.

Разделение данных

Теперь мы можем заменить значения в столбце настроений, почему? Потому что в нашей цели мы должны отделить положительные значения от отрицательных. Для этого мы можем предположить, что значения выше 3 являются положительными, а ниже 3 — отрицательными. Кроме того, мы должны отбросить сумму, равную 3, потому что мы не проверяем предложения на нейтральный тип.

После запуска этого скрипта нам нужно немного подождать, пока программа закончит свою работу. Что мы можем наблюдать после завершения сценария, так это уменьшение использования хранилища. Из почти 120 ГБ данных у нас получилось 26 ГБ. Вы видите, сколько данных было бесполезно? Это безумно.

Здесь у вас есть код для этого шага

Удаление дубликатов данных

Пока мы идем, может показаться, что мы закончили, но не совсем так. Вы спросите, почему? А вы уверены, что между файлами нет повторяющихся строк? Просто чтобы убедиться, давайте проверим это.

Мы сосредоточимся на методе, который лучше всего работает для меня. Мы можем перебирать каждый файл и проверять повторяющиеся строки в предыдущем файле. На данный момент мы не можем использовать многопроцессорность, потому что это может вызвать проблемы с вводом-выводом для файлов. Что это значит для нас? Поскольку мы не используем многопроцессорность, нам не нужны эти маленькие файлы. Мы можем пойти дальше и увеличить размер файла, насколько большие файлы вы будете использовать, зависит от того, сколько у вас оперативной памяти. В моем случае я хочу работать с полным объемом оперативной памяти. Методом проб и ошибок я пришел к выводу, что лучше всего установить выходной файл в 8 миллионов строк. Важным моментом здесь является сохранение файлов как можно большего размера. Вы можете спросить, почему? Ввод/вывод файлов занял много времени, и в некоторых ситуациях скрипт может длиться 5 дней. В данном случае это слишком долго, и мы должны найти лучший способ. Я решил увеличить размер файла, чтобы уменьшить количество операций ввода-вывода. После реализации скрипт будет готов через 4 часа. Это в 30 раз быстрее.

Кроме того, мы будем отделять положительные файлы от отрицательных, потому что это облегчит дальнейшие действия.

После завершения этого шага у нас есть несколько больших файлов. Для этого я создал класс, который выполняет эту задачу за нас.

Здесь вы видите пример функции объявления для изменения размера файлов.

input_file_name - declaration of input files name: 'file_{}',
output_file_name - declaration of output files name: 'file_o_{}',
max_length_of_single_output - maximum length of single file,
max_amount_output_of_files - maximum files in output,
total_length_of_output - maximum sum of length of all files,
auto_file_remover - automatically remove files after read them,
auto_detect_files_in_dir - automatically detect files in directory,
files_in_folder - if auto_detect_files_in_dir is True, this is optional

Разделение файлов

Что касается нас, у нас на самом деле есть хорошие разделенные данные, но в нейронных сетях мы также должны сохранять данные как можно более высокого качества. Это означает, что мы должны стандартизировать наборы данных. Вот почему мы должны смотреть на длину отрицательных и положительных наборов данных. Мы хотим сохранить их, возможно, одного размера. Если мы посмотрим на данные, мы можем легко проверить, какие данные больше. Очевидно, что положительных гораздо больше. В этом случае мы должны подготовить отрицательный набор данных и подсчитать их, после этого мы можем объявить функцию re_sizer из класса ReSizerFiles для подготовки аналогичного набора данных из положительных файлов.

Вот несколько функций для подсчета размера и количества файлов.

Наконец, мы можем объявить положительное изменение размера файла.

Вывод

Анализ настроений является огромным моментом в наше время. Сейчас это оказывает на нас большое влияние, а в будущем оно еще больше возрастет. Нельзя забывать, что частью построения нейронных сетей является подготовка данных. В реальном мире никогда не бывает так красиво получать чистые, подготовленные и ценные данные. Наша работа состоит в том, чтобы проверить всю информацию, которую мы получили, и препроцессировать ее.

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

Буду признателен, если вы оставите здесь свой отзыв. Пожалуйста, обратите внимание, что это не последняя часть этой серии статей. В следующей части статьи мы займемся векторизацией. Я надеюсь, что вы узнаете здесь больше информации об обработке данных. Большое спасибо, что прочитали это. Надеюсь, скоро увидимся :)

Мой сайт [клик]
Этот проект на github [клик]