4.1. Создание корпуса постов социальной сети ВКонтакте
Для проведения экспериментов был создан корпус постов социальной сети ВКонтакте. Весь процесс можно разделить на шесть этапов: отбор пользователей вручную, написание парсера для сбора информации о текстовых постов, написание токенизатора для выделения в полученных текстах токенов, создание стоп-словаря и удаление слов, создающих «шумы», добавление би- и триграмм в корпус текстов, ручное постредактирование. Отбор пользователей производился по таким параметрам, чтобы исключить их возможное пересечение: были выбраны как известные личности, так и простые люди, живущие в разных городах и увлекающиеся сразу несколькими темами. Следующий этап заключался в написании парсера для извлечения текстов постов. В интернете доступны различные модули по сбору информации пользователей ВКонтакте (например, VKMiner, созданный в ВШЭ), однако, на наш взгляд, они не позволяют скачать полную информацию о пользователях.  Для написания парсера использовался язык программирования Python 3.7, библиотека beautifulsoup4 для работы с веб-данными, vk-api для доступа к пользовательским страницам, а также библиотека запросов request. Так как на одной странице стены пользователя размещено фиксированное количество постов, равное 20, было принято решение проанализировать первые десять страниц и выбрать текстовые посты, датированные не раньше 2018 года. К текстам самих постов также предъявлялись некоторые требования: материалом для последующего анализа могли послужить тексты, чья длина была больше 200 символов, так как в данном случае они являются репрезентативными и несут минимальную смысловую информацию. Отдельно стоит отметить, что возникла необходимость создать конвертер эмотиконов в кодовое представление, так как среда IDLE не может распознать многие из этих символов, в результате чего выдавалось сообщение об ошибке.  Рис. 5. Пример кода для парсера ленты пользователя ВКонтакте Наиболее сложным с технической точки зрения являлся этап автоматической обработки текстов постов, поскольку для верной выдачи слов в тематических моделях нужно учесть особенности интернет-дискурса. Для обработки корпуса постов необходимо реализовать такие процессы, как токенизация на основе регулярных выражений, лемматизация (нормализация), обработка полученных токенов с помощью стоп-словаря, добавление би- и триграмм в корпус. Тексты пользователей в некоторых случаях представляют собой сочетание символов разных алфавитов. Например, большинство постов, посвящённых описанию фильмов, включали в себя символы греческого алфавита: русская буква М с графической точки зрения очень похожа на греческую букву Μ (мю). Такая замена обусловлена тем, что пользователи социальной сети во избежание удаления поста в связи с нарушением авторских прав прибегают к подмене символов, чтобы обмануть систему. В результате токенизации слово «Μашина» распознавалась как два различных токена: «Μ» и «ашина». Такая ситуация наблюдалась у большинства слов, представленных числобуквенным комплексом или комплексом из букв различных алфавитов, поэтому для корректной обработки данные слова редактировались вручную перед обработкой, либо вносились в стоп-словарь, если это были служебные части речи.  Среди наиболее частых проблем при токенизации текстов постов можно выделить следующие: сочетание букв разных алфавитов в одном слове; написание слов на арабском или японском языке, такие слова добавлялись в исключения и не были использованы для последующего анализа; использование диакритических символов, которые также были удалены из текстов постов; использование других нерепрезентативных символов Unicode (галочки, солнышки, сердечки и другие). Для добавления токена в корпус его необходимо подвергнуть лемматизации. Для этого была использована библиотека pymorphy2, в котором есть функция нормализации слова morph.parse(token)[0].normal_form. Сам модуль при нормализации слова обращается к словарю OpenCorpora и приводит нормальную форму слова. В случаях, если слово не было найдено, модуль по аналогии со множеством других похожих лексем анализирует его и приводит возможную нормальную форму. Во время обработки модуль предсказывал леммы для слов, связанных с названиями социальных сетей, неологизмами, окказионализмами, неизвестными фамилиями и именами собственными, а также морфологически и графически адаптированными иностранными словами. В большинстве случаев приводилась верная начальная форма, однако некоторые варианты оказывались ошибочными и требовали дальнейшего постредактирования. Среди них можно выделить следующие случаи: Социальная сеть Instagram (Инстаграм) получило лемму «инстагра», т.е. модуль изначально распознал заимствованное слово как форму женского рода дательного падежа множественного числа (ср. мамам – мама, играм – игра и т.д.). Слово «тревел» было распознано как форма прошедшего времени от глагола «треветь». Имя существительное «море» в именительном падеже было распознано программой как форма предложного падежа единственного числа от слова «мор». Имя существительное «фейк» приобрело форму «фейка» в значении «маленькая фея».  Во время лемматизации каждая лексема проверялась на наличие в стоп-словаре, созданного на основе Национального корпуса русского языка и «Нового частотного словаря русской лексики» О.Н. Ляшевской и С.А. Шарова куда вошли слова, не несущие смысловой нагрузки для текста и создающие «шумы»: предлоги, союзы, частицы, междометия, символы различных алфавитов, обсценная лексика, сокращения и т.д. Итоговое количество стоп-слов равняется 1423. Итоговый этап создания корпуса – добавление би- и триграмм. В [Нокель, Лукашевич, 2015] указано, что с точки зрения семантической организации некоторые семантические единицы (устойчивые словосочетания, идиомы и т.д.) не могут быть разбиты на униграммы.  Было принято решение добавить в корпус биграммы и триграммы, которые встречаются в тексте более пяти раз. Создание биграмм и триграмм было организовано с помощью пакета gensim для тематического моделирования, в частности – библиотек Phrases и Phraser. Символ «_» соединил униграммы и превратил их в лексическую конструкцию: «гераниевый_масло», «белый_ворона» и т.д.   Рис. 6. Код для добавления биграмм и триграмм в корпус Итоговая версия корпуса представляет из себя список файлов расширения .txt в формате USER_ID_*, где * – номер страницы пользователя. Такое название оправдано удобством для дальнейшего вызова файлов и построения автор-тематической модели для пользователей. Каждый файл содержит список списков, каждый подсписок содержит в себе леммы, полученные в результате автоматической обработки текста. Общий объём корпуса составляет до обработки составляет 8679402 токенов, после – 2352979 токенов (714 пользователей, 25768 постов).
В данной статье рассматривается вопрос создания корпуса постов социальной сети ВКонтакте, который бы содержал информацию о пользователях, их интересах, предпочтениях, а также был бы полезен для создания автор-тематических моделей для пользователей. Для этого был проведен анализ текстов постов пользователей, отобранных вручную, а также создана программа для автоматической обработки текстов, которая позволяет выделить токены и привести их к правильной форме.