Как у всех дела?
Обновление 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 (очевидно…)
- Амазонка Афина
- Амазонка