Введение

В прошлом году (2016) мы работали над обучением классификатора эмоций, который интегрировали в Курьер. Первоначально этот классификатор был обучен с использованием алгоритма машины опорных векторов (SVM), представленного в scikit-learn. С тех пор этот классификатор развивался и обучался с использованием архитектуры глубокого обучения, которую мы собрали с помощью фантастической комбинации Keras + Tensorflow. Для подробного обсуждения нашего классификатора эмоций вы можете прочитать мой предыдущий пост под названием Learning Emotions from Reddit.

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

Итак, после обучения, тестирования и доработки этого классификатора мы решили немного поиграться с ним и изучить частотное распределение эмоций во всей версии Reddit corpus, которую мы скачали примерно 3 июля 2015 года. дата загрузки, потому что в последующие дни было выпущено несколько более крупных версий, пока не была опубликована окончательная версия корпуса, которая содержит около 1,7 миллиарда комментариев Reddit и весит в сжатом виде 250 ГБ. Наша версия этого корпуса содержит около 54 миллионов комментариев и весит в сжатом виде 5,1 ГБ.

Итак, давайте изучим этот корпус!

Этапы предварительной обработки

Предварительная обработка корпуса Reddit проходила в несколько модульных этапов. Первый этап включал извлечение комментариев из объектов JSON, в которые они были инкапсулированы, вместе с некоторыми метаданными для их контекстуализации.

Извлеченные комментарии впоследствии обрабатывались с помощью модуля разметки Python для преобразования их в HTML и BeautifulSoup для преобразования в простой текст.

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

Сигналы метаданных, извлеченные вместе с комментариями Reddit, были: «subreddit_name», «subreddit_id», «created_utc», «retrieved_on», «author», «parent_id», «ups,« down »и« controversiality ».

На втором этапе предварительной обработки мы дополнительно проанализировали извлеченные комментарии, используя дополнительные методы НЛП. В частности, на этом этапе основное внимание уделялось лемматизации и POS-тегированию извлеченных комментариев с использованием порта Python алгоритма POS-тегирования Volsunga (DeRose: 1988).

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

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

Изучение эмоций. Что за…?

После того, как все этапы предварительной обработки были применены к нашему корпусу Reddit, нам пора было начать изучать, как распределяется частота эмоций. Для этого мы провели несколько экспериментов с использованием сигнала created_utc для построения графика эмоций в течение долгого времени с помощью модуля Python matplotlib.

Мы построили все эмоции на одном графике, используя их временную метку created_utc, которую мы сгладили с помощью алгоритма экспоненциального скользящего среднего с N = 23.

Затем мы построили график отдельных эмоций, используя те же временные метки created_utc и одно и то же значение сглаживания, N = 23. Ниже мы показываем графики только для Disgust и Surprise.

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

Мы начали анализировать код, который мы собрали для создания графиков. Все выглядело нормально ...

Затем мы преобразовали все временные метки в обычные даты и распечатали минимальное и максимальное значения, которые у нас были.

Минимальная дата: «2015–01–01»

Максимальная дата: «2015–01–31»

Теперь все начало обретать смысл. Оказалось, поскольку мы не проверяли это раньше 😅🔫, версия корпуса Reddit, которую мы загрузили, содержала данные только за январь 2015 года. Таким образом, мы изучали эмоции во времени только в течение одного месяца.

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

Ага!! Поскольку эти графики ясно показывают, что пики эмоций достигаются вечером и поздно ночью, а спады соответствуют более раннему времени дня. Так что это значит?

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

И, во-вторых, как ясно показывают однодневные графики, минимальные значения взаимодействия с пользователем совпадают с ранними утренними часами дня (возможно, когда большинство людей делают свои дела на работе?), А пики совпадают с более поздними часами дня - вечерами и ночами - ( скорее всего после работы, когда люди вернутся домой?).

Чтобы дополнительно проанализировать взаимодействие пользователя с Reddit, мы решили построить график эмоций, преобразовав все временные метки в даты и сгруппировав их по дате, чтобы увидеть, как выглядят эти шаблоны. Мы также сгладили эти графики, используя тот же алгоритм экспоненциальной скользящей средней, но на этот раз с N = 2. Ниже мы показываем графики только для радости и печали.

Опять возникли волнообразные узоры! Итак, давайте посмотрим на календарь на январь 2015 года, чтобы увидеть, как эти закономерности совпадают.

Оказывается, люди не так часто взаимодействуют с Reddit в выходные дни (см., Например, Valley для 10 и 11 января, субботу и воскресенье; и Valley для 17 и 18 января, снова в субботу и воскресенье). Пики отображаются в будние дни, а максимальные - в середине недели.

Вывод

Наш главный вывод: людям действительно нужно знать свои данные. Отсутствие проверки диапазона дат, с которым мы работали для нашей версии корпуса Reddit, заставило нас поверить в то, что мы делаем что-то не так.

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

Весело, правда?

использованная литература

ДеРоуз, С. Дж. (1988). Устранение неоднозначности грамматических категорий с помощью статистической оптимизации. Компьютерная лингвистика, 14, 31–39.