Человеческий мозг обрабатывает изображения в 60 000 раз быстрее, чем текст, и 90% информации, передаваемой в мозг, является визуальной.

Вступление

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

Визуальная информация - это формат, который человеческий мозг обрабатывает быстрее всего [1], поэтому логично, что добавление визуальной информации к контенту, который вы пытаетесь предоставить своим пользователям, поможет привлечь их внимание. В надежде, что добавление этих фрагментов визуальной информации к фрагментам текста может помочь пользователям быстрее сканировать список заголовков и переходить к интересующим их статьям, прежде чем они устанут просматривать, мне было поручено создать генератор эмодзи в Направление моей работы в Snipfeed - платформе, которая обрабатывает тысячи заголовков в день, чтобы доставить их все в одно место, и не может позволить себе редактировать заголовки вручную.

Инструменты

Я использовал набор данных заголовков новостей с золотыми аннотациями (т.е. смайлики, которые были помещены туда людьми, которые загрузили статьи на новостную платформу), и библиотеку смайлов для Python вместе с обычными инструментами для НЛП (NLTK , WordNet) и машинное обучение (SKLearn, PyTorch и некоторые Keras).

Аннотированный набор данных недоступен для загрузки, но я уверен, что, обладая некоторыми навыками утилизации, вы сможете создать его для себя (см. Snipfeed).

Данные - Предварительная обработка

Данные, которые я использовал, содержали 13 027 новостных статей с их аннотированными заголовками (пример ниже) и ссылку (по которой мы можем вырезать текст статьи и многое другое, используя газетную библиотеку для Python).

AI-Powered, Self-Driving Robots Are Taking On a Bigger Role at Walmart Stores 🤖

Я разделил смайлики на две группы (эмоции и темы) и сохранил только те смайлы, которые появлялись не менее 50 раз. Это превращает задачу с несколькими метками + мультиклассами в две задачи с несколькими классами только с одной меткой (мы хотим предсказать только одну эмоцию и один тематический смайлик для каждого заголовка в конце). Порог в 50 появлений гарантирует, что мы получим достаточно значимые данные о типе заголовка, связанного с эмодзи.

Я также создавал кластеры эмодзи вручную. Это означает, что, например, все смайлы, которые представляют веселье (😜 😝 😂 😄 😅 😆), сгруппированы в одну группу. Все заголовки, содержащие один из этих смайлов, теперь будут содержать 😂. Это эквивалентно присвоению заголовку ярлыка "смешно".

В итоге у меня остались следующие смайлы:

Было 3446 заголовков с тематическими смайликами и 2747 заголовков с эмоциями. Как показано на следующих гистограммах, оба набора данных мультикласса несбалансированы (я использовал слова вместо смайликов для меток, потому что некоторые из них вырезаются в зависимости от браузеров, но в любом случае суть здесь только в том, чтобы засвидетельствовать дисбаланс):

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

Базовый подход: мешки слов и полиномиальный наивный байесовский метод

Мешки со словами

Представление «Мешок слов» (BoW) - это разреженное матричное представление, в котором каждый элемент (фрагмент текста / документ) находится в строке, а каждое слово в словаре (все слова, используемые в корпусе) находится в столбце. В подходе, который мы собираемся использовать (TF-IDF = Term Frequency - Inverse Document Frequency), каждая ячейка содержит частоту слова в документе, деленную на частоту слова в корпусе.

Stopwords и Stemming

Удаление игнорируемых слов и определение корней - это часть зала славы профессиональных советов НЛП. Стоп-слова - это все те маленькие слова, которые встречаются повсюду и не имеют смыслового значения (the, and, to, at, because и т. Д.). По сути, они паразиты, и избавление от них только облегчит нашу (модель) работу.

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

Полиномиальный наивный байесовский

Наивные байесовские классификаторы - это вероятностные классификаторы, которые используют условные вероятности (формула Байеса) для измерения вероятности каждого класса для выборки. Их называют наивными, потому что они предполагают, что переменные независимы (то есть вероятность того, что несколько событий происходят одновременно, равна произведению вероятностей того, что каждое из этих событий произойдет само по себе). Термин мультиномиальный происходит от распределения вероятностей, за которым, как предполагает модель, следуют его переменные. Обычный наивный байесовский метод предполагает, что переменные подчиняются гауссовскому распределению. Мультиномиальное распределение - это обобщение биномиального распределения (которое обычно нравится людям, потому что оно очень простое).

Полиномиальные байесовские классификаторы довольно популярны в НЛП, поскольку они хороши для предсказаний по множеству дискретных переменных (что очень хорошо, например, для моделирования слов).

Предварительная обработка и форматирование

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

Все наши документы хранятся в разреженной матрице TF-IDF, и мы используем 2229 образцов для обучения и 500 для тестирования.

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

Полученные результаты

Давайте продолжим и рассмотрим несколько примеров прогнозов, сделанных нашей моделью:

Первая строка - это первые 100 символов статьи. Как видите, библиотека газет не безупречна, и иногда она отбрасывает рекламу или всплывающие окна с просьбой отключить AdBlock… как будто.

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

А иногда они даже превосходят исходные ярлыки, установленные людьми-аннотаторами:

В приведенных выше примерах вы можете видеть, что наша модель «исправила» смайлик-ракету для обуви Nike на смайлик для баскетбола, поскольку статья была сосредоточена вокруг «Сан-Антонио Спёрс» (которые играют в баскетбол, для тех, кого я здесь проиграл). Он заменил смайлики с деньгами на смайлики справедливости для заголовка о том, что Трамп платит некоторым людям за то, чтобы они молчали. Честно говоря, я был очень доволен этим.

Давайте посмотрим на наши прогнозы для набора данных тестирования в цифрах:

Для каждой цели вы можете увидеть количество сделанных прогнозов (что влияет на вашу уверенность в статистике), точность класса и отзыв класса. Нижние строки содержат среднее значение для каждой метрики, а также средневзвешенное значение (вес каждого класса = количество прогнозов, сделанных в этом классе).

Чтобы лучше понять, как выглядят наши прогнозы, мы также можем сгенерировать матрицу путаницы:

Наша диагональ выглядит достаточно четко, и это здорово!

Скрытые векторные представления и рекуррентные нейронные сети

Скрытые векторные представления (Word2Vec против основанных на подсчете)

Еще одно прославленное представление текста - это латентное векторное представление.

Есть два типа векторных представлений:

  • Word2Vec, где векторы вычисляются для улучшения вероятностной генерации слов, окружающих то, на котором вы фокусируетесь (обучено с помощью нейронной сети с прямой связью и оптимизатора - обычно SGD);
  • Подходы на основе подсчета, при которых вы в основном строите матрицу совпадений (смотрите, какие слова часто встречаются вместе или нет) и выполняете уменьшение размерности, чтобы получить из нее векторы.

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

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

Рекуррентные нейронные сети

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

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

Выше показано, как выглядит RNN. h1 - это вектор, который вы инициализируете своим RNN (обычно это просто вектор нулей). Каждый x - это вход (здесь слово, представленное в виде вектора). Входной x1 смешивается с h1, чтобы сформировать h2, который теперь содержит исходную информацию плюс информацию от x1, и это может продолжаться и продолжаться столько, сколько вы хотите (как правило, количество слов в вашем предложении).

Предварительная обработка и форматирование

Входными данными для нашей RNN будут предложения в форме матриц, где каждая строка представляет собой вектор, представляющий слово. Эти матрицы будут иметь форму (n_words, размерность), где n_words - это количество слов в предложении, а Dimension - это размер, который мы Выбрала для наших скрытых векторов.

Проблемы и решения

Чтобы обучить RNN с помощью этого набора данных, нам нужно решить две проблемы:

  • RNN принимают входные данные постоянного размера. Однако не все заголовки содержат одинаковое количество слов, поэтому не все наши матрицы будут иметь одинаковую форму. Чтобы исправить это, я решил тренировать RNN по одному образцу за раз. Таким образом, список матриц, которые RNN получит в качестве входных данных, будет иметь только одну выборку, а формы выборок будут постоянными (потому что она только одна).
  • Другая проблема - дисбаланс между нашими классами. Как указывалось ранее, некоторые темы широко распространены, а другие практически отсутствуют. Итак, что мы собираемся делать, вместо того, чтобы выбирать каждый раз случайным образом выборку, это случайным образом выбираем класс, а затем выборку внутри этого класса. Таким образом, все классы должны иметь равное представление. (Мы в основном делаем передискретизацию.)

Обучение - Тема Emojis

Наш обучающий набор данных содержит 2949 образцов, поэтому 500 из них остаются для тестирования.

Наша RNN имеет только один скрытый слой размером 200 и использует функцию softmax для активации, которая возвращает вероятности для классификации моно-меток. Если мы хотим предсказать несколько эмодзи, мы могли бы вместо этого использовать сигмовидную функцию.

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

Давайте посмотрим на наши прогнозы в цифрах:

Мы примерно на 10 пунктов ниже нашей первой системы с этой, но мы должны помнить, что эта модель использует только заголовки наших новостей.

Теперь снова наша матрица путаницы:

Наша диагональ здесь достаточно четкая. Конечно, тестовых образцов всего 500, но классификация вроде бы неплохая.

Давайте посмотрим на несколько прогнозов из набора данных тестирования (Заголовок = заголовок новости, Emoji = истинный ярлык, а затем 3 строки ниже - наши 3 основных прогноза с их отрицательной оценкой рядом с ними):

Так что наши прогнозы очень хороши! Мы видим, что некоторые ошибки (например, в первом примере) простительны. Когда мы говорим о Facebook, переключиться с экрана компьютера на мобильный телефон не составит труда при применении нашей модели к новым образцам. Другие ошибки, такие как допущенная в предпоследнем примере (о Брианне Стюарт), немного более проблематичны. Принимать баскетболиста за футболиста - не самое лучшее, особенно когда наша модель так уверена в этом.

Переход на ГРУ

Теперь мы собираемся попробовать что-то с RNN, немного более надежным, чем ванильная версия. На этот раз я использую Keras, чтобы собрать ГРУ (который следует идее LSTM, но, как известно, превосходит их в задачах с небольшими наборами данных, таких как наш).

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

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

Доказано, что этот метод улучшает результаты в рекуррентных сетях (а именно в моделях перевода).

Я собираюсь добавить выбранные нами метрики только для прямого сравнения, так как остальная часть модели почти такая же, как и предыдущая:

Мы на 2 балла выше наших выступлений с ванильным RNN, который - да, стоит перейти на ГРУ. Эта модель превосходит MNB, который запускал целые статьи, а не только их заголовки!

Теперь, когда у нас есть довольно хорошая модель, мы собираемся добавить к ней ярлыки и посмотреть, останутся ли наши выступления законными. Я сделал это, увеличив набор данных (вручную). Теперь существует 20 ярлыков вместо 15 (правда, только 18 из них оказываются предсказуемыми). Посмотрим на выступления:

И они даже лучше! Конечно, большее количество образцов означает, что материала для обучения больше, но полезно знать, что добавление классов к нашим прогнозам не снижает производительность нашей модели.

Обзор выступлений моделей

Применение модели к смайликам эмоций

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

Прогнозы всегда делаются с использованием показателя достоверности (здесь это просто вероятность, возвращаемая функцией pred_proba наших моделей). Мы используем слой softmax в наших нейронных сетях, и мультиномиальные байесовские прогнозы автоматически суммируются до одного, поэтому все наши результаты представляют собой распределения вероятностей. Это означает, что если одно из наших прогнозов имеет показатель достоверности выше 50%, то сумма всех других прогнозов в сумме составляет менее 50%. Так что это довольно высокий показатель достоверности. Установив порог нашей уверенности в 50%, мы можем немного больше поверить в наши прогнозы:

maria menounos gets married again see wedding photos !
♥

airwolf actor jan michael vincent has died
😔

it s not the economy , stupid


former nba all star kenny anderson suffers stroke
😔

ideas for valentine day treats
♥

Ниже наши метрики для модели TF-IDF + MNB (слева) и модели ГРУ (справа). Для обеих моделей мы установили порог подтверждения прогнозов с достоверностью 50%.

У каждой модели есть свои плюсы и минусы. Основным преимуществом MNB является то, что он делает прогнозы для каждого класса, и мы можем надеяться получить от него больше разнообразия. Главный плюс ГРУ - это… ну, выступления. Прогнозов меньше, но те немногие, которые у нас есть, очень надежны.

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

Увеличение разнообразия вручную

Последний шаг - внести разнообразие в наши прогнозы. Наши модели предсказывают классы смайликов, но часто для одного и того же класса возможно несколько смайлов. Другими словами, мы хотели бы «декластерировать» кластеры смайликов, которые мы создали в начале этой статьи.

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

Разбор и использование базы данных

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

Библиотека смайлов (упомянутая ранее со ссылкой) имеет это в магазине. У каждого смайлика есть псевдоним (описание одним или двумя словами) и теги. Например, смайлик 🎅 имеет псевдоним «Санта» и помечен как «рождество».

Выбирая некоторые важные ключевые слова, эта библиотека упрощает получение автоматических тегов. Вам просто нужно быть осторожным, какие слова отправлять для пометки (вы можете избегать таких слов, как «on», которые вызовут у вас смайлики, такие как 🔛). Я выбрал автоматическую пометку в три этапа:

  • Составьте список всех смайликов, которые стоит автоматически пометить. Например, домашний смайлик 🏠 может не понадобиться добавлять в слоган. Ссылка на эмодзи 🔗 совершенно бессмысленна и даже может вводить в заблуждение. Итак, вам нужен список смайликов, которые наверняка будет интересно разместить в вашем заголовке, поскольку они автоматически появятся там, как только будет обнаружено соответствующее слово.
  • Часть речи, помечающая заголовки и выбирающая только существительные для потенциальной автоматической пометки. Вы должны быть осторожны с заголовками, которые полностью пишутся с заглавной буквы, поэтому я опускаю все это перед добавлением POS-тегов. Я использовал функцию pos_tag в nltk для получения тегов. Это не на 100% точно (особенно когда вы устанавливаете текст в нижнем регистре), но это делает свою работу.
  • Для каждого слова в заголовке (ну, каждое слово подходит для автоматической пометки - так что существительные): ищем точное совпадение в псевдонимах эмодзи. Например, при слове «лошадь» будет найден смайлик 🐴. Если это не помогло, поищите смайлик, соответствующий основанию слова. Это означает, что «лошади» станут «лошадьми» и найдут смайлы. Если ни один из этих методов не работает, поищите смайлики, содержащие это слово в виде тега. Последний вариант особенно полезен, когда речь идет о странах (еще раз, я предлагаю создать свой собственный список стран - тех, у которых есть знаменитые флаги) и таких концепциях, как Рождество или Хэллоуин. Затем вы можете получить список смайлов, соответствующих вашему слову, и выбрать один. Я выбирал каждый раз случайным образом, чтобы увеличить разнообразие, но вы можете просто выбрать первый из возвращенных, если хотите.
fooled by fake paperwork , the met bought a stolen egyptian coffin for 4 million
⚰️ 
tyrrell winston is the artist turning new york s trash into art
🎨 
ringing the vegetarian bell : taco bell making 2019 commitments with new menu launch
🌮 
how the usta national campus has transformed the american tennis scene
🎾 
georgia man charged in plot to attack white house with anti tank rocket
🚀
the history of the world according to cats
🐱

Выше приведены несколько примеров заголовков, которые были автоматически помечены. (Если вы не видите смайлики должным образом, просто скопируйте и вставьте их в чат-бота или что-то в этом роде - первый - гроб, а второй - палитру). Как видите, этот метод работает очень хорошо, и это самый короткий фрагмент кода во всем этом. Типичный.

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

  1. T-Sciences, Люди лучше обрабатывают визуальные данные