Использование машинного обучения для понимания и использования текста.

Чтобы получить больше подобных материалов, подписывайтесь на Insight и Emmanuel в Twitter.

Текстовые данные везде

Независимо от того, являетесь ли вы существующей компанией или работаете над запуском новой услуги, вы всегда можете использовать текстовые данные для проверки, улучшения и расширения функциональных возможностей вашего продукта. Наука извлечения смысла и обучения из текстовых данных является активной темой исследования под названием Обработка естественного языка (NLP).

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

  • Выявление различных когорт пользователей / клиентов (например, прогнозирование оттока, пожизненной ценности, предпочтений продукта)
  • Точное обнаружение и извлечение различных категорий отзывов (положительные и отрицательные отзывы / мнения, упоминание определенных атрибутов, таких как размер / посадка одежды…)
  • Классификация текста в соответствии с намерениями (например, запрос на базовую помощь, срочная проблема)

Хотя в Интернете существует множество статей и руководств по НЛП, нам было трудно найти руководящие принципы и советы о том, как эффективно подходить к этим проблемам с нуля.

Чем может помочь эта статья

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

Прочитав эту статью, вы научитесь:

  • Соберите, подготовьте и изучите данные
  • Для начала создавайте простые модели и при необходимости переходите к глубокому обучению.
  • Интерпретируйте и поймите свои модели, чтобы убедиться, что вы действительно собираете информацию, а не шум

Мы написали этот пост как пошаговое руководство; он также может служить высокоуровневым обзором высокоэффективных стандартных подходов.

Этот пост сопровождается интерактивной записной книжкой, демонстрирующей и применяющей все эти методы. Не стесняйтесь запускать код и следовать!

Шаг 1. Соберите данные

Примеры источников данных

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

  • Обзоры продуктов (на Amazon, Yelp и в различных магазинах приложений)
  • Пользовательский контент (твиты, сообщения в Facebook, вопросы StackOverflow)
  • Устранение неполадок (запросы клиентов, заявки в службу поддержки, журналы чата)

Набор данных «Катастрофы в социальных сетях»

Для этого поста мы будем использовать набор данных, предоставленный Figure Eight под названием Катастрофы в социальных сетях, где:

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

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

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

Этикетки

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

Шаг 2. Очистите данные

Правило номер один, которому мы следуем: «Ваша модель всегда будет настолько хороша, насколько хороши ваши данные».

Один из ключевых навыков специалиста по данным - знать, следует ли на следующем этапе работать с моделью или данными. Хорошее практическое правило - сначала просмотреть данные, а затем очистить их. Чистый набор данных позволит модели изучить значимые функции и не будет чрезмерно соответствовать несущественному шуму.

Вот контрольный список, который можно использовать для очистки ваших данных: (подробнее см. Код):

  1. Удалите все ненужные символы, такие как любые символы, отличные от буквенно-цифровых.
  2. Обозначьте свой текст, разделив его на отдельные слова
  3. Удалите нерелевантные слова, например упоминания в Твиттере «@» или URL-адреса.
  4. Преобразуйте все символы в нижний регистр, чтобы обрабатывать такие слова, как «привет», «привет» и «привет» одинаково.
  5. Рассмотрите возможность объединения слов с ошибками или поочередно написанных слов в одно представление (например, «cool» / «kewl» / «cooool»).
  6. Рассмотрим лемматизацию (сократите такие слова, как am, are и is до общей формы, такой как be)

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

Шаг 3. Найдите хорошее представление данных

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

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

Быстрое кодирование (мешок слов)

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

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

Визуализация вложений

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

Чтобы увидеть, собирают ли наши вложения информацию, относящуюся к нашей проблеме (т. Е. Относятся ли твиты к бедствиям или нет), рекомендуется визуализировать их и посмотреть, хорошо ли выглядят классы. разделены. Поскольку словари обычно очень большие и визуализировать данные в 20 000 измерений невозможно, такие методы, как PCA, помогут спроецировать данные до двух измерений. Это показано ниже.

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

Шаг 4: классификация

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

Мы разделяем наши данные на обучающий набор, используемый для соответствия нашей модели, и набор тестов, чтобы увидеть, насколько хорошо они обобщаются на невидимые данные. После обучения получаем точность 75,4%. Не так уж плохо! Если угадать самый частый класс («нерелевантный»), мы получим только 57%. Однако, даже если 75% точности было достаточно для наших нужд, мы никогда не должны отправлять модель, не пытаясь понять ее.

Шаг 5: осмотр

Матрица путаницы

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

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

Объяснение и интерпретация нашей модели

Чтобы проверить нашу модель и интерпретировать ее прогнозы, важно посмотреть, какие слова она использует для принятия решений. Если наши данные смещены, наш классификатор будет делать точные прогнозы на основе выборочных данных, но модель не будет хорошо обобщаться в реальном мире. Здесь мы наносим самые важные слова как для бедствия, так и для нерелевантного класса. Построить график важности слов с помощью «Мешка слов» и «Логистическая регрессия» просто, поскольку мы можем просто извлечь и ранжировать коэффициенты, которые модель использовала для своих прогнозов.

Наш классификатор правильно улавливает некоторые закономерности (хиросима, резня), но явно кажется переоснащенным по некоторым бессмысленным терминам (хейу, x1392). В настоящий момент наша модель «Мешок слов» имеет дело с огромным словарным запасом разных слов и обращается со всеми словами одинаково. Однако некоторые из этих слов очень часты и только вносят свой вклад в наши прогнозы. Затем мы попробуем представить предложения, которые могут учитывать частоту слов, чтобы увидеть, сможем ли мы извлечь больше сигнала из наших данных.

Шаг 6: учет структуры словарного запаса

TF-IDF

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

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

Очень небольшое улучшение. Наша модель начала подбирать более важные слова? Если мы получаем лучший результат, не позволяя нашей модели «обмануть», то мы действительно можем считать эту модель обновлением.

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

Шаг 7. Использование семантики

Word2Vec

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

Чтобы решить эту проблему, нам нужно уловить семантическое значение слов, то есть нам нужно понимать, что такие слова, как «хороший» и «позитивный», ближе, чем «абрикос» и «континент». мы будем использовать, чтобы помочь нам понять смысл, называется Word2Vec.

Использование предварительно обученных слов

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

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

Представление на уровне предложения

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

Вот визуализация наших новых вложений с использованием предыдущих методов:

Две группы цветов здесь выглядят еще более разделенными, наши новые вложения должны помочь нашему классификатору найти разделение между обоими классами. После обучения той же модели в третий раз (логистическая регрессия) мы получаем показатель точности 77,7%, что является нашим лучшим результатом! Пора осмотреть нашу модель.

Компромисс сложности / объяснимости

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

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

ЛАЙМ

LIME доступен на Github в виде пакета с открытым исходным кодом. Объяснение в виде черного ящика позволяет пользователям объяснять решения любого классификатора на одном конкретном примере, изменяя ввод (в нашем случае удаляя слова из предложения) и наблюдая, как изменяется прогноз.

Давайте посмотрим несколько объяснений предложений из нашего набора данных.

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

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

Шаг 8: Использование синтаксиса с использованием сквозных подходов

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

Сверточные нейронные сети для классификации предложений обучаются очень быстро и хорошо работают в качестве архитектуры глубокого обучения начального уровня. Хотя сверточные нейронные сети (CNN) в основном известны своей производительностью для данных изображений, они обеспечивают отличные результаты в задачах, связанных с текстом, и обычно их гораздо быстрее обучаются, чем большинство сложных подходов NLP (например, LSTM и Кодировщик / декодер). »Архитектуры). Эта модель сохраняет порядок слов и изучает ценную информацию о том, какие последовательности слов предсказывают наши целевые классы. В отличие от предыдущих моделей, он может отличить Алекс ест растения от Растения едят Алекса.

Обучение этой модели не требует намного больше усилий, чем предыдущие подходы (подробности см. В коде), и дает нам модель, которая намного лучше предыдущих, с точностью 79,5%! Как и в случае с вышеприведенными моделями, следующим шагом должно быть изучение и объяснение прогнозов с использованием описанных нами методов для проверки того, что это действительно лучшая модель для развертывания для пользователей. К настоящему времени вы должны чувствовать себя комфортно, решая эту проблему самостоятельно.

Заключительные примечания

Вот краткое описание подхода, который мы успешно использовали:

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

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

Хотите узнать о прикладном искусственном интеллекте у ведущих специалистов Кремниевой долины или Нью-Йорка? Узнайте больше о программе Искусственный интеллект.

Вы - компания, работающая в области искусственного интеллекта, и хотели бы принять участие в программе Insight AI Fellows Program? Не стесняйтесь связаться.