Как у всех дела?

Обновление 07.02.2022

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

Бот все еще работает, ежедневно публикует в Твиттере настроение COVID — COVID_LDS_Bot. Не стесняйтесь подписаться и поделиться.

Он работает локально, но вскоре будет перенесен на AWS.

Фон

Еще в 2020 году, во время первой блокировки, я заинтересовался практическими реализациями машинного обучения, в частности, обработкой естественного языка (NLP).

Я знал, что у Amazon есть сервис — Amazon Comprehend, который:

Amazon Comprehend — это сервис обработки естественного языка (NLP), который использует машинное обучение для выявления ценных идей и связей в тексте.

источник: Amazon Comprehend

Следующим шагом было придумать проект для использования этой услуги. В предыдущих проектах я работал с API Twitter. Я решил расширить эту разработку для этого проекта. Проект будет использовать API поиска Twitter для извлечения твитов в пределах определенного диапазона геолокации и оценки настроения каждого твита. Это дало бы мне настроение для этой области. Затем я рисовал это настроение и твитил результат.

Так родился COVID_LDS_Bot.

Технологии

В проекте используется сочетание технологий:

  • Raspberry Pi
  • Докер
  • NodeJS
  • Твиттер API
  • AWS понять
  • Google диаграммы
  • NgInx OSS

Raspberry Pi

Как и большинство моих проектов, COVID_LDS_Bot работает на Raspberry Pi (Raspberry Pi 3 Model B):

$ cat /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2
$ cat /etc/os-release
NAME=”Raspbian GNU/Linux”
VERSION_ID=”10"
VERSION=”10 (buster)”
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL=”http://www.raspbian.org/"
SUPPORT_URL=”http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL=”http://www.raspbian.org/RaspbianBugs"

Докер

На этом конкретном Raspberry Pi я ранее установил Docker. Это позволило мне запустить несколько разных проектов изолированно без риска дублирования и конфликта.

Проект COVID_LDS_Bot реализован в виде серии контейнеров.

NodeJS

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

Твиттер API

Twitter API — очень мощный инструмент (если вы привыкнете к его синтаксису). Чтобы получить список твитов, я передаю в API поиска следующее:

q (search query): "covid -filter:links -filter:retweets"
geocode: latitude, longitude, 50mi
result_type: "recent"
count: 100
tweet_mode: "extended"

(i) tweet_mode: «расширенный» гарантирует, что возвращенный твит содержит весь неусеченный текст.

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

(i) API поиска ограничен по скорости. Подробную информацию о текущих ограничениях скорости можно получить с помощью запроса к application/rate_limit_status API.

AWS понять

AWS Comprehend APIмозги моего проекта. Я использую этот сервис для определения настроения каждого твита. Настроение определяется как взгляд или мнение, которого придерживаются или выражают.

Перебирая коллекцию твитов, я вызываю метод DetectSentiment, передавая текст твита и код языка («en»). Ответ включает «предполагаемое настроение» вместе с оценкой по четырем категориям настроений.

Ниже приведен пример использования интерфейса командной строки AWS:

$ aws comprehend detect-sentiment — text “Shiny happy people, holding hands” — language-code en
{
   “Sentiment”: “POSITIVE”,
   “SentimentScore”: {
      “Positive”: 0.8842025995254517,
      “Negative”: 0.011515547521412373,
      “Neutral”: 0.039094068109989166,
      “Mixed”: 0.06518782675266266
   }
}

(i) Из-за ограниченного количества символов и случайного использования грамматики твиты могут быть трудны для анализа. Многие твиты часто классифицировались как нейтральные («Текст не выражает ни положительных, ни отрицательных настроений»). Для этих твитов я использовал значения SentimentScore.Positive и SentimentScore.Negative, чтобы определить, имеет ли текст сильное вторичное настроение. Эти твиты я классифицировал как нейтральные/положительные или нейтральные/отрицательные.

Затем я просто суммирую результаты:

$ cat sentiment_analysis_output.csv
Sentiment,Count
POSITIVE,22
NEGATIVE,49
NEUTRAL,34
NEUTRAL/NEGATIVE,6
NEUTRAL/POSITIVE,6
MIXED,7

API визуализации Google

Чтобы визуализировать результат анализа настроений, я выбрал Google Charts. Используя Google Visualization API, я программно генерирую круговую диаграмму данных, содержащихся в файле sentment_analysis_output.csv, используя комбинацию JavaScript и HTML:

(i) Эта страница была размещена на другом Raspberry Pi (у меня есть несколько разбросанных по дому), работающем под управлением NgInx OSS.

Твитнуть

Заключительной частью проекта было размещение в Твиттере результатов текущего анализа настроений. Для этого мне сначала понадобился скриншот диаграммы Пи. Я использую Образ Docker с открытым исходным кодом для среды Raspberry pi с запущенным puppeteer с браузером chromium (armv7/docker-puppeter) для захвата страницы в формате JPEG.

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

Следующие шаги

Как упоминалось в разделе «Предыстория» этого поста, COVID_LDS_Bot в настоящее время работает локально. Мой следующий шаг — перенести эту разработку в облако. Я ожидаю, что технический стек будет включать, но не ограничиваться следующим:

  • Амазон ЭКС
  • Amazon Kinesis Firehouse
  • Амазонка S3
  • AWS Ламдба
  • Amazon Comprehend (очевидно…)
  • Амазонка Афина
  • Амазонка