Всем привет. Тема достаточно интересная и может показаться довольно не простой в реализации. Но я человек практический и хочу прикоснуться к прекрасному особо не напрягаясь. Сегодня мы с вами сделаем "микросервис" для анализа сентиментальности / тональности текста. А походу дела, еще несколько интересных вещей которые помогут вам для подготовки своего текстового обращения к Скайнету. Зачем? Это очень хороший вопрос. Но прежде чем на него ответить, давайте немного поумнеем и узнаем, что же такое анализ тональности текста и что такое тональность? by wikipedia У меня частенько от прочтения википедии больше вопросов чем ответов. Давайте упростим — тональности текста говорит нам о "настроении текста". Например "а ну иди сюда мать твою..." сигнализирует о наличии проблем у слушателя. "Дорогой, я дома" — чуть получше, но по ситуации.  Использовать подобный анализ можно для поиска позитивных новостей, для фильтрования негативных комментариев, построение рейтинга продукта по отзывам и так далее. Я думаю общая идея понятна. Раз мы собрались использовать Node.js, то нам понадобится Express. Вы можете использовать что угодно, Express аля low level и не критичен для поставленной задачи. express-generator — это своего рода create-react-app для Express фреймворка. Генерируем приложение в папке node_nlp: можно упростить две прошлые команды используя npx: Для старта приложения переходим в папку, качаем зависимости и запускам: Для того, что бы не тратить время на ручную перезагрузку сервера на каждое изменение, давайте поставим и настроим nodemon:  Небольшие правки в package.json: И для разработки используем: Давайте еще сразу поставим охапку пакетов, я расскажу зачем они нужны по ходу дела. Просто иначе туториал норовить быть сетапом проекта и я уже забыл о чем пишу со всеми этими npm install.  По факту у нас будет всего один ендпоинт, в папке ./routers, есть файл index.js его мы и будем кромсать: Простенький POST ендпоинт который принимает body с полем text. Если вы как и я, хоть как-то соприкасались с созданием скайнета, обрабатывали данные, то наверняка знаете, что процесс подготовки так же важен, как и процесс обработки данных. Нам нужно минимизировать различный шум и возможные ошибки, что бы вы не пошли в сторону говорящего "а ну иди сюда мать твою...".  Так как "микросервис" у нас будет заниматься анализом тональности английского языка, нам нужно продумать как превратить такие сокращения как I’m, you’re в I am, you are.
Для этого мы будем использовать apos-to-lex-form Для того, что бы слова ИДИ СЮДА и иди сюда воспринимались одинаково, надо быть уверенным в том, что весь текст в одном регистре. Для очередного улучшения точности нашего анализа, следует удалить лишние символы, мне трудно сказать какой тональности @#$%^# такие вот символы. По этому удаляем все лишнее и оставляем только буквы.
Используем стандартную функцию JavaScript — replace(): Токенизация это процесс разбиения текста на индивидуальные составляющие. Например слово является токеном предложения, а предложение в свою очередь токеном параграфа. Здесь на сцену врывается наша главная лошадка Natural.
В данном пакете нам предоставляется инструмент токенизации WordTokenizer: Так как текст может прийти откуда угодно, есть вероятность ошибок. Нам надо попытаться их исправить. С этим нам поможет spelling-corrector.  Стоп слова, это своего рода слова паразиты. Ну как бы, эээ, ууу, хыы не, что бы прямо такие паразиты, а просто лишние слова, которые не делают абсолютно никакой погоды для нашего тональника. С удалением таких слов нам поможет пакет stopword. Стемминг, это процесс нормализации слов. Например “giving,” “gave,” and “giver” в простую форму “give”.
Мы не будем выделять это в отдельный шаг, так как SentimentAnalyzer который предоставляет нам пакет Natural, может сделать это за нас. Все! Мы добрались. Теперь нашу заяву примет Скайнет и все поймет. Пора скармливать текст в SentimentAnalyzer и понять, позитивно ли мы звучим в столь толерантном обществе или нет. Тональный анализ работает достаточно не замысловато. Пакет Natural имеет свой словарь слов с "полярностью" слов. Например слово "good" имеет полярность 3, а слово "bad" -3. По факту все этих "очки" суммируются и нормализуется по размеру предложения. По этому собственно мы и сделали столько для отчистки нашего текста от всего лишнего, что бы нечего мешало нам получить адекватную оценку.
Текст позитивный если оценка положительная, негативный если отрицательная и нейтральная если мы получили 0. SentimentAnalyzer принимает 3 параметра: Весь итоговый код с тональным анализом текста в конце: Мы добавили несколько новых строк. Деструкция natural, для получения необходимых нам инструментов создали переменную для анализатора и присвоили результат переменной analysis.
Параметры SentimentAnalyzer, относительно очевидные. Язык английский так как текст который мы обрабатываем на английском. Cтемпинг слов, который я упоминал выше и словарь который нам предоставляется пакетом Natrual. Хотелось бы мне сделать UI для этого дела, но протестировать можно в конскольке DevTools: Как видим работает :) Github repo В этой статье мы с вами сделали "микросервис" который анализирует тональность текста. Берите его на любые разборки и анализируйте, что вам говорят оппоненты. Так же мы затронули тему подготовки данных и установили тонну зависимостей. Спасибо за внимание! Читайте так же