Портфолио Гусевой Милены Андреевны

Личные и учебные проекты

View on GitHub

Приветствую потенциальных работодателей и/или единомышленников, а также всех интересующихся на своей персональной странице! Здесь представлены все живые, действующие на данный момент и обновляющиеся с разной периодичностью проекты, так или иначе связанные с программированием (и частично дизайном) и выполненные мной лично.

Содержание документа:

  1. Проекты в сфере NLP (обработки естественного языка)
  2. Проекты в сфере разработки десктопных приложений
  3. Проекты в сфере веб-разработки
  4. Первые шаги в сфере дизайна

Проекты в сфере NLP (обработки естественного языка)

Тестирование «понимания» моделью bert-base-chinese системы классификаторов («счётных слов») в китайском языке

Открыть в Google Colab: Open in Colab

Данный проект был выполнен в рамках домашнего задания по предмету «Компьютерная морфология и синтаксис» (преп. канд. физ.-мат. наук Сорокин А.А.).

Краткий ликбез для не-лингвистов!

«Общепринято, что лингвистическая категоризация имён существительных является отражением человеческого сознания и культуры», – отмечает выдающийся российский и австралийский лингвист Александра Юрьевна Айхенвальд.

Действительно, людям свойственно в процессе познания подразделять предметы на разные классы, группы и кучки. На основе тонко подмеченных сходств и различий каждому объекту в картине окружающего мира отводится особое место.

Неочевидно, но грамматические категории, сильно завязанные на таком подходе к значениям слов, наличествуют в огромном количестве языков. Например, носителю русского или немецкого может сразу прийти в голову разделение всех существительных на мужской, женский и средний род. Лингвисты называют эти одинаково согласующиеся группы существительных «именными классами».

Русский язык – далеко не рекордсмен по количеству родов: в жаркой Африке и на Кавказе говорят на языках, в которых таких согласовательных классов куда больше, чем привычных нам три. Так, в распространённом африканском языке фулá их аж целых 25 штук, в его дальнем родственнике суахили – 15, в чеченском и ингушском – шесть, а в бацбийском (родственном чеченскому и ингушскому малом языке, который в наше время не забыт только в одном селе в Грузии) – восемь.

Есть и другая крайность: французы обходятся всего двумя родами, а подавляющее большинство языков мира и вовсе преспокойненько себе живут и процветают без каких-либо именных классов (к примеру, татарский или английский).

Но сейчас речь не о них, а, напротив, о тех языках, что в стремлении разложить по полочкам всё и вся на уровне грамматики пошли много, много дальше русского или суахили, развив систему классификаторов.

Классификатор — это специальное слово, которое используется в языках, чтобы классифицировать объект, исходя из требуемого контекста. Проще говоря, классификатор сопровождает существительное и относит его к той или иной категории в зависимости от его значения.

В европейских языках классификаторы практически отсутствуют. Наиболее наглядно и приближенно для русскоязычного человека сущность этого явления может проиллюстрировать, скажем, слово «стакан» в словосочетании «два стакана молока». Но главная разница состоит в том, что в языках с классификаторами употребление такого слова носит обязательный характер – как если бы нам приходилось всё время уточнять свою речь: «четыре-длинных-предмета-карандаша», «этот-животное-милый-котик», – а иначе предложение бы просто не получилось.

Самым распространённым в мире языком с классификаторами является китайский. Вместо термина «классификаторы» преподаватели официальной версии китайского языка – путунхуа – также используют более просторечный вариант «счётные слова».

Почему именно «счётные»? Дело в том, что все системы классификаторов, которые только встречаются на планете, подразделяются на несколько типов. И если одна система может принадлежать к типу именных классификаторов, где в принципе запрещается употреблять существительное без сопутствующего классификатора, не считая ряда исключений (таков южноамериканский язык хакальтек – потомок праязыка тех самых древних майя, которые придумали календарь, который скорбные умом товарищи сочли предвестником фейкового конца света в доме, который построил Джек), то другая может требовать создания каких-то узко очерченных условий для появления классификатора в предложении. Система, в рамках которой функционируют китайские классификаторы, является гибридной – нумеративно-демонстративной. В переводе на человеческий: китайцы используют счётные слова тогда и только тогда, когда им нужно что-то посчитать, исчислить или сказать про что-то «тот» или «этот» – потому-то они и счётные.

Есть распространённое в научной среде мнение, что вся эта история сложилась по причине того, что у китайского языка хроническая беда с выражением категории числа. Никаких тебе окончаний или суффиксов, по которым сразу можно понять, «один» предмет или их «много», как в русском. Вроде бы существует консенсус, что все существительные по умолчанию множественного числа, пока не указано точное число объектов, но он не срабатывает, если единственность или множественность можно установить из контекста – поди ещё разбери, «студент» имелся в виду или «студенты». Показателей множественного числа нет, кроме частицы для личных местоимений – той, что превращает «я» в «мы», «ты» в «вы» и иногда в разговорном языке «друга/друзей» в «друзей (без разночтений)». На этом всё: если хочешь наверняка снять все референциальные конфликты (проще говоря, устранить возможные недопонимания), будь добр сказать «один-уважаемый-человек-учитель», а не просто «учитель/учителя».

Как видите, метода довольно сложная и разветвлённая – одних только самых ходовых классификаторов насчитывается примерно 97 штук, а в общем их сильно больше сотни. Среди них есть так называемый «универсальный классификатор», который получил свою кличку за то, что употребляется с целой кучей не особо связанных по смыслу между собой понятий, а также иногда используется иностранцами и не очень образованными китайцами в случаях, когда правильное счётное слово никак не вспоминается (надо сказать, такое всё же происходит редко – если «лаоваю» простительно, то свои за подобное загрызут на месте). И это я ещё не упомянула, что одному слову в зависимости от контекста или оттенка значения может соответствовать несколько счётных слов. А ещё бывают устаревшие и борющиеся между собой за место под солнцем паттерны употребления классификаторов,…

Описание проекта

…поэтому даже самые продвинутые современные большие языковые модели иногда дают маху с подбором подходящего счётного слова, что уж говорить о классических трансформерах, обученных 5 и более лет назад. В связи с этим, когда Алексей Андреевич Сорокин озвучил домашнее задание, сформулированное как «взять какой-нибудь моноязычный BERT не для русского и не для английского, установить его в Колабе, поиграться и протестировать, насколько хорошо он справится с каким-нибудь сложным грамматическим явлением, существующим в этом языке», я поняла, что настал звёздный час моей давней гиперфиксации. Пусть китайский BERT попробует подставить вместо спецтокена [MASK] подходящий классификатор – по-моему, идеальное испытание для модели, суть которой как раз и состоит в том, что она обучалась на задаче восстановления пропущенного на месте маски слова. Китайская грамматика, схожая с блочным конструктором, легче лёгкого позволяет провернуть такой трюк.

За деталями мини-исследования приглашаю непосредственно в ноутбук: я никогда не скуплюсь на подробные красочные описания происходящего, понятные даже неспециалисту. В нашей программе:

и ещё много чего интересного-нестандартного.

Узнать больше

Если Вы, уважаемый читатель, захотите погрузиться в волшебный и интригующий мир классификаторов с головой, то сигнализируйте мне, я поделюсь всем, что знаю сама: кому, как не человеку, который чуть было не связал с этими самыми классификаторами оставшуюся жизнь, а также проводил на 17-м Московском международном фестивале языков лекцию на эту нетривиальную тему, располагать всей полнотой материала :) Ну или можете глянуть мою презентацию с лекции – лишним не будет.

Исследование изменения качества классификации текстов по тональности при добавлении в обучающую выборку нейтральных предложений

Открыть в Google Colab: Open in Colab

Данный проект был выполнен мной совместно с моей одногруппницей Валерией Богдановой в рамках спецкурса “Методы машинного обучения для решения проектных задач компьютерной лингвистики” (организаторы — МГУ и фонд “Интеллект”, преп. Студеникина К.А.) и изначально был рассчитан на двоих участников. Преподаватель для удобства разделила требования к заданию на два этапа, которые нужно было выполнить в индивидуальном порядке последовательно друг за другом — мне оставалось лишь взять на себя ответственность за один из них.

Поскольку мне всегда нравилось работать непосредственно с данными, да и задача уровня “просто прогнать модель по датасету и посмотреть, как она справится” показалась мне чуть менее интересной, я сделала свой выбор в пользу начального этапа, суть которого состояла в том, чтобы:

9 отборных молодцов – плодов любви тестовой выборки CEDRa (1882 предложения) и нейтральных экземпляров из “Emotion Classification”, получившихся у меня после всех преобразований, – в неизменном виде напрямую перекочевали в финальный этап, который остался на откуп Валерии, чьей задачей было уже на всём готовеньком протестировать модель ruBERT-tiny2-CEDR на получившихся датасетах, чтобы выяснить, как добавление к выборке нейтральных примеров повлияет на качество классификации русскоязычных предложений по эмоциональной составляющей (напомню, фишка в том, что в “чистом” CEDR, на котором эта модель файнтюнилась на многоклассовую классификацию, нейтральных образцов вовсе нет).

Немного проспойлерю: эксперимент в конце концов показал, что наводнение выборки большим количеством нейтральных примеров не то что не меняет, но порой даже может ухудшить качество классификации (что вполне логично, особенно если в обучающей выборке нейтрального класса предложений не было), но это уже совсем другая история.

Работа над улучшением и развитием проекта Factura

Исходный код проекта на GitHub

Данный вид работ выполнялся в мини-группе из 4-х человек, включая меня, Валерию Богданову, Анну Жуковскую и Алсу Закирову, под руководством нашего преподавателя Гращенкова П.В. (доцент, д.филол.н.) в рамках предусмотренной учебным планом проектной деятельности (предмет “Проектные исследования в фундаментальной и прикладной лингвистике”).

Factura – система автоматического извлечения фактов из текстов на основе правил, задаваемых в YAML-файлах (примеры можно посмотреть здесь). Правила имеют свой особый синтаксис и требуют знания базовой лингвистической терминологии для понимания (по крайней мере, нужно немного разобраться в том, какие бывают составляющие и типы связи между ними в синтаксисе русскоязычных предложений).

Вывод программы может выглядеть по-разному в зависимости от конкретного правила, сработавшего на тот или иной фрагмент текста при его прогоне через систему. В общем виде структура факта включает в себя перечисление:

  1. глагола (который, собственно, и является главным индикатором типа сработавшего правила). К примеру, нам могут понадобиться специфические правила для извлечения фактов вида “X продал/купил Y” или “X заявил о W”
  2. актантов (главных участников ситуации, которых невозможно выкинуть, не повредив грамматичности предложения – то есть при их отсутствии предложение начнёт звучать “не по-русски”)
  3. сирконстантов (второстепенных участников ситуации, которым необязательно быть при глаголе для того, чтобы предложение получилось)

Например, из новостного заголовка “Президент РФ В.В. Путин объявил 2024 год Годом семьи” можно извлечь факт, состоящий из глагола “объявить” и следующих актантов, расклассифицированных по семантической роли:

Этапы работы:

Открыть в Google Colab: Open in Colab

В эпоху нейросетей мало кто занимается правиловыми методами обработки естественного языка (вроде как принято считать, что это уже неэффективно, неактуально и не хайпово), и Factura – один из немногих примеров живого, здравствующего и, самое главное, удачного проекта в этой сфере. Так что желаю Factura устойчивого, стабильного развития, возможно, даже выхода на рынок в виде коммерческого продукта – и очень надеюсь, что те, кто придут на курс к П.В. Гращенкову после нас, оттолкнутся от материалов, что завещали им мы, и успешно продолжат наше достославное дело.

Тестирование «способности» модели dardem/xlm-roberta-large-uk-toxicity к анализу тональности

Открыть в Google Colab: Open in Colab

Данный проект был выполнен в рамках домашнего задания по предмету “Машинный перевод” (преп. канд. физ.-мат. наук Сорокин А.А.). Ноутбук снабжён подробной документацией происходящего в коде, а также схемами, мемами и шутками, без которых практически не обходится ни один написанный мной текст.

Характеристики и практическая ценность проекта

Результаты работы

Принято считать, что бинарная однометочная классификация легче многоклассовой – неважно, однометочной или многометочной – следовательно, порядочно обученные на такую задачу модели и на инференсе должны выглядеть достойно. Однако, несмотря на то, что на вход модели я подавала весьма простенькие примеры, качество анализа тональности оставляло желать лучшего. Вполне возможно, что причинами тому послужили высокая зависимость задачи от контекста, низкое качество обучающей выборки и игнорирование фактора сарказма при составлении датасета для обучения.

Дообучение моноязычной RoBERTa (youscan/ukr-roberta-base) для распознавания именованных сущностей

Открыть в Google Colab: Open in Colab

Данный проект выполнялся в рамках домашнего задания по предмету “Машинный перевод” (преп. канд. физ.-мат. наук Сорокин А.А.) параллельно и одновременно с предыдущим проектом и в некотором роде является его логическим продолжением. Ноутбук обильно сдобрен схемами и мемами в моём фирменном стиле.

Характеристики и практическая ценность проекта

Результаты работы

Несмотря на огромное количество вложенных в проект усилий, качество распознавания именованных сущностей оказалось не очень удовлетворительным по ряду причин:

Думаю, что исправление всех этих недостатков, требующее вложения ещё более колоссальных усилий (особенно по части того, что касается очистки данных и эмпирической подкрутки настроек модели при обучении), могло бы сделать дальнейшие эксперименты гораздо более удачными.

Построение разделяющей поверхности для выборки с помощью самостоятельной реализации перцептрона Розенблатта на Python в Google Colab

Открыть в Google Colab: Open in Colab

Данная мини-работа выполнена в рамках домашнего задания по предмету “Компьютерная морфология и синтаксис” (преп. канд. физ.-мат. наук Сорокин А.А.).

Содержание задания: в наличии имеется один из нескольких вариантов обучающей выборки (в моём случае – вариант №1), каждый экземпляр которой задан двумя признаками (или каждая точка задана двумя координатами в двухмерном пространстве, тут уж как угодно). В выборке имеется 2 класса, в каждом из классов по 4 экземпляра. Каждый элемент обучающей выборки помечен меткой 1 или -1, обозначающей его принадлежность к тому или иному классу. Задача – самостоятельно реализовать однослойный персептрон на Python, обучить его на имеющейся выборке, построить график получившейся разделяющей поверхности (конкретно в контексте задания – разделяющей прямой) и найти её уравнение.

Кому-то может показаться, что это совсем базовое упражнение для желторотиков и упоминать его в портфолио нет смысла, но я на момент получения задания только начинала погружаться в безграничный и вечно меняющийся мир машинного обучения (в частности NLP), поэтому сперва мне было сложнее вникнуть в суть дела, чем кажется на первый взгляд. Тем не менее, сочетание творческого азарта и умеренной твёрдости разгрызаемого гранита науки в конечном счёте принесло мне в процессе решения задачи только удовольствие.

Проекты в сфере разработки десктопных приложений

Как известно, на Python в наше время можно создать практически что угодно (начиная приложениями под Android на Kivy и заканчивая десктопными кроссплатформенными Франкенштейнами на Tkinter и PyQt). Далеко не факт (мягко говоря), что это “что угодно” будет отличаться эффективностью расходования ресурсов компьютера, удобством использования или приятным дизайном, но, когда выбор доступных инструментов не так разнообразен, искушение достать швейцарский нож и поиграться с ним весьма велико. Чаще всего игра в ножички заканчивается в худшем случае порезом, в лучшем – осознанием нецелесообразности использования данного инструмента (если уж тебе так надо открыть жестяную банку, отложи встроенную в многофункциональный ножик хлипкую открывашку и возьми нормальный консервный нож!). Но иногда лучшее – враг хорошего, несовершенной мини-открывашки вполне хватает для своих целей, а значит, подобные эксперименты всё же доводятся до конца и увенчиваются успехом.

Так произошло в случае с моим единственным на данный момент опытом разработки десктопного приложения на Python, речь о котором пойдёт далее. Я считаю «Фольклор 2.0» удавшимся образцом, поскольку свою ключевую функцию приложение выполняет на все 100%, а дизайн весьма понятен и не вводит пользователя в заблуждение. Итак, встречайте:

«Фольклор 2.0»

Исходный код на GitHub

Назначение приложения

«Фольклор 2.0» – десктопное приложение для ОС Windows, созданное мной в 2021 году на 3-м курсе бакалавриата в ходе написания курсовой работы на тему «Русская фольклорная музыкальная традиция в культурном пространстве современной Москвы: формы актуализации (на материалах сетевых источников и СМИ)». Данная работа была продолжена и расширена в 2022 году, на 4 курсе и послужила источником глав I и II моей бакалаврской выпускной квалификационной работы «Русская и татарская музыкальная фольклорная традиция в современной Москве: актуализация и репрезентация».

Предназначение приложения – визуализировать данные о музыкальных фольклорных мероприятиях, проводившихся в рамках городского фестиваля “Московская Масленица” с 2018 по 2020 гг. За 2021 год «Фольклор 2.0» неоднократно демонстрировался как онлайн, так и оффлайн вместо мультимедийной презентации на научных конференциях, где я делилась своими наработками по теме. Статья, обобщающая результаты этого этапа исследования, вышла в ELibrary:

Гусева, М. А. Репрезентация и восприятие русской фольклорной музыкальной традиции в современной Москве на примере фестиваля «Московская Масленица» / М. А. Гусева // ТЕОРИЯ и ПРАКТИКА СОВРЕМЕННОЙ науки : сборник статей VI Международной научно-практической конференции. В 2 частях, Пенза, 20 ноября 2021 года. Том 1. – Пенза: Наука и Просвещение, 2021. – С. 196-212. – EDN OMQRTT.

Довольно-таки странное название «Фольклор 2.0» пришло мне в голову в готовом виде как-то само собой ещё на этапе возникновения концепта приложения и с тех пор не менялось, став своего рода факультетским брендом.

Характер собранных данных

Какого характера были данные, собранные при написании курсовой работы, и что конкретно надо было визуализировать?

В первую очередь стоит прояснить следующее: целью курсовой работы было выявление форм и методов актуализации русской народной музыки в культурном пространстве современной Москвы на примере популярного городского фестиваля «Московская Масленица», который является частью цикла уличных мероприятий «Московские сезоны». Фестиваль проходит в столице с 2017 года и считается действительно массовым по посещаемости среди жителей и гостей Москвы. В силу глубоких исторических корней праздника в ходе мероприятий «Масленицы» активно используется фольклорная составляющая русской культуры, на площадках звучит народная музыка, поэтому лучше образца для изучения в рамках вышеозначенной темы просто не сыскать.

Возможно, наличие авторских терминов слегка затрудняет попытки осмысления содержания предыдущего абзаца, поэтому разберёмся с терминологией не отходя от кассы:

Форма актуализации – это образ действия, направленного на повышение известности, узнаваемости и актуальности (отсюда и “актуализация”) в обществе нынешнего века традиционной музыки, дошедшей до нас прямиком из седой старины. Таковых может быть бесконечное множество (музыкальный спектакль, фестиваль, концерт, городской праздник, мастер-класс и т.д.), но, как показало исследование, большинство из них, кроме концертов и музыкальных спектаклей, исчезающе редки. Ваша покорная слуга сама в составе фольклорно-этнографического театра МГУ “Братыня” за жизнь принимала участие почти исключительно в этих двух типах мероприятий (а также в трёх мастер-классах по русским народным танцам и гаданиям и в одном масштабном комплексном проекте, включавшем в себя издание книги-альбома и съёмку фильма – короче, наберёте в поисковике “Денис Князев, Русская свадьба Заонежья”, и будет вам счастье. И мой мордент там увидите).

Методы актуализации, в свою очередь, – это не что иное, как совокупность жанровых, культурных, исполнительских и иных особенностей, из которых складывается общее впечатление от мероприятия и которые составляют его непосредственную сущность. Все эти разнообразные оттенки индивидуальной стилистики, присущей каждому исполнителю в частности или приветствуемой организатором площадки в целом, можно условно разделить на три больших зонтичных группы: синтез фольклора с культурными традициями других стран и народов (далее «синтез культурных традиций» или «синтез культур»), синтез фольклора с разными жанрами (далее «синтез жанров») и стремление к аутентичной подаче фольклорного материала, не отходящей далеко от подлинных этнографических записей сельских бабушек и дедушек, последних из могикан, сохранивших в своей памяти истинную традицию (далее «аутентичность»). В итоговой дипломной работе 4 курса “метод актуализации” по научно-методологическим причинам был переименован в “содержание мероприятия, актуализирующего народную культуру”, окончательное состояние терминологии вкратце обрисовано здесь и ниже.

Таким образом, ключевая практическая задача напрямую следовала из цели исследования и применяемой терминологии. Чтобы выявить формы и методы актуализации русской народной музыки на примере “Московской Масленицы”, требовалось:

Львиная доля информации о количестве мест проведения фестиваля «Московская Масленица» была получена благодаря Порталу открытых данных г. Москвы, где был обнаружен набор данных (датасет) с географическими координатами и адресами всех площадок фестиваля за всё время его проведения. В датасете содержится 60 позиций. Основная часть сведений о формах актуализации русского музыкального фольклора была почерпнута с официального сайта Департамента культуры г. Москвы, сайта проекта «Московские сезоны» и из местных онлайн-СМИ. Представление же о методах актуализации составлялось на основе просмотра видеозаписей выступлений участников фестиваля и их социальных сетей.

Выбор фреймворка

Если начинающего Python-разработчика вдруг посещает смелая мысль о создании своего собственного десктопного приложения, как правило, он выбирает из двух доступных опций: Tkinter и PyQt (вообще-то существует ещё и Customtkinter, названый сынок старого доброго Tkinter, в базовых случаях мало чем уступающий PyQt в плане красоты получающегося интерфейса, но в период создания “Фольклора 2.0” я о нём ничего не слышала и своими ручками пока не пробовала). Эти две библиотеки для создания графических пользовательских интерфейсов (GUI, Graphic User Interface) в чём-то сходны по назначению и функционалу, но различий между ними куда больше, поэтому выбирать из них наиболее подходящий необходимо сугубо индивидуально, исходя из потребностей конкретного проекта. Рассмотрим основные особенности двух братьев-акробатьев в деталях:

Tkinter
PyQT
Объектно-ориентированная обёртка поверх инструментария кроссплатформенной библиотеки базовых элементов графического интерфейса Tk (Tk + interface = Tkinter) Обёртка поверх фреймворка Qt, предназначенного для разработки кроссплатформенного программного обеспечения и изначально написанного на C++
Встроенный компонент большинства дистрибутивов Python Отдельно устанавливаемая библиотека
Прост в освоении Многие знания — многие печали, шире функционал — больше сложностей в освоении
Высокая скорость разработки — голый прототип можно наклепать буквально за вечер Если в деталях работы фреймворка так с кондачка не разобраться, то и времени в разработку придётся вложить побольше
Предоставляет только набор базовых элементов интерфейса Комплексное решение, поддерживающее расширенные возможности для кастомизации виджетов, многопоточность, работу приложения с сетью, интеграцию с устаревшим движком для двухмерной/трёхмерной графики OpenGL (то есть при желании реально наваять целую 3D-игру) — в общем, с помощью PyQt можно сделать действительно всё что угодно, кроме разве что ААА-игр
Дизайн приложения выглядит несколько устаревшим, "любительским" Приложения выглядят более современными, более визуально привлекательными, я бы даже сказала, "профессиональными", что ли; дизайн можно настроить до мельчайших параметров
Предназначен исключительно для десктопных приложений Помимо приложений для персональных компьютеров, подходит также для разработки мобильных приложений
Чем выше размер приложения, тем сильнее проседает производительность Отлично подходит для более громоздких проектов, где требуется высокая производительность

Казалось бы, выбор очевиден, ведь PyQt обскакал Tkinter почти по всем параметрам. Однако если подходить к делу с холодной головой, то довольно скоро окажется, что все финтифлюшки PyQt в наших обстоятельствах вовсе ни к чему и ведут лишь к потере времени, переусложнению проекта и чрезмерной плодячке новых сущностей.

Так, среди немногих пунктов в таблице, по которым PyQt с треском проигрывает Tkinter, значится скорость разработки. В условиях, когда приложение является Частью Чего-то Большего побочным продуктом более серьёзной деятельности – научной, в которую, как бы ни хотелось покодить в своё удовольствие, прямо здесь и прямо сейчас требуется вложить как можно больше времени, высокая скорость разработки становится ключевым преимуществом. Проще говоря, кому интересен блистающий великолепием дизайн, если данные, которые ты хочешь с его помощью визуализировать, обработаны из рук вон плохо? Зачем тратить на что-то глубоко второстепенное те усилия, которые можно было бы перенаправить на доработку основного содержания? Да и вообще – для чего городить огород, если для моих нужд с лихвой хватит базового решения, простого, как буханка хлеба?

Убедительно? То-то же.

Вот и я подумала, что использование PyQt в качестве фреймворка для разработки GUI не даст мне ничего положительного, кроме чувства морального удовлетворения от того, что я пошла более сложным путём. Так что мой выбор в итоге вполне закономерно пал на Tkinter.

Функционал приложения

Интерфейс приложения включает в себя:

Интерактивная карта

Открывается по нажатии кнопки “Открыть карту” в отдельном окне установленного в системе браузера. Для удобства просмотра маркеры на карте кластеризованы автоматическим образом. При наведении курсора на маркер можно прочитать адрес площадки, которую он обозначает. В отдельности от приложения карту можно посмотреть здесь.

Легенда карты

Открывается в отдельном окошке приложения при нажатии одноимённой кнопки. Элементов легенды карты всего 2: зелёными маркерами обозначены места, где в рамках фестиваля проводились мероприятия, посвящённые актуализации русского музыкального фольклора, а оранжевыми маркерами отмечены точки на карте, где подобные мероприятия не проводились. При нажатии кнопки “Элемент 1 из 2” или “Элемент 2 из 2” в зависимости от текущего состояния окна легенда карты переключается на отображение следующего элемента. Каждый элемент снабжён иллюстрирующим его содержание значком и кратким текстом, раскрывающим его содержание.

Многоуровневое меню

Многоуровневое меню даёт возможность познакомиться с обработанными данными поближе и представляет собой своеобразную вертикальную таблицу из 3-х полей со скроллбарами (полосами прокрутки). В первом поле перечислены все адреса мест проведения музыкальных фольклорных мероприятий “Московской Масленицы”. Двойной клик левой кнопкой мыши на нужный адрес активирует второе поле, в котором расписано, какие исполнители и коллективы в разные годы выступали на данной площадке. Если напротив какого-либо года стоит прочерк, значит, в этом году фольклорных событий по этому адресу не проходило. Если же напротив года указан тег “Неизвестно”, то имеются сведения о том, что мероприятие проводилось, но точной информации о его содержании не сохранилось. Двойной клик на строчку с конкретным годом и исполнителем делает доступным третье поле, где через запятую перечислены форма и метод актуализации сответственно.

Справка

Справка открывается в отдельном окошке приложения при нажатии кнопки, расположенной в правом верхнем углу главного окна и изображающей жёлтый кубик со знаками вопроса, нарисованными на его гранях. Содержит краткую сводку информации о проекте, актуальную на момент его создания.

Состав проекта и стек технологий

Расширенная документация и дополнительные материалы

Готовый к использованию дистрибутив приложения, снабжённый кратким руководством пользователя и небольшой видеоинструкцией по применению, прикреплён к репозиторию на Github в разделе Releases.

Также надо отметить, что значительная часть данного приложения при работе над итоговой выпускной квалификационной работой впоследствии была переупакована в сайт (см. ниже) и вошла в состав второй его части “Московская Масленица”.

Если хочется больше наукообразия, то ещё раз советую заглянуть в саму курсовую работу. А можно забежать вперёд и ознакомиться с бакалаврской ВКР, в которой примерное представление о сути приложения даёт глава I.

Проекты в сфере веб-разработки

Стоит отметить, что 2 из 3-х представленных ниже проектов (все, кроме интерактивной карты лингвистических экспедиций, изначально размещённой на запасном российском домене, когда-то полученном от хостинг-провайдера в подарок за бонусные баллы и валявшемся без надобности) в своё время пострадали из-за отключения российских банков от системы SWIFT, поскольку домены для них (оба в зоне .xyz) были куплены у регистратора Namecheap из США.

Когда настало время продлевать домены, я уже не могла оплатить их без значительных танцев с бубном, криптой или виртуальными иностранными картами, но заморачиваться не стала (или, скорее, не имела на это ресурсов), поэтому непродлённые домены вскоре были потеряны навсегда. Сайты некоторое время пролежали в руинах небытия, откуда я потихоньку начала извлекать их ближе к текущему моменту.

Еженедельное культурно-просветительское интернет-издание «Китайская неделя» (chineseweekly.ru)

Исходный код на GitHub

Рождение идеи

Работа над проектом началась в 2021 году, когда я училась на ФИЯРе на 3-м курсе бакалавриата, а в нашем штатном расписании появился предмет под названием “Кафедральный практикум”. Кафедральный практикум представлял собой разновидность групповой проектной деятельности, целью которой стояла разработка чего-то общественно полезного и связанного с регионоведением, культурологией или межкультурной коммуникацией. Можно сказать, что нам предоставлялась свобода действий (в рамках разумного): одна из групп даже выдумала с потолка ничем физически не обеспеченный и принципиально нереализуемый силами трёх студентов проект постройки этнодеревни в Ленобласти. Подавляющее число групп, однако, обошлось чем-то более простым, наподобие тематических Телеграм-каналов, групп ВК и страничек в на тот момент ещё не запрещённом Нельзяграме. Кажется, будто какая-то одна пара девчонок точно выкатила страшный как атомная война сайт на Тильде, но за давностию лет всего и не упомнишь.

В студенческих коллективах, на мой взгляд, в большинстве случаев о командной работе говорить не приходится. За 4 года обучения на ФИЯРе участники мини-групп в основном либо садились мне на шею и скидывали на меня ответственность, либо, напротив, брали всю инициативу в свои руки и не давали вставить ни слова. Надо отметить, что к моменту поступления в магистратуру народ, по всей видимости, духовно подрастает, поэтому на ОТиПЛе мой опыт командного взаимодействия был в большей степени положительным, но это к теме не относится. На ФИЯРе же спокойный, взвешенный, уравновешенный диалог взрослых людей и равномерное распределение обязанностей были бесценной редкостью, посему чаще всего, если такая возможность предоставлялась, я предпочитала быть волком-одиночкой. На этот раз мне разрешили делать индивидуальную работу в порядке исключения, чем я и воспользовалась.

В связи со свежевозникшей в ту пору гиперфиксацией на счётных словах (классификаторах) в китайском языке моей первой смелой идеей было провести что-то вроде психолингвистического эксперимента с китайскими студентами нашего факультета и проверить, как владение языком, в котором присутствует это грамматическое явление, отражается на способности классифицировать и разделять “по кучкам” не только слова, но и объекты реального мира. Поскольку на тот момент я не была знакома с психолингвистической методологией и не смогла разработать достоверную с научной точки зрения схему проведения эксперимента, затея была отложена до лучших времён.

Однако к тому моменту я уже кое-что смыслила в веб-разработке, активно нарабатывала навыки программирования и ещё только начала интересоваться машинным обучением и обработкой естественного языка, поэтому захотела взять что-то связанное с предыдущей темой, но в контексте ML и обучить свою нейросетку для китайского языка (по иронии судьбы, часть прочитанных в то время научных статей легла в основу моей грядущей магистерской диссертации). Чуть-чуть помучавшись, я окончательно заплутала и запуталась в хитросплетениях своих начинаний, а впоследствии осознала, что моих знаний в данной сфере пока недостаточно.

Тогда в моей голове родилось спасительное светлое озарение: почему бы мне не сделать свой собственный интерактивный сайт о Китае и китайском языке, чтобы заодно потренировать навыки написания фронтенда и бэкенда? Как выяснилось позже, именно этому, третьему замыслу суждено было воплотиться в реальность и быть доведённым до конца. Так на свет появилось моё еженедельное культурно-просветительское интернет-издание «Китайская неделя», способствующее преодолению пропастей и наведению мостов между двумя уникальными и дружественными культурами: русской и китайской.

Состав проекта и стек технологий

Интернет-издание «Китайская неделя» является целостной системой, состоящей из следующих составных частей:

Описание возможностей и документация

Всю релевантную на март 2022 года документацию (презентацию проекта и “спецификацию” к нему, избранное из обратной связи в секции комментариев под публикациями, демо-материалы возможностей сайта и Телеграм-бота, а также примеры внешнего вида email-рассылок Sendpulse) Вы можете найти в соответствующей папке на Яндекс-диске.

Сайт

Публикации в проекте «Китайская неделя» в период его активности выходили с периодичностью раз в неделю по субботам до декабря 2021 года включительно. Наполнение статей значительно варьировалось в зависимости от повестки контент-плана (помимо текстовой информации на русском языке, за всё время ведения блога на сайте были обнародованы эксклюзивные интервью, тематические книжные обзоры, культурологические мини-исследования, обучающие материалы, в том числе и в видеоформате, интерактивные викторины и информативные таблицы, мультимедийные презентации и многое другое), однако в целом содержание было полностью сосредоточено вокруг изучения и практического применения китайского языка и знакомства широкой аудитории с богатым культурным наследием Китая.

Телеграм-бот

Listening Helper Bot появился задолго до «Китайской недели», так давно, что я уже и не помню, когда – скорее всего, в летне-каникулярном промежутке между 2-м и 3-м курсами бакалавриата. Бот изначально был создан и размещён мной в мессенджере Telegram для личных нужд и нужд моих товарищей, изучавших китайский язык в университете в одной группе со мной. Долгое время хостился исключительно на локалхосте и включался по автозапуску вместе с ноутом или глубокой ночью по команде “Милена, включи бота плиз” в чате группы :) Когда я задумала «Китайскую неделю» и решила приурочить полезного бота к приятному блогу, предполагалось, что нагрузка слегка возрастёт из-за желающих потестить и поиграться, обычно набегающих в первое время после презентаций проектов, поэтому наш искусственно-интеллектуальный друг переехал жить на Heroku.

Принцип работы цифрового помощника предельно прост: пользователь после вывода подсказки от бота высылает в диалог аудиофайл с записью на китайском языке в формате .mp3 или .wav, а бот его транскрибирует посредством обращения к API соответствующего ИИ-инструмента, предлагаемого IBM Cloud. Платить компании IBM за использование их нейросети мне так и не пришлось, поскольку бесплатного лимита запросов хватало на всю компашку китаистов ФИЯРа с лихвой. Однако век благоденствия был недолог.

К сожалению, бот лишился своего ключевого функционала летом 2022 года вследствие деактивации учётных записей и доступа к API платформы IBM Cloud для всех разработчиков из Российской Федерации. Мой аккаунт просто взяли и навсегда заблокировали без права восстановления или изменения региона проживания в профиле. Первое время мной предпринимались попытки найти другого достойного поставщика услуг автоматической транскрибации, но, поскольку необходимость выполнять аудирования на китайском языке практически отпала вместе с окончанием бакалавриата, я плюнула и отложила эту часть проекта в долгий ящик. Теперь от бота остались рожки да ножки, профиль в Телеграме, горстка кода и демонстрационный ролик из презентации проекта, с которым можно ознакомиться по ссылке.

Email-рассылка

Массовая рассылка оповещений по электронной почте с целью информирования всех заинтересованных лиц об обновлениях на сайте осуществлялась с email-адреса info@chineseweekly.xyz по субботам сразу после появления новых публикаций в проекте «Китайская неделя» в период его активности. Сбор адресов пользователей, желающих узнавать о выходе новых постов на сайте раньше всех, производился посредством специальной формы, размещённой во всех значимых и наиболее посещаемых разделах сайта (отдельная форма есть на заглавной странице и на страницах публикаций; также CTA (call-to-action)-кнопка, ведущая к форме, расположенной на главной странице, есть в правом верхнем углу в шапке сайта и отображается в любом его разделе, кроме административной панели).

Собранные email-адреса сохраняются в отдельную таблицу прикрученной к сайту базы данных SQLite. Полученный список почтовых ящиков периодически вручную выгружался из базы по мере наполнения и перенаправлялся в сервис рассылок SendPulse. Сервис SendPulse использовался мной не только непосредственно для массовой полуавтоматической рассылки оповещений, но и для конструирования макета (шаблона) тела письма, текст которого каждый раз сознательно модифицировался перед рассылкой под конкретную только что вышедшую публикацию.

В теории можно было бы поступить иначе и унифицировать содержание писем либо подготавливать их ещё до размещения статьи, настроив автоматическую отправку по триггеру (такая функция у сервиса была), чтобы по большей части избавиться от ручной работы, но малый масштаб проекта позволял осуществлять некоторые процессы в ручном режиме без особых проблем.

Стандартная визуальная структура оповещения о новой публикации (сверху вниз в “столбик”) включала в себя:

Примеры того, как это могло бы выглядеть в Вашем почтовом ящике, можно посмотреть здесь.

Современный этап развития, редизайн логотипа и планы на будущее

Несмотря на все превратности судьбы (отключение российских банков от SWIFT и последовавшую вскоре за этим потерю оригинального домена вследствие трудностей с его продлением), история “Китайской недели” отнюдь не закончилась. В мае 2024 года я восстановила сайт из руин и натянула его на новый домен, а в июле в рамках тренировки навыков работы в Figma сделала пилотный редизайн логотипа, сохранив изначальный концепт — название сайта на китайском и окружающие его веточки бамбука.

Вполне вероятно, что дизайн ещё будет меняться и упрощаться, поскольку, стараясь отрисовать бамбук как можно более реалистичным, я устроила перебор с “тенюшками” и детализацией, а также изменила основной цвет лого, что впоследствии должно бы привести к радикальному изменению цветовой гаммы всего сайта (но пока что у меня не дошли руки даже банально перекрасить кнопочки, хе).

В любом случае, если я решу дальше продолжать развивать проект (а у меня таки есть ряд идей для новых постов, например, любопытное исследование о связи ранее опубликованной на сайте легенды о мифической китайской династии Ся с её творческой интерпретацией, фигурирующей в фантастической вселенной SCP Foundation), то мне предстоит свернуть горы:

  1. полностью привести в порядок фронтенд, причесать и осовременить его, а также привести в соответствие с логотипом (либо посредством изменения цветовой гаммы сайта и добавления краткой версии лого, либо ещё одним редизайном последнего);
  2. запастись подробным контент-планом на ближайший год;
  3. починить бота в Телеграме, возможно, найти нового поставщика услуг или дообучить свою собственную модель (хотя изначальный функционал бота больше не актуален ни для кого из бывших пользователей, всегда можно обогатить его новыми фичами или вовсе переработать концепт);
  4. заново прикрутить Google Analytics;
  5. произвести небольшой апдейт подвала (заменить адреса криптокошельков действующими и убрать ссылки, ведущие на некоторые давно мной заброшенные соцсети, в том числе и запрещённые) и персональной информации в разделе «Об авторе»;
  6. возобновить email-рассылку (эл.почта на домене уже создана заново, как говорится, пишите письма: info@chineseweekly.ru, а вместо SendPulse можно перейти на Unisender или RuSender).

Русская и татарская музыкальная фольклорная традиция в современной Москве: актуализация и репрезентация (moscowfolklore.ru)

Исходный код на GitHub

Сайт с длинным названием «Русская и татарская музыкальная фольклорная традиция в современной Москве: актуализация и репрезентация» был создан в 2022 году в целях демонстрации результатов одноимённой бакалаврской выпускной квалификационной работы и визуализации данных о музыкальных фольклорных мероприятиях в рамках городских фестивалей “Московская Масленица” и “Московский Сабантуй” с 2018 по 2020 гг. включительно. В раздел 2 “Московская Масленица” была перенесена часть материалов десктопного приложения «Фольклор 2.0», см.выше.

Сайт демонстрировался на научных конференциях и непосредственно на защите дипломной работы вместо мультимедийной презентации.

По итогам исследований в 11-м выпуске онлайн-журнала Совета молодых учёных ФИЯР МГУ “Moscow University Young Researchers Journal: Languages, Cultures And Area Studies” была опубликована статья:

Гусева М.А. Русская и татарская музыкальная фольклорная традиция в современной Москве: актуализация и репрезентация // Moscow University Young Researchers Journal: Languages, Cultures And Area Studies. - 2022. - №11

Состав проекта и стек технологий

Дополнительная документация

Сайт «Русская и татарская музыкальная фольклорная традиция в современной Москве: актуализация и репрезентация» вполне можно назвать “самодокументирующимся проектом”, поскольку полное представление о нём самом можно получить из текста и интерактивных материалов, расположенных на его же страницах. Беглого ознакомления с разделами в порядке их размещения на заглавной странице (или даже в произвольном порядке) вполне достаточно.

Для самых пытливых читателей всегда есть вариант просканировать глазами первоисточник – выпускную квалификационную работу 4 курса бакалавриата.

Интерактивная карта лингвистических экспедиций ОТиПЛ МГУ (milenchik.ru)

Исходный код на GitHub

Смысл и назначение сайта

Этот простенький одностраничник был собран исключительно для прикладных нужд экспозиции (стенда) кафедры теоретической и прикладной лингвистики филфака МГУ на фестивале “NAUKA 0+” в 2022 г. Ваша покорная слуга, которая в то время только поступила на 1 курс магистратуры чужого факультета и отчаянно пыталась влиться в новую для себя среду, как это обычно бывает, самовольно вызвалась участвовать в мероприятиях Фестиваля науки и сама же для себя изобрела боевую разнарядку. Окинув ясным взглядом уровень текущих познаний непосредственно в самой лингвистике и основываясь на громадном жизненном опыте уже имеющемся опыте работы с библиотекой Folium, я предложила сообществу активистов свои услуги по составлению интерактивной карты, где были бы представлены все мыслимые и немыслимые полевые исследования малых и не очень языков, проведённые нашей кафедрой за всю историю её существования с момента основания в 1960 году и по наши дни. Комьюнити восприняло идею с восторгом и тут же заранее подрядило меня представлять свою карту на празднике очно в качестве консультанта для всех интересующихся, демонстрировать её на электронных носителях информации (то есть на принесённых на площадку ноутбуках) и всячески её комментировать, пытаясь задержать случайно забредших гостей фестиваля на подольше. Так я изначально попала в одну команду с девочками, представляющими раздел “Экспедиции”, хотя ни в одну лингвистическую экспедицию я (пока) так и не съездила. Такой себе “сапожник без сапог”. Атмосферой, тем не менее, я прониклась будь здоров, ибо в процессе работы над картой перелопатила уйму “теории” (фотографий, описаний, дат и воспоминаний), поэтому “клиентов” (то есть потенциальных абитуриентов и прочих неофитов от лингвистики из числа посетителей выставки) обрабатывала на ура, в случае нужды в показаниях очевидцев отсылая любителей науки для продолжения душеполезного разговора к девочкам, которые сами ездили в труднодоступные места изучать редкие наречия.

Надо сказать, что карта, выражаясь языком интернет-маркетологов, дала неплохую такую конверсию: из числа тех, кто останавливал на ней свой взор и спрашивал разрешения “потыкать”, большинство по итогу вовлекались в интереснейший разговор и получали-таки от нас целый ушат занимательной лингвистики на свою голову, что напрямую говорит о том, что сайт пришёлся по вкусу не только моим коллегам, но и целевой аудитории – гостям. Это обстоятельство привело к тому, что интерактивная карта повторно демонстрировалась мной в слегка изменившейся компании девочек на фестивале “NAUKA 0+” уже в 2023 году.

Состав проекта и стек технологий

Самым трудным этапом и поводом для головной боли, как это водится хоть в машинном обучении, хоть в дата-аналитике, а хоть бы даже и в веб-разработке, были сбор разрозненных данных, их реструктуризация в .csv и приведение к формату, удобному для того, чтобы скормить их в Folium.

После завершения всех процедур с данными и получения готового HTML-файла я могла бы оставить конечный результат как есть и показывать его со своего ноутбука посредством банального открытия файла в браузере из Проводника, но, во-первых, мне нужно было где-то в ближайшей визуальной доступности разместить легенду карты, во-вторых, мне нужно было сделать своё творение широко доступным и лёгким в распространении, чтобы особо заинтересованному посетителю карту можно было беспроблемно сбросить просто ссылочкой в Телеграм, в-третьих, очень хотелось знать, что в случае форс-мажора, лишний раз меня не дёргая, эту карту на своём ноуте за меня покажет кто-то другой (хвала Небу, третья мотивация для создания сайта за два фестиваля ни разу не оправдала себя).

Поскольку человеческий мозг склонен многократно ходить уже сотни раз протоптанными тропинками, я выбрала, может быть, не самое изящное, но довольно эффективное решение и по старой доброй традиции сварганила этот аскетичный и минималистичный сайт-одностраничник с помощью того же технологического процесса, что и предыдущие два экземпляра, описанные в данном документе. Если что, домен оказался названным в мою честь по чистой случайности: он у меня как раз валялся без надобности, такой притягательно свободный, ничем не занятый. Достался он мне от хостинг-провайдера за бонусные баллы и был отложен под веб-книгу стихов собственного сочинения, но я в целях экономии времени и денег разместила на нём карту экспедиций – спервоначалу думала, что временно. Но ведь всем известно, что нет ничего более постоянного, чем временное.

Таким образом, на текущий момент технические характеристики проекта выглядят следующим образом:

Первые шаги в сфере дизайна

В июле 2024 г. к моим сферам интереса довольно случайно добавился дизайн, хотя смежные побочные задачи я время от времени выполняла ещё со школы. В основном это было связано, конечно же, с вёрсткой фронтенда для моих веб-проектов, а также с оформлением групп ВКонтакте, созданием обложек, постов и несложных афиш в Crello (ныне VistaCreate), а также непродолжительной работой над факультетской газетой «Глаголица». Большинство имеющихся на данный момент наработок можно увидеть в специально созданном в целях демонстрации моего прогресса Телеграм-канале. Кое-что можно найти и на Behance.

Приятного ознакомления!