Ты должен быть сильным, ты должен уметь сказать:
Руки прочь, прочь от меня!
Ты должен быть сильным, иначе зачем тебе быть
Что будет стоить тысячи слов
Когда важна будет крепость руки?
И вот ты стоишь на берегу и думаешь: плыть или не плыть?
Мама, мы все тяжело больны
Мама, я знаю, мы все сошли с ума
Многие из тех, кто сейчас собирается у "стен Цоя" в разных городах, родились сильно позже после гибели музыканта. Большое число молодых активных деятельных поклонников сделало бы честь многим советским поэтам. Возможно, поэтическое творчество Цоя еще предстоит изучить специалистам-литературоведам. Но даже беглый анализ некоторых текстов группы "Кино" наталкивает на мысль о сильных символических значениях их стихотворных строк. А если послушать или почитать тексты внимательнее, то обнаружится глубокая связь Цоя как поэта с литературным наследием прошлого.
Одна из песен альбома "Группа крови", написанная в 1988 году, прямо отсылает слушателя-читателя к знаменитой шекспировской драме. И схожестью озвученной проблемы экзистенциального выбора, и даже как минимум одной недвусмысленной аллюзией. Речь идет про фразу "плыть или плыть" из песни "Мама мы все тяжело больны" и фразе датского принца "Быть или не быть".
Мне стало интересно провести сравнительный анализ текста песни Виктора Цоя и драмы Уильяма Шекспира "Гамлет" и найти пересечения, аллюзии и реминисценции в творчестве двух авторов помощью инструментов NLP на Python. Это может расширить представление о музыканте как идоле и символе "эпохи перемен" и дать новый взгляд на его творчество.
Я провел поиск и группировку контекстов и аллюзий, сделал подсчет частотности элементов, провел синтаксический анализ и сделал тематическое моделирование. Я использовал pymorphy3 для морфологического анализа, SequenceMatcher для расчета схожести строк, transformers и word2vek для сентимент-анализа через предобученные модели. Matplotlib, seaborn и networkx для построения графиков, анализа сетей и визуализации.
Я использовал взятый из интернета текст песни Виктора Цоя "Мама, мы все тяжело больны" и пьесу Шекспира "Гамлет" в переводе Михаила Лозинского. Оба текста я обработал, чтобы привести все слова к нижнему регистру, очистить от знаков препинания, лишних и посторонних символов.
Я начал с поиска в тексте Цоя перефразированных цитат и аллюзий из Гамлета и определения их схожести. Я составил кортеж из двух строк (фраза Цоя и фраза из Гамлета), сделал экранирование специальных символов в регулярных выражениях и определил окно контекста в 30 символов до и после фразы. Коэффициент схожести установил от 0 до 1, а булев флаг установил на значение 0,5, при котором аллюзию буду считать точно найденной.
def find_paraphrased_quotes(tsoy_text: str, hamlet_texts: Dict[str, str], known_allusions: List[Tuple[str, str]]) -> List[Dict]: results = [] tsoy_lower = tsoy_text.lower() for tsoy_phrase, hamlet_phrase in known_allusions: # Поиск в тексте Цоя tsoy_matches = re.findall(rf'.{{0,30}}{re.escape(tsoy_phrase)}.{{0,30}}', tsoy_lower) hamlet_matches = {} for translation_name, translation_text in hamlet_texts.items(): if translation_text: matches = re.findall(rf'.{{0,30}}{re.escape(hamlet_phrase)}.{{0,30}}', translation_text.lower()) hamlet_matches[translation_name] = matches similarity = SequenceMatcher(None, tsoy_phrase.lower(), hamlet_phrase.lower()).ratio() results.append({ 'tsoy_phrase': tsoy_phrase, 'hamlet_phrase': hamlet_phrase, 'tsoy_contexts': tsoy_matches[:5], 'hamlet_contexts': hamlet_matches, 'similarity_score': similarity, 'is_allusion': similarity > 0.5 or len(tsoy_matches) > 0 }) return results
Что у меня получилось
Аллюзия: «плыть или не плыть» → «быть или не быть» (схожесть: 0.82)
Аллюзия: «мама» → «королева» (схожесть: 0.17)
Аллюзия: «больны» → «сумасшед» (схожесть: 0.00)
Аллюзия: «яд» → «отравлен» (схожесть: 0.00)
Аллюзия: «сталь» → «клин» (схожесть: 0.22)
Аллюзия: «хлеб» → «зерно» (схожесть: 0.22)

Python выявил 6 аллюзий, но с высоким коэффициентом схожести, конечно, только "плыть или не плыть" со схожестью 0.82. Это подтверждает мою гипотезу об интертекстуальной связи. "И вот ты стоишь на берегу и думаешь: Плыть или не плыть?". Поэт перефразирует выражение Гамлета, меняя слово "быть" на "плыть", но синтаксическое строение фразы не меняется.
Далее я провел расчет и сравнение лексических полей. Лексические поля я искал с окном контекста плюс-минус 30 слов вокруг фраз
lexical_fields = { 'выбор': ['выбор', 'или', 'плыть', 'быть'], 'действие': ['действ', 'сдел', 'идт��', 'встать'], 'болезнь': ['больн', 'болезн', 'сумасшед', 'ум'], 'огонь': ['огонь', 'горит', 'плам', 'жж'], 'яд': ['яд', 'отрав', 'токс'], 'сталь': ['сталь', 'клин', 'оруж', 'меч'], 'хлеб': ['хлеб', 'зерн', 'семя'], 'зерно': ['зерн', 'семя', 'рост'], 'дождь': ['дождь', 'вода', 'ливень'] }
Что получилось:
Лексические поля:
выбор: 6 упоминаний
действие: 1 упоминаний
болезнь: 7 упоминаний
огонь: 1 упоминаний
яд: 2 упоминаний
сталь: 1 упоминаний
хлеб: 1 упоминаний
зерно: 0 упоминаний
дождь: 1 упоминаний

Лексическое поле "выбор" встречается часто, 6 упоминаний. Это подтверждает мою гипотезу, что центральная тема песни это проблема экзистенциального выбора. Но еще чаще встречается лексическое поле болезнь, у него 7 упоминаний. Тема сумасшествия и болезни доминирует. Даже само название песни "Мама, мы все тяжело больны" подчёркивает тему болезни, которая далее в рефрене раскроется как сумасшествие: "Мама, я знаю, мы все сошли с ума...". По сюжету английской трагедии Гамлет вынужден был притвориться больным и даже сумасшедшим, чтобы выяснить причины смерти отца.
Далее я провел анализ и сравнение семантической сети символов обоих текстов. Я создал неориентированный граф, добавил узлы с атрибутами группы, добавил ребра между совместно встречающимися символами, получил индекс для попарного сравнения и сделал срез списка для сравнения текущего элемента с последующими. В качестве смысловых символов я взял "жизнь", "смерь", "действие" и "выбор" и объединил внутри этих символов по нескольку понятий из каждого текста.
symbols = { 'жизнь': ['зерно', 'дождь', 'рост', 'хлеб', 'трава'], 'смерть': ['яд', 'кровь', 'смерть', 'клин'], 'действие': ['сталь', 'удар', 'огонь', 'бой'], 'выбор': ['берег', 'плыть', 'путь', 'двери'] }
Что получилось:
Узлов: 17, Рёбер: 16 Центральные узлы: [('дождь', 5), ('хлеб', 5), ('яд', 5), ('сталь', 5), ('удар', 5)]

Получилось 17 узлов и 16 ребер, центральными узлами стали "дождь", "хлеб", "яд", "сталь", "удар". Дождь в данном контексте символизирует помощь и рост, хлеб связан с зерном и обозначает пищу для размышлений. Яд это смерь и отравление, прямая отсылка к Гамлету. Стали и удар символизируют оружие, действие и решение. Поэт не конкретизирует, что он имеет в виду под сталью, но слушателю такое обобщение даёт возможность провести ассоциации и с пистолетом или ножом, а может быть и с рапирой. Гамлет был ранен отравленной рапирой. "Сталь" и "яд" имеют максимальный вес (5), что указывает на их центральность в семантической сети и связь с шекспировским сюжетом. Таким образом, граф сети показывает центральность образов и пересечение текстов и дополнительно раскрывает нам христианскую символику пересечения образов "хлеб-кровь-жертва".
Необычная устойчивость фигуры Цоя во времени, возможно, так и осталась бы мифом и парадоксом, если не начать рассматривать его не как музыканта, а как поэта. Python и NLP инструменты предоставляют такую возможность и помогают раскрыть новые грани этой личности.