Анализ литературных вкусов через ChatGPT: промпты, код, семантический анализ | AiManual
AiManual Logo Ai / Manual.
02 Янв 2026 Гайд

Твои литературные вкусы — это код. Давай его декомпилируем через ChatGPT

Пошаговый гайд с промптами и Python-кодом для анализа книжных предпочтений через ChatGPT. Кластеризация интересов, векторные представления, личный гайд.

Ты читаешь книги годами. У тебя в голове тонны мнений, предпочтений, ассоциаций. Но если спросить: "Какие у тебя литературные вкусы?" — ответ будет расплывчатым. "Люблю хорошую прозу", "Не люблю скучные описания", "Нравятся сильные персонажи". Клише. Штампы.

Твои вкусы — это сложный алгоритм. Неосознанный. ChatGPT может стать его декомпилятором.

💡
Это не про то, чтобы запросить у ИИ список рекомендаций. Это обратный инжиниринг твоего собственного мозга. Мы загружаем в ChatGPT данные о прочитанных книгах, получаем семантические векторы, находим паттерны и получаем карту твоих литературных предпочтений — такую же точную, как карта звёздного неба.

Почему твои интуитивные оценки — это шум

Ты говоришь "Мне понравилась 'Улисс'". Почему? "Сложный текст, игра с языком". Но на самом деле тебе понравился не "Улисс", а ощущение интеллектуального вызова. Или может быть чувство принадлежности к культурной элите. Или просто ты уважаешь Джойса как автора.

Человеческий мозг — плохой аналитик собственных предпочтений. Он подменяет реальные причины социально приемлемыми. ChatGPT лишён этой проблемы. Он видит паттерны там, где ты видишь хаос.

1Собери сырые данные: что ты на самом деле читал

Первая ошибка — пытаться анализировать по памяти. Память избирательна. Ты помнишь "Войну и мир", но забыл три детектива, которые проглотил за неделю.

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

Создай CSV-файл. Структура важнее содержания:

import pandas as pd
import json

# Пример структуры данных
books_data = [
    {
        "title": "1984",
        "author": "Джордж Оруэлл",
        "year_read": 2023,
        "rating": 9,
        "genre": "антиутопия, политическая сатира",
        "keywords": "тоталитаризм, наблюдение, свобода воли",
        "emotional_state": "тревога, осознание",
        "what_stuck": "концепция двоемыслия",
        "what_annoyed": "медленный темп в середине",
        "reread_probability": 0.3
    },
    {
        "title": "Мастер и Маргарита",
        "author": "Михаил Булгаков",
        "year_read": 2022,
        "rating": 10,
        "genre": "магический реализм, сатира",
        "keywords": "дьявол, советская Москва, любовь",
        "emotional_state": "восхищение, смех",
        "what_stuck": "образ Воланда",
        "what_annoyed": "сложные библейские отсылки",
        "reread_probability": 0.8
    }
]

# Сохраняем в JSON для ChatGPT
try:
    with open('books_analysis.json', 'w', encoding='utf-8') as f:
        json.dump(books_data, f, ensure_ascii=False, indent=2)
    print("Данные сохранены в books_analysis.json")
except Exception as e:
    print(f"Ошибка сохранения: {e}")

Минимум 20 книг. Идеально — 50-100. Если у тебя нет столько — начинай вести читательский дневник сейчас. Через полгода вернёшься к этому гайду.

2Промпт №1: Семантическое кодирование вместо тегов

Не проси ChatGPT просто "проанализировать мои вкусы". Он выдаст общие фразы. Нужно превратить качественные описания в количественные векторы.

Правильный промпт выглядит так:

Ты — литературный аналитик с PhD в computational linguistics.

У меня есть данные о прочитанных книгах в JSON-формате. Твоя задача:

1. Для КАЖДОЙ книги создай семантический вектор из 8 измерений:
   - Сложность языка (1-10): насколько сложен синтаксис, лексика
   - Темп повествования (1-10): медленный/медитативный vs быстрый/динамичный
   - Эмоциональная нагрузка (1-10): от лёгкой/развлекательной до тяжёлой/депрессивной
   - Интеллектуальный вызов (1-10): требует ли активного мышления
   - Социальная критика (1-10): насколько книга критикует общество
   - Персонаж-центричность (1-10): насколько важен внутренний мир персонажей
   - Стилистическая экспериментальность (1-10): игра с формой, нелинейность
   - Утопичность/дистопичность (1-10): оптимизм vs пессимизм в видении будущего

2. Обоснуй КАЖДУЮ оценку одной фразой на основе моих заметок.

3. Верни JSON с полями:
   - title
   - semantic_vector: [сложность, темп, эмоции, вызов, критика, персонажи, эксперимент, утопичность]
   - justification: краткое обоснование для каждого измерения

Вот данные:
[вставь содержимое books_analysis.json]

Почему именно 8 измерений? Эмпирика. Меньше — слишком грубо. Больше — ChatGPT начинает выдумывать различия. Эти 8 параметров покрывают 90% того, что отличает одну книгу от другой на уровне восприятия.

💡
ChatGPT плох в абсолютных оценках, но хорош в относительных. Если скажешь "оцени сложность 'Улисса' от 1 до 10", он даст 9 или 10. Но если попросишь оценить сложность ВСЕХ твоих книг ОТНОСИТЕЛЬНО друг друга — получишь гораздо более точную шкалу.

3Код: от векторов к кластерам

ChatGPT дал тебе 8-мерные векторы для каждой книги. Теперь нужно найти скрытые паттерны. Вручную это невозможно. Нужен Python.

Установи библиотеки:

pip install pandas numpy scikit-learn matplotlib seaborn plotly

Скрипт для кластеризации:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns

# Загружаем векторы от ChatGPT
# Предположим, ChatGPT вернул JSON с векторами
try:
    with open('semantic_vectors.json', 'r', encoding='utf-8') as f:
        books_with_vectors = json.load(f)
except FileNotFoundError:
    print("Сначала получи векторы от ChatGPT!")
    exit()

# Преобразуем в DataFrame
df = pd.DataFrame([
    {
        'title': item['title'],
        'vector': item['semantic_vector'],
        'rating': next((b['rating'] for b in books_data if b['title'] == item['title']), None)
    }
    for item in books_with_vectors
])

# Матрица векторов
X = np.array(df['vector'].tolist())

# Нормализуем
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Уменьшаем размерность для визуализации
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

df['pca1'] = X_pca[:, 0]
df['pca2'] = X_pca[:, 1]

print(f"Объяснённая дисперсия: {pca.explained_variance_ratio_}")
print(f"Первая компонента объясняет {pca.explained_variance_ratio_[0]*100:.1f}% различий")
print(f"Вторая компонента объясняет {pca.explained_variance_ratio_[1]*100:.1f}% различий")

# Определяем оптимальное число кластеров методом локтя
inertia = []
K_range = range(1, 10)

for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    kmeans.fit(X_scaled)
    inertia.append(kmeans.inertia_)

# Визуализация метода локтя
plt.figure(figsize=(10, 6))
plt.plot(K_range, inertia, 'bo-')
plt.xlabel('Число кластеров')
plt.ylabel('Инерция')
plt.title('Метод локтя для определения оптимального k')
plt.grid(True)
plt.savefig('elbow_method.png', dpi=100, bbox_inches='tight')
plt.close()

# Выбираем k (обычно там, где линия начинает выравниваться)
optimal_k = 3  # Измени на основе графика

# Кластеризация
kmeans = KMeans(n_clusters=optimal_k, random_state=42, n_init=10)
clusters = kmeans.fit_predict(X_scaled)
df['cluster'] = clusters

# Визуализация кластеров
plt.figure(figsize=(12, 8))
scatter = plt.scatter(df['pca1'], df['pca2'], c=df['cluster'], 
                     cmap='viridis', s=100, alpha=0.7)

# Подписи для некоторых книг
for i, row in df.iterrows():
    if i % 3 == 0:  # Подписываем каждую третью книгу
        plt.annotate(row['title'][:15] + '...', 
                    (row['pca1'], row['pca2']),
                    fontsize=8, alpha=0.7)

plt.xlabel(f'PCA1 ({pca.explained_variance_ratio_[0]*100:.1f}% дисперсии)')
plt.ylabel(f'PCA2 ({pca.explained_variance_ratio_[1]*100:.1f}% дисперсии)')
plt.title('Кластеризация литературных вкусов')
plt.colorbar(scatter, label='Кластер')
plt.grid(True, alpha=0.3)
plt.savefig('book_clusters.png', dpi=120, bbox_inches='tight')
plt.close()

print("\nКластеры сохранены в df['cluster']")
print(f"Распределение по кластерам:\n{df['cluster'].value_counts()}")

Этот код сделает то, что не может твой мозг: объективно разделит книги на группы по скрытым параметрам. Не по жанру. Не по автору. По тому, как ты их на самом деле воспринимаешь.

4Промпт №2: Интерпретация кластеров

У теперь есть кластеры. Книги сгруппированы. Но что это за группы? Почему "1984" оказался в одном кластере с "О дивный новый мир", а не с "Скотный двор"?

Отправь ChatGPT результаты кластеризации:

Ты — литературный критик, специализирующийся на reader-response теории.

У меня есть результаты кластеризации книг по семантическим векторам. Каждая книга описана 8-мерным вектором:
[сложность, темп, эмоции, вызов, критика, персонажи, эксперимент, утопичность]

Книги разделились на {optimal_k} кластера.

Данные кластеров:
{df.to_json(orient='records')}

Твоя задача:
1. Для каждого кластера вычисли средние значения по каждому измерению
2. Дай кластерам названия, отражающие их суть (например, "Интеллектуальные вызовы", "Эмоциональные погружения")
3. Объясни, что ОБЩЕГО у книг в каждом кластере на уровне:
   - Тематики
   - Стиля письма
   - Эмоционального воздействия
   - Читательского опыта
4. Сформулируй гипотезу: почему мне нравятся книги из каждого кластера? Что я ищу в этих книгах?
5. Выяви противоречия: если в одном кластере оказались книги, которые я оценил по-разному (например, 10 и 6 баллов), объясни это противоречие.

Верни JSON с анализом каждого кластера.

Здесь происходит магия. ChatGPT увидит, что ты, оказывается, делишь книги не на "фантастику" и "классику", а на "тексты, требующие интеллектуального усилия" и "тексты, дающие эмоциональную разрядку". Или на "книги про системное насилие" и "книги про личное сопротивление".

Внимание: ChatGPT может придумать красивые, но ложные закономерности. Всегда проверяй его выводы. Если он говорит "вам нравятся книги с сильными женскими персонажами", а в кластере только один такой персонаж — это галлюцинация. Попроси привести конкретные примеры из данных.

5Временной анализ: как менялись твои вкусы

Твои вкусы не статичны. То, что нравилось в 20, раздражает в 30. Добавь временное измерение.

# Анализ эволюции вкусов
if 'year_read' in df.columns:
    # Группируем по годам и смотрим средние векторы
    yearly_evolution = df.groupby('year_read').agg({
        'vector': lambda x: np.mean(np.array(list(x)), axis=0),
        'rating': 'mean',
        'title': 'count'
    }).reset_index()
    
    yearly_evolution.columns = ['year', 'avg_vector', 'avg_rating', 'books_count']
    
    # Преобразуем векторы обратно в список
    yearly_evolution['avg_vector'] = yearly_evolution['avg_vector'].apply(lambda x: x.tolist() if isinstance(x, np.ndarray) else x)
    
    # Визуализация изменений по измерениям
    dimensions = ['Сложность', 'Темп', 'Эмоции', 'Вызов', 'Критика', 'Персонажи', 'Эксперимент', 'Утопичность']
    
    fig, axes = plt.subplots(2, 4, figsize=(16, 10))
    axes = axes.flatten()
    
    for i, dim in enumerate(dimensions):
        # Извлекаем i-е измерение из каждого вектора
        dim_values = []
        for vec in yearly_evolution['avg_vector']:
            if vec and len(vec) > i:
                dim_values.append(vec[i])
            else:
                dim_values.append(np.nan)
        
        axes[i].plot(yearly_evolution['year'], dim_values, 'o-', linewidth=2)
        axes[i].set_title(dim)
        axes[i].set_xlabel('Год')
        axes[i].set_ylabel('Значение')
        axes[i].grid(True, alpha=0.3)
        
        # Добавляем трендовую линию
        if len(dim_values) > 1:
            x_numeric = range(len(dim_values))
            z = np.polyfit(x_numeric, dim_values, 1)
            p = np.poly1d(z)
            axes[i].plot(yearly_evolution['year'], p(x_numeric), 'r--', alpha=0.5, label='тренд')
    
    plt.tight_layout()
    plt.savefig('taste_evolution.png', dpi=120, bbox_inches='tight')
    plt.close()
    
    print("\nЭволюция вкусов визуализирована. Ищи паттерны:")
    print("- Стал ли ты больше ценить сложные тексты?")
    print("- Сдвинулся ли интерес от развлечения к интеллектуальному вызову?")
    print("- Стали ли книги более мрачными или более оптимистичными?")

Теперь попроси ChatGPT проанализировать эту эволюцию:

Проанализируй эволюцию моих литературных предпочтений по годам.

Данные:
- Средние значения по 8 измерениям для каждого года
- Количество прочитанных книг в год
- Средний рейтинг книг по годам

Тренды:
{yearly_evolution.to_json(orient='records')}

Вопросы:
1. В каком направлении эволюционировали мои вкусы? (Упрощение/усложнение, оптимизм/пессимизм и т.д.)
2. Есть ли корреляция между жизненными событиями (возраст, возможно, изменения в работе) и изменениями в предпочтениях?
3. Какие измерения изменились больше всего? Почему, по твоему мнению?
4. Если тренды сохранятся, что я буду читать через 5 лет?

Будь конкретен. Не говори "ваши вкусы стали более зрелыми". Говори "вы перешли от быстрых сюжетов к медленным психологическим исследованиям, что может указывать на..."

6Создание персонального литературного компаса

Теперь у тесть есть карта вкусов. Но карта бесполезна без компаса — инструмента для навигации.

Создай промпт-шаблон для оценки новых книг:

Ты — мой персональный литературный ассистент. У меня есть следующие паттерны в чтении:

[вставь выводы ChatGPT о твоих кластерах]

Новая книга: [название и автор]

Быстро проанализируй её по 8 измерениям (сложность, темп, эмоции, вызов, критика, персонажи, эксперимент, утопичность) и предскажи:
1. В какой из моих кластеров она вероятнее всего попадёт
2. Какую оценку я ей поставлю (от 1 до 10) с вероятностью ±1 балл
3. Что мне может понравиться/не понравиться конкретно, исходя из моих паттернов
4. Похожие книги из моего списка, которые я оценил высоко

Отвечай кратко, без вступлений.

Этот промпт — твой литературный компас. Перед покупкой новой книги запускай его. Через 10-20 предсказаний ты поймёшь, насколько ChatGPT точен в прогнозах твоих оценок. (Спойлер: точность будет пугающе высокой после калибровки на твоих данных.)

Что пойдёт не так (и как это исправить)

ПроблемаПричинаРешение
ChatGPT присваивает всем книгам средние значенияПромпт слишком общий, нет контекста для сравненияДай эталонные книги: "Сложность 'Улисса' = 9, сложность 'Гарри Поттера' = 3. Относительно них оцени остальные"
Все книги попадают в один кластерВекторы недостаточно разнообразны или k выбрано неправильноИспользуй иерархическую кластеризацию или DBSCAN вместо K-means
Анализ противоречит интуицииТы оцениваешь не объективные параметры книг, а своё эмоциональное состояние при чтенииЭто не баг, а фича. Твоё состояние — часть литературного опыта. Добавь измерение "совпадение с жизненным контекстом"
ChatGPT "галлюцинирует" связиОн пытается найти закономерности там, где их нетПопроси приводить конкретные цитаты из твоих заметок в обоснование

Что дальше? ИИ — не конец, а начало

Ты теперь знаешь свои вкусы лучше, чем 99% читателей. Но это знание — не для того, чтобы закосить в литературного сноба. Наоборот.

Используй эту карту для сознательного расширения горизонтов. Видишь, что все твои высокооценённые книги — из кластера "интеллектуальный вызов"? Специально прочти что-то из "чистого развлечения" и проанализируй, почему это не работает для тебя сейчас (а работало 5 лет назад).

Найди "слепые зоны" — измерения, где у тебя мало вариативности. Если все твои книги имеют "эмоциональную нагрузку" 7+, попробуй что-то с нагрузкой 3. Не понравится? Отлично, теперь ты понимаешь границы своего вкуса.

Самое интересное — подключить этот анализ к рекомендательным системам. Вместо "пользователям, которые читали X, также читали Y" получится "пользователям с вашим паттерном восприятия текста понравились эти книги, хотя они другого жанра".

Это не про то, чтобы делегировать свой вкус ИИ. Это про то, чтобы использовать ИИ как микроскоп для изучения собственного восприятия. Ты остаёшься главным критиком. ChatGPT — всего лишь очень внимательный лаборант, который записывает данные.

💡
Сохрани все промпты и код. Через год повтори анализ с новыми книгами. Сравни карты. Увидишь, как меняется не только то, что ты читаешь, но и то, как ты это читаешь. Это и есть самый ценный инсайт — осознание собственной эволюции как читателя.

Кстати, если хочешь глубже погрузиться в работу с ChatGPT, посмотри как настроить темперамент ChatGPT — это поможет калибровать его тон под литературный анализ. А если захочешь автоматизировать процесс полностью, этот гайд по коду на Python будет полезен.

Литературные вкусы — это не дар богов и не приговор. Это код. А любой код можно декомпилировать, проанализировать и переписать. Удачи в рефакторинге.