AngryCritic - инструмент для анализа данных и определения их тональности, на основании заданных параметров и ключевых слов.
- angrycritic.py – исполняемый файл;
- Папка data – содержит конфигурационные файлы в формате yaml, для настройки работы кода под ваш контекст данных.
- types.yaml - содержит ключевые слова для определения типа (категории) данных;
- skip.yaml – массив ключевых слов и словосочетаний, при обнаружении которых обработка данных производиться не будет;
- mood_keywords_otp.yaml и mood_keywords_fishing.yaml и т.д. - конфигурационные файлы, содержащие ключевые слова для конкретных категорий данных.
Перед запуском убедитесь, что все необходимые пакеты установлены:
- yaml;
- os;
- pandas;
- pymorph3;
- string;
- time;
- tqdm;
- nltk;
- jarowinkler.
Или воспользуйтесь командой:
pip install -r requirements.txt
Перед запуском программы, Excel-файл с данными необходимо переименовать в «data.xlsx» и поместить в корневой каталог с программой. Данные, по которым необходимо провести анализ, должны находиться в столбце «А». По окончанию обработки в данной папке будет создан файл «data_done.xlsx».
На ПК с процессором Intel(R) Core(TM) i5-11400, 8Gb RAM - 25000 строк/мин
Первичный запуск: Поместите «data.xlsx» в корневой каталог, запустите процесс обработки. По окончанию откройте файл «data_done.xlsx», на вкладке Частота по документу будет представлен список слов с частотой их употребления в документе. Проанализируйте полученную информацию, выделите основные категории данных в документе и внесите характеризующие их ключи в файл types.yaml.
Запустите повторное выполнение кода, предварительно закрыв файл «data_done.xlsx». В новом документе появятся дополнительные вкладки с названием заданных типов/категорий в файле types.yaml. На вкладках будет содержаться список слов с частотой их употребления в тексте указанного типа/категории данных. Воспользуйтесь полученную информацией для формирования файлов с ключевыми словами для определения тональности - mood_keywords_xxx.yaml.
Обработка документа выполняется в 2 этапа:
-
Предварительная обработка - происходит определение типов/категорий информации и определние данных, которые обрабатываться не будут (skip).
- В файл skip.yaml - добавьте ключи, при обнаружении которых обработка данных производиться не будет (очистка от спама);
- В файл types.yaml следует добавить тип/категорию данных и ключевые слова для ее определения.
Важно! название типа/категории должно соответсвовать названию его конфигурационного файла. Например, otp - mood_keywords_otp.yaml.
Если однозначно определить категорию по ключевому слову не представляется возможным, то необходимо добавить ключи в связке с которыми тип данных становится очевидным.
Например, Ваши данные содержат слово «письмо», по которому определить к какой категории их отнести достаточно трудно. Поэтому в каждую категорию, к которой оно может относить мы добавляем данный ключ, но с сопутсвующими словами для категории.
Для категории otp, ключ будет выглядеть следующим образом:- _письмо_+otp,отп,отр,устройство
Для категории fishing:
- _письмо_+фишинговый,подозрительный,странный,scstsberbank,подозрение
Таким образом, если в тексте встретится слово письмо, будет осуществляться поиск сопутсвующих слов в тексте, указанных за ключевым словом.
Более подробно о синтаксисе конфигурационных файлов и способах использования описано ниже.
-
Определение тональности исходя из конфигурационных файлов с ключевыми словами. Конфигурационные файлы типов(категорий) данных mood_keywords_otp.yaml и mood_keywords_fishing.yaml - необходимо заполнить ключевыми словами, для определения тональности конкретной категории, или создать новый файл под новую категорию.
Тональность может принимать следующие значения:
Наименование | Описание |
---|---|
positive | при наличии данного слова в тексте тональность положительная |
negative | при наличии данного слова в тексте тональность отрицательная |
undef | не определено ввиду отсутствия ключевых слов |
- Если категорию/тональность однозначно можно определить по одному слову, записывать только данное слово:
- сбой - недоступен
- Если для определения категории/тональности важно ориентироваться на сопутствующие слова:
[1]_[2]_[3] [1] - слова/частицы, наличие, отсутсвие или и наличие и отсутсвие которых в пределах 2х позиций перед ключевым словом ([2]) определяет категорию/тональность; [2] - ключевое слово, обязательно выделять "_"; [3] - слова, наличие, отсутсвие или и наличие и отсутсвие которых в данном тексте определяет категорию/тональность.
Варианты использования:
Вариант | Когда сработает |
---|---|
+не_запускаться_ | При наличии в тексте ключа запускаться и в пределах 2х позиций перед ним частицы не ("не запускается", "не всегда запускается"). Через запятую без пробела можно указать любое количество сопутсвующих слов ("+не,я,всегда_запускаться_") |
-не_запускаться_ | При наличии в тексте ключа запускаться и отсутсвии в пределах 2х позиций перед ним частицы не ("сегодня все запускается"). Через запятую без пробела можно указать любое количество сопутсвующих слов ("-не,я,всегда_запускаться_") |
+не-всегда_запускаться_ | При наличии в тексте ключа запускаться и в пределах 2х позиций перед ним частицы не, а также отсутствии в пределах 2х позиций перед ключем слова всегда ("сегодня не запускается"). Через запятую без пробела можно указать любое количество сопутсвующих слов + и - слов ("+не,я-всегда,сегодня_запускаться_") |
_запускаться_+приложение | При наличии в тексте ключа запускаться и слова приложение во всем текущем тексте ("приложение весь день не запускается"). Через запятую без пробела можно указать любое количество слов. |
_запускаться_-приложение | При наличии в тексте ключа запускаться и отсутсвии слова приложение во всем текущем тексте ("весь день не запускается"). Через запятую без пробела можно указать любое количество слов. |
_запускаться_+приложение-сегодня | При наличии в тексте ключа запускаться и слова приложение во всем текущем тексте, а также отсутсвии слова сегодня ("приложение весь день не запускается"). Через запятую без пробела можно указать любое количество слов. |
+не-всегда_запускаться_+приложение-сегодня | При наличии в тексте ключа запускаться и в пределах 2х позиций перед ним частицы не, отсутсвии слова всегда в пределах 2х позиций от ключа, наличии слова приложение во всем текущем тексте и отсутсвии слова сегодня ("приложение весь день не запускается"). Через запятую без пробела можно указать любое количество слов. |
Таким образом, одни и те же ключи с разным набором сопутствующих слов могут находиться в разных категориях/тональностях.
Имеем файл data.xlsx со следующими данными в столбце A:
Текст |
---|
дискорд не работает сегодня |
сбои в работе discord |
discord упал |
сбои дискорд |
Дискорд попросту не запускается, бесконечная загрузка |
сбой работы дискорд сегодня |
дискорд лежит |
дискорд сбои |
ркн заблокировал дискорд качайте AmnesiaWG и WARP конфиг к нему, РКН чтоб вы все сдохли там |
не запускается discord |
Капец, тут ещё люди остались которые не знают что его РКН заблокировали |
Роскомнадзор ответит. |
Использую приложения для работы и развлечений - РКН ОДУМАЙСЯ |
ЧТО ДЕЛАЕТ РКН ЗАЧЕМММММ |
роскомнадзор заблокировал все |
А ВЫ ДУМАЛИ ПОСЛЕ СХАВАННОЙ вами БЛОКИРОВКИ ЮТУБА РКН ОСТАНОВИТСЯ? ОНИ ЗАБЕРУТ У ВАС ВСЁ. |
Сразу запускаем первичное выполнение программы, по окончанию которого получаем файл data_done.xlsx следующего содержания:
Вкладка Total - результат обработки:
Text | Lemma | Type | Type_Keywords | Mood | Mood_Keywords | Index |
---|---|---|---|---|---|---|
дискорд не работает сегодня | ['дискорд', 'не', 'работать', 'сегодня'] | undef | [] | undef | [] | 0 |
сбои в работе discord | ['сбой', 'в', 'работа', 'discord'] | undef | [] | undef | [] | 0 |
discord упал | ['discord', 'упасть'] | undef | [] | undef | [] | 0 |
сбои дискорд | ['сбой', 'дискорд'] | undef | [] | undef | [] | 0 |
Дискорд попросту не запускается, бесконечная загрузка | ['дискорд', 'попросту', 'не', 'запускаться', 'бесконечный', 'загрузка'] | undef | [] | undef | [] | 0 |
сбой работы дискорд сегодня | ['сбой', 'работа', 'дискорд', 'сегодня'] | undef | [] | undef | [] | 0 |
дискорд лежит | ['дискорд', 'лежать'] | undef | [] | undef | [] | 0 |
дискорд сбои | ['дискорд', 'сбой'] | undef | [] | undef | [] | 0 |
ркн заблокировал дискорд качайте AmnesiaWG и WARP конфиг к нему, РКН чтоб вы все сдохли там | ['ркн', 'заблокировать', 'дискорд', 'качать', 'amnesiawg', 'и', 'warp', 'конфига', 'к', 'он', 'ркн', 'чтоб', 'вы', 'всё', 'сдохнуть', 'там'] | undef | [] | undef | [] | 0 |
не запускается discord | ['не', 'запускаться', 'discord'] | undef | [] | undef | [] | 0 |
Капец, тут ещё люди остались которые не знают что его РКН заблокировали💀 | ['капец', 'тут', 'ещё', 'человек', 'остаться', 'который', 'не', 'знать', 'что', 'он', 'ркн', 'заблокировали💀'] | undef | [] | undef | [] | 0 |
Роскомнадзор ответит. | ['роскомнадзор', 'ответить'] | undef | [] | undef | [] | 0 |
Использую приложения для работы и развлечений - РКН ОДУМАЙСЯ | ['использовать', 'приложение', 'для', 'работа', 'и', 'развлечение', 'ркн', 'одуматься'] | undef | [] | undef | [] | 0 |
ЧТО ДЕЛАЕТ РКН ЗАЧЕМММММ | ['что', 'делать', 'ркн', 'зачеммммм'] | undef | [] | undef | [] | 0 |
А ВЫ ДУМАЛИ ПОСЛЕ СХАВАННОЙ вами БЛОКИРОВКИ ЮТУБА РКН ОСТАНОВИТСЯ? ОНИ ЗАБЕРУТ У ВАС ВСЁ. | ['а', 'вы', 'думать', 'после', 'схаванна', 'вы', 'блокировка', 'ютуба', 'ркн', 'остановиться', 'они', 'забрать', 'у', 'вы', 'всё'] | undef | [] | undef | [] | 0 |
- Text - исходный иекси;
- Lemma - леммы слов;
- Type - категория, к которой относятся данные;
- Type_Keywords - ключевые слова, на основании которых была определена категория;
- Mood - тональность;
- Mood_Keywords - ключевые слова, на основании которых была определена тональность;
- Index - значение, на основании которого определяется тональность данных (Больше 0 – позитив, меньше 0 – негатив).
Если в анализируемом тексте встречается несколько ключевых слов, то на основании значения их тональности вычисляется значение index (positive +1, negative -1, undef = 0).
Вкладка Частотность по документу - частота использования слов в документе. Данная информация помогает в понимании предмета документа:
Слово | Частота |
---|---|
дискорд | 7 |
ркн | 6 |
сбой | 4 |
работа | 3 |
discord | 3 |
сегодня | 2 |
запускаться | 2 |
всё | 2 |
роскомнадзор | 2 |
заблокировать | 2 |
Анализируем наиболее часто встречающиеся слова на предмет отнесения к той или иной категории данных или созданию новой. Из полученной выше информации выделяем тип/категорию данных discord и blocked, и добавляем соответсвующие ключи в файл /data/types.yaml
discord:
- дискорд
- discord
blocked:
- ркн
- роскомнадзор
После сохранения изменений в файле types.yaml можем повторно запустить обработку, предварительно закрыв файл data_done.xlsx. По окончанию обработки получим обновленный файл data_done.xlsx, в котором будут содержаться новые вкладки discord и blocked. На данных вкладках будет находиться частотность употребляемых слов только данной категории данных. Для вкладки discord:
Слово | Частота |
---|---|
дискорд | 7 |
сбой | 4 |
discord | 3 |
сегодня | 2 |
работа | 2 |
запускаться | 2 |
ркн | 2 |
Для вкладки blocked:
Слово | Частота |
---|---|
ркн | 4 |
роскомнадзор | 2 |
всё | 2 |
капец | 1 |
заблокировать | 1 |
блокировка | 1 |
На основании анализа данных вкладок создаем файлы ключевых слов в папке data для определения тональности mood_keywords_discord.yaml и mood_keywords_blocked.yaml соответсвенно.
mood_keywords_discord.yaml В раздел negative добавим слова, при наличии которых будем считать негативным - сбой, заблокировать, упасть, сдохнуть, не запускаться, не работать.
positive:
-
negative:
- сбой
- заблокировать
- упасть
- сдохнуть
- лежать
- +не_запускаться_
- +не_работать_
Аналогично для других типов. Далее запускаем выполнение кода еще раз. На вкладке Total видим результат добавления ключевых слов и можем оценить корректность работы кода
Text | Lemma | Type | Type_Keywords | Mood | Mood_Keywords | Index |
---|---|---|---|---|---|---|
дискорд не работает сегодня | ['дискорд', 'не', 'работать', 'сегодня'] | discord | ['дискорд'] | negative | ['не + работать'] | -1 |
сбои в работе discord | ['сбой', 'в', 'работа', 'discord'] | discord | ['discord', 'сбой'] | negative | ['сбой'] | -1 |
discord упал | ['discord', 'упасть'] | discord | ['discord'] | negative | ['упасть'] | -1 |
сбои дискорд | ['сбой', 'дискорд'] | discord | ['дискорд', 'сбой'] | negative | ['сбой'] | -1 |
Дискорд попросту не запускается, бесконечная загрузка | ['дискорд', 'попросту', 'не', 'запускаться', 'бесконечный', 'загрузка'] | discord | ['дискорд', 'запускаться'] | negative | ['не + запускаться'] | -1 |
сбой работы дискорд сегодня | ['сбой', 'работа', 'дискорд', 'сегодня'] | discord | ['дискорд', 'сбой'] | negative | ['сбой'] | -1 |
дискорд лежит | ['дискорд', 'лежать'] | discord | ['дискорд'] | negative | ['лежать'] | -1 |
дискорд сбои | ['дискорд', 'сбой'] | discord | ['дискорд', 'сбой'] | negative | ['сбой'] | -1 |
ркн заблокировал дискорд качайте AmnesiaWG и WARP конфиг к нему, РКН чтоб вы все сдохли там | ['ркн', 'заблокировать', 'дискорд', 'качать', 'amnesiawg', 'и', 'warp', 'конфига', 'к', 'он', 'ркн', 'чтоб', 'вы', 'всё', 'сдохнуть', 'там'] | discord | ['дискорд', 'ркн', 'заблокировать'] | negative | ['заблокировать'] | -1 |
не запускается discord | ['не', 'запускаться', 'discord'] | discord | ['discord', 'запускаться'] | negative | ['не + запускаться'] | -1 |
Капец, тут ещё люди остались которые не знают что его РКН заблокировали💀 | ['капец', 'тут', 'ещё', 'человек', 'остаться', 'который', 'не', 'знать', 'что', 'он', 'ркн', 'заблокировали💀'] | blocked | ['ркн'] | undef | [] | 0 |
Роскомнадзор ответит. | ['роскомнадзор', 'ответить'] | blocked | ['роскомнадзор'] | undef | [] | 0 |
Использую приложения для работы и развлечений - РКН ОДУМАЙСЯ | ['использовать', 'приложение', 'для', 'работа', 'и', 'развлечение', 'ркн', 'одуматься'] | blocked | ['ркн'] | undef | [] | 0 |
ЧТО ДЕЛАЕТ РКН ЗАЧЕМММММ | ['что', 'делать', 'ркн', 'зачеммммм'] | blocked | ['ркн'] | undef | [] | 0 |
роскомнадзор заблокировал все | ['роскомнадзор', 'заблокировать', 'всё'] | blocked | ['роскомнадзор', 'заблокировать'] | negative | ['заблокировать'] | -1 |
А ВЫ ДУМАЛИ ПОСЛЕ СХАВАННОЙ вами БЛОКИРОВКИ ЮТУБА РКН ОСТАНОВИТСЯ? ОНИ ЗАБЕРУТ У ВАС ВСЁ. | ['а', 'вы', 'думать', 'после', 'схаванна', 'вы', 'блокировка', 'ютуба', 'ркн', 'остановиться', 'они', 'забрать', 'у', 'вы', 'всё'] | blocked | ['ркн', 'блокировка'] | undef | [] | 0 |