Сегодня мы обсудим прогнозирование настроения твита с помощью логистической регрессии. Главный урок заключается в том, что вместо того, чтобы использовать все слова в вашем наборе слов как отдельные функции для прогнозирования настроения твита, вы можете уменьшить количество функций до 3 функций на твит и делать очень точные прогнозы!

Подробное объяснение логистической регрессии см. в моем предыдущем посте в блоге.

Это краткий обзор Специализированного курса НЛП Deeplearning.ai 1.

Эта статья является частью серии. Продолжите с Бизнес изучает НЛП — Часть 2: анализ настроений с помощью Наивного Байеса.

Подробнейшие заметки для тех, кто хочет докопаться до сути:

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

Шаг 1. Подготовьте данные в качестве входных данных для вашей модели.

  • Шаг A. Прежде всего, мы создадим обучающую и тестовую выборки, чтобы оценить, насколько хорошо наши модели обобщают новые данные.
  • Шаг Б. Обработайте свои твиты (def process_tweet(tweet)) → все об очистке ваших твитов и приведении их в порядок!
  • Ввод: твит.
  • Очистите грязь: просмотрите каждый твит, удалите хэштеги, гиперссылки, ретвиты, ручки
  • Как только грязь удалена, разрежьте каждый твит на отдельные слова, это называется токенизацией, и создайте переменную (tweet_tokens)
  • Создайте пустой массив, в котором будут храниться все вычищенные слова (tweets_clean)
  • Для каждого слова в tweet_tokens, если слово не является стоп-словом или знаком препинания, верните слово к его основе и добавьте слово к tweets_clean
  • Вывод: tweets_clean, список слов, содержащих обработанный твит.
  • Шаг C. Постройте таблицу частот (def build_freqs(tweets, ys)) → получите частоты сообщений и отрицаний каждого слова!
  • Теперь мы хотим создать обзор всех слов в нашем корпусе (обучающий набор) и подсчитать, как часто каждое слово используется в положительном или отрицательном контексте. Примечание: вместо того, чтобы смотреть на слово и оценивать, считается ли оно положительным или отрицательным, мы используем наш обучающий набор, чтобы сказать нам, как часто каждое слово упоминается в положительном или отрицательном твите. Следовательно, слово «счастливый», вероятно, будет часто упоминаться в наших позитивных твитах, но может также использоваться и в негативных твитах (например, «Я недоволен»).
  • Входные данные: твиты и реальный ys (ярлыки реального настроения: 1 – положительный твит, 0 – отрицательный твит).
  • Просмотрите каждый твит и каждый y (метка настроения)
  • и протолкните каждый твит через функцию process_tweet, чтобы получить очищенную токенизированную версию вашего твита.
  • С каждым вычищенным словом вашего твита создайте пару (слово, настроение (у))
  • И добавляйте 1 в свой частотный словарь каждый раз, когда слово с этим конкретным ярлыком обнаруживается в новом твите.
  • Если это новое слово, которое не было зарегистрировано, то зарегистрируйте слово и его тональность и назначьте ему частоту «1», так как оно было зарегистрировано впервые.
  • Вывод: частотный словарь: обзор наших слов, их тональности и частотности.
  • Шаг D. Извлеките функции (def extract_features( tweet, freqs)) → Теперь мы, наконец, создадим нашу закодированную версию твитов для вставки в нашу модель logreg!
  • В итоге мы получаем строку из трех столбцов для каждого твита: единица смещения, сумма всех положительных значений слов в этом твите и сумма всех отрицательных значений слов в этом твите.
  • Исходные данные: твит и таблица частот
  • Создайте вектор 1 x 3 для каждого твита и инициализируйте нулями, чтобы у нашей функции был шаблон для хранения функций.
  • Для каждого токенизированного твита, состоящего из списка слов, просмотрите каждое слово,
  • Если мы находим это конкретное слово в положительном настроении с его соответствующей частотой (количество раз, когда это слово встречается во всех наших твитах вместе), то для этого твита добавьте его частоту в столбец «положительное настроение». Если мы не можем найти это конкретное слово (потому что это может быть стоп-слово), то ничего не делайте.
  • Выходные данные: матрица данных X: обзор всех обучающих примеров, где для каждого твита есть только 3 функции столбца: единица смещения, сумма положительных частот и сумма отрицательные частоты

Шаг 2. Обучите свою модель (градиентный спуск по определению (X, y, thetas, alpha, num. iter)) → теперь мы готовы обучить нашу модель, подобрать оптимальные значения тета и определить нашу функцию гипотезы для определения настроение новых твитов

  • Входные данные: матрица данных X, Y, начальные тета-параметры, скорость обучения альфа, количество итераций)
  • Инициализируйте матрицу данных X нулями
  • Заполните матрицу данных X с помощью нашей функции extract_features().
  • Установите Y на train_y (настоящие чувства твитов!)
  • Примените градиентный спуск, начав с 3 нулевых тета, рассчитав стоимость по всему обучающему набору (сравнив, насколько далеко каждое предсказанное настроение от его реального настроения, выполнив градиентный спуск, обновив тета и продолжая это упражнение для фиксированного количества итераций ( скажем, после 1500 циклов обработки данных мы придем к нашим оптимальным тэтам).
  • Выход: наши оптимальные тета-параметры, при которых затраты минимальны.

Шаг 3. Предсказать тональность нового твита (def Predict tweet(tweet, freqs, theta)) → После того, как мы обучили нашу модель, нам не терпится узнать, можем ли мы правильно предсказать тональность нового входящего твита!

  • Входные данные: новый твит, таблица частот и оптимальные тета-параметры.
  • Извлеките особенности твита с помощью def extract_features()
  • Предсказать с помощью новой гипотезы (сигмоидальной) функции с оптимальными тетами
  • Вывод: y_pred: вероятность того, что твит будет положительным или отрицательным, в диапазоне от 0 до 1.
  • Eg:

Я счастлив -> 0,518580

Я плохой -> 0,494339

этот фильм должен был быть отличным. -> 0,515331

Шаг 4. Проверьте производительность с помощью набора тестов (def test_logistic_regression (test_x, test_y, freqs, theta)) → используйте наш набор тестов для проверки производительности на невидимых данных.

  • Входные данные: test_x (список тестовых твитов), test_y (вектор m*1 с соответствующими метками для списка тестовых твитов, наш частотный словарь и оптимальные тэты
  • Создайте пустой массив y_hat для хранения наших прогнозов
  • Пройдите тестовый твит, получите прогноз метки для твита y_pred (вероятность от 0 до 1)
  • Если вероятность равна или выше 0,5, добавьте «1» к нашему массиву y_hat для положительного прогноза.
  • Если вероятность ниже 0,5, добавьте «0» к нашему массиву y_hat для отрицательного прогноза.
  • Рассчитайте точность модели, сравнив наши прогнозы (y_hat) с нашими test_y (настоящими метками y), подсчитав экземпляры, в которых они совпадают, и разделив на все тестовые выборки.
  • Вывод: точность нашей модели.

Шаг 5. Выполните анализ ошибок

  • Проверьте неправильно классифицированные твиты и определите, почему они классифицированы неправильно.

Вот и все! Спасибо ребятам из deeplearning.ai за этот замечательный урок. Увидимся на следующей неделе с НЛП и Наивным Байесом!