Три шага для экспресс-обработки и разметки текста
Сегодня мы поговорим об анализе текста. Нередко перед нами стоит задача обработать большой массив однотипного текста и выбрать/подсветить определенные фрагменты, которые будут использованы в аудиторском проекте.
Рассмотрим стандартную ситуацию, когда надо сделать и обработать подборку негатива СМИ по контрагентам. Если эта задача разовая, количество контрагентов не велико и анализируемый период достаточно короткий, то не стоит нагружать себя и готовить автоматизированное решение не имеет смысла. Поэтому данная информация будет интересна тем, кто планирует регулярно обрабатывать большие массивы информации.
Для успешного решения данной задачи необходимо выполнить 3 шага:
1 шаг. Получить информацию.
2 шаг. Убрать лишнее.
3 шаг. Сделать разметку.
Рассмотрим каждый из этих шагов более подробно.
1 шаг. Получить информацию
Мы не планируем подробно останавливаться на рекомендациях по подбору и поиску информации по контрагенту. Будем считать, что массив данных для разметки у Вас уже сформирован и требуется его обработать. Данное предположение сделано поскольку каждый вправе выбрать наиболее приемлемый для себя источник информации:
- результаты запросов в поисковых системах (практически бесплатный, но наиболее трудозатратный вариант);
- выгрузки данных с помощью новостных агрегаторов (наиболее удобный и простой в применении, но достаточно дорогой способ, при этом для разовых работ можно воспользоваться тестовым доступом);
- внутренние источники в организации.
Для тестирования нашего алгоритма мы оформили тестовый доступ к новостному агрегатору, с помощью которого создали подборку СМИ из 6000 новостей за год по 300 компаниям, находящимся в фокусе внимания федеральных, региональных СМИ.
2 шаг. Убрать лишнее
На этом шаге нам требуется качественно очистить выгруженную информацию от «мусора» или шумов.
На примере задачи с негативом СМИ по контрагентам можно выделить следующие виды шумов:
- информация, которая не соответствует контрагенту;
- информация дублируется;
- информация не является негативной.
Для решения задачи по очистке шумов мы применяли последовательно 4 алгоритма.
Для оптимизации работы рекомендуем сначала использовать быстрые алгоритмы, а более медленные ставить на последние этапы, когда объем обрабатываемой информации будет минимальным.
Алгоритм 1. Удаление дублей с использованием библиотеки Pandas, метод класса DataFrame – drop_duplicates()
Использование данной библиотеки позволяет удалить полные дубли по большому массиву информации менее чем за секунду, поэтому мы использовали ее в первую очередь.
На нашей тестовой выборке мы сократили объем информации подлежащей обработке почти в 2 раза за 16 мсек.
Пример кода:
Переменные:
- data – массив новостей;
- subset – колонка DataFrame, по которой метод определяет дубликаты.
Алгоритм 2. Удаление шумов не относящуюся к контрагенту.
В данном случае требуется использовать доступную информацию, полученную в ходе сотрудничества с контрагентом.
Для нашей тестовой выборки мы собрали информацию о территориях присутствия выбранных компаний из открытых источниках (официальные сайты компаний, информационные порталы с адресами и телефонами организаций).
После чего написали процедуру, которая удаляет новости по региональному признаку. На выходе у нас остались новости только всех федеральных СМИ и части региональных СМИ, в которых контрагент ведет деятельность.
Алгоритм работал чуть менее полминуты и сократил нашу подборку на 1000 новостей.
Для удаления шумов по территориальному признаку мы использовали стандартные процедуры циклов и ветвления. В цикле просматриваем регионы новостей и проверяем, ведет ли контрагент деятельность в этом регионе. На выходе получаем массив «флагов», по которому мы в дальнейшем фильтруем данные и избавимся от дубликатов.
Пример кода:
Алгоритм 3. Удаление дублей побитовым методом.
Учитывая практику некоторых СМИ перепечатывать другие источники, внося незначительные изменения в текст, мы решили удалить дубли путем побитового сравнения текстов.
Наша тестовая процедура удаляет дублирующие новости, совпадающие побитово на 70 и более процентов при условии, что новости опубликованные в одну дату по одному контрагенту.
На тестовой выборке этот алгоритм работает чуть более 35 сек. и удаляет 174 дубля или 9% от своего входа.
В итоге наша исходная выборка сократилась до 1 139 новостей.
Для побитового метода были разработаны 2 функции:
- битовый поиск дубликатов, которая позволяет сравнить побитовые разложения двух слов,
- битовый поиск дубликатов по текстам, которая позволяет сравнивает два текста.
Пример кода:
Параметры tolerance и w_tolerance позволяют регулировать «толерантность» к неполным дубликатам (в данном случае установлено значение 0.7, т.е. слова и предложения признаются дубликатами в случае совпадение на 70 и более процентов)
Алгоритм 4. Удаление дублей с использованием PyMorphy2.
Морфологический анализатор PyMorphy2 позволяет нормализовать формы слов и провести их последующее сравнение. Это наиболее медленный алгоритм в нашем арсенале, поэтому мы использовали его на последнем этапе. Логика нашей процедуры была такой – удаляем дублирующие новости, которые пословно совпадают на 70 и более процентов при условии, что они опубликованные в одну дату по одному контрагенту.
Работа этого алгоритма заняла более 8 часов и позволила удалить еще 363 дубля.
Основной продукт этого этапа — нормализованные формы слов, которые используются нами на этапе разметки.
Суть алгоритма предельно похожа на предыдущий, за исключением использования класса MorphAnalyzer() библиотеки PyMorpy2.
Пример кода:
3 шаг. Сделать разметку
На данном этапе необходимо создать «Мешок слов» и разработать пул правил для разметки текста.
Наполнить «Мешок слов» вы можете на свое усмотрение, в качестве примера рисковых событий могут быть выбраны фразы «Банкротство», «Ликвидация», «Долги», «Иски», «Акционерный конфликт».
Наш тестовый «Мешок слов» состоял из 90 слов, а алгоритм разметки позволял разметить новости по компаниям по 12 типам событий. Как я уже ранее писал, алгоритм разметки использует полученную на предыдущем этапе нормализованные тексты, на выходе мы получаем статьи, в которых упомянуты слова и/или словосочетания из «Мешка слов».
Из 1498 новостей, поступивших на обработку, на выходе осталось 136, соответствующих 12-ти выбранным типам событий.
Для алгоритма разметки мы использовали стандартные процедуры циклов и ветвления. Функция получает на вход предложение, ищет в нем слова из «Мешка» и возвращает их или сообщение об их отсутствии.
Пример кода:
Правильная последовательность применения алгоритмов для удаления дублей и шумов, грамотно составленный «Мешок слов» – вот залог успеха экспресс-обработки и разметки текста! Это позволит Вам существенно сократить количество часов монотонной работы высокооплачиваемых специалистов. Желаем Вам успехов на практике!