This commit is contained in:
2026-02-01 17:01:21 +03:00
commit 9575eaf8ee
144 changed files with 24025 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,41 @@
# Анализ главы по блокам
Анализ выполняется последовательно по четырём блокам. Каждый следующий шаг получает **весь накопленный JSON** (уже извлечённые блоки) для согласованности. После каждого блока — валидация (см. `2_валидация_анализа_по_блокам/`), затем склейка.
## Входные данные (JSON)
Вход этапа 1 — один JSON-файл на главу. Поля используются в подстановках промптов и передаются по пайплайну до шага 7 (payload в Qdrant).
| Поле | Тип | Обязательно | Описание |
|------|-----|-------------|----------|
| `book_id` | string (UUID) | да | ID книги |
| `chapter_id` | string (UUID) | да | ID главы (на шаге 7 — id точки в Qdrant) |
| `chapter_number` | integer | да | Номер главы |
| `chapter_title` | string | да | Название главы → `{chapter_title}` |
| `book_title` | string | да | Название книги → `{book_title}` |
| `chapter_text` | string | да | Текст главы → `{chapter_text}` |
| `author` | string | нет | Автор книги (для payload на шаге 7) |
**Файлы:** ход_главы.spec.json` — описание формата (JSON Schema); ход_главы.example.json` — пример. Имя входного файла на главу — на усмотрение пайплайна (например `input.json` или `{book_id}_{chapter_id}.json`).
## Порядок генерации
| Шаг | Промпт | Вход | Выход |
|-----|--------|------|-------|
| 1 | extract_framework.txt | текст главы | `framework` |
| 2 | extract_insights.txt | текст главы + framework | `insights` |
| 3 | extract_application.txt | текст главы + framework + insights | `application` |
| 4 | extract_limitations.txt | текст главы + framework + insights + application | `limitations` |
## Подстановки в промптах
- **Во всех:** `{book_title}`, `{chapter_title}`, `{chapter_text}`
- **Только в шагах 24:** `{previous_blocks_json}` — весь накопленный JSON (все уже завалидированные предыдущие блоки). Пример: для extract_insights подставляем только `framework`; для extract_application — объект с ключами `framework` и `insights`; для extract_limitations — объект с `framework`, `insights`, `application`.
## Склейка
Четыре ответа (по одному JSON-объекту с ключом framework / insights / application / limitations) объединяются в один анализ: слияние ключей верхнего уровня без вызова LLM.
## Монолитный промпт
`chapter_analysis_qwen3_prompt.txt` — исходный промпт «всё в одном»; оставлен для сравнения и отката.

View File

@@ -0,0 +1,67 @@
Ты — эксперт по анализу нон-фикшн.
Извлеки из главы только блок «применение» (application):
конкретные техники и практические шаги.
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Уже извлечённые блоки framework и insights (для согласованности): {previous_blocks_json}
---
## ЗАДАЧА
Извлеки техники и упражнения: название, цель, пошаговые шаги (steps), пример контекста, фразу для клиента, измеримые критерии успеха. Техники должны опираться на принципы (framework) и инсайты; не придумывай то, чего нет в тексте.
- Объединяй по сути одну и ту же технику: не дублируй её под разными названиями; если в главе несколько вариантов одной идеи — одна техника с уточнёнными шагами.
- Краевые случаи: если в главе описана одна техника — верни один элемент в techniques. Если явных техник или упражнений в главе нет — верни пустой массив: "techniques": []. Не придумывай техники ради заполнения.
## СТРОГИЕ ПРАВИЛА
1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц.
2. Язык простой, разговорно-профессиональный. При первом использовании в goal, steps или client_phrase слов «триггер», «стимул», «паттерн» и т.п. добавь в скобках пояснение в 37 слов, например: стимул (то, что в окружении запускает действие).
3. Каждая техника должна быть:
- понятна без дополнительного объяснения;
- приземлена к реальному поведению и к повседневной ситуации (работа, дом, отношения);
- у каждой техники обязательно заполни context_example: один бытовой пример ситуации, где техника применима.
4. steps — только из текста главы; без выдуманных шагов. При необходимости добавь шаг про отслеживание результата (что записать или отметить).
5. success_criteria — как можно более измеримо: укажи, что именно должно измениться (частота, длительность, количество эпизодов) и за какой промежуток времени (например: «количество эпизодов X снижается с N до M в течение T дней»).
6. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные.
7. Не используй вводные фразы, обращение к читателю и объяснения формата.
---
## КРИТИЧНО ДЛЯ ФОРМАТА
- steps — только из текста главы; не выдумывай шаги.
- У каждой техники — context_example с одним бытовым примером ситуации (работа, дом, отношения).
- success_criteria — измеримый критерий: что меняется (частота/длительность/количество), за какой срок; без размытых формулировок.
- Если в главе нет описанных техник или упражнений — верни "techniques": [].
- Не дублируй по сути одну технику под разными названиями.
---
## ФОРМАТ ОТВЕТА
Строго один JSON-объект с единственным ключом верхнего уровня "application", без комментариев и markdown:
{
"application": {
"techniques": [
{
"name": "Название техники или упражнения",
"goal": "Какую конкретную привычку, навык или поведение это помогает изменить",
"context_example": "Короткий пример жизненной ситуации, где техника применима (например: вечер после работы, когда тянет залипнуть в телефон)",
"steps": [
"Шаг 1: ... (при необходимости — мини-рефлексия или запись наблюдений)",
"Шаг 2: ...",
"Шаг 3: ... (при необходимости — шаг про отслеживание результата: что записать или отметить)"
],
"client_phrase": "Как это просто объяснить или сформулировать для клиента",
"success_criteria": "Измеримый критерий: что именно меняется (частота, длительность, количество эпизодов) и за какой срок (например: количество эпизодов X снижается с N до M в течение T дней)"
}
]
}
}
Верни только этот объект — ничего до и после.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,64 @@
Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «каркас» (framework): принципы и цепочки причина–механизм–результат.
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
---
## ЗАДАЧА
Извлеки фундаментальные принципы и опорные идеи автора. Для каждого принципа — цепочки cause → mechanism → result (что запускает, как работает, к чему приводит).
- Если у одной идеи в главе несколько разных сценариев (разные причины или результаты) — приведи для неё несколько цепочек (23), а не одну.
- Объединяй перекрывающиеся идеи: один принцип = одна опорная мысль. Не дублируй одну и ту же мысль под разными названиями.
## СТРОГИЕ ПРАВИЛА
1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц.
2. Язык простой, разговорно-профессиональный. Все специальные термины из главы (паттерны, триггеры, автоматизация, подкрепление и т.п.) обязательно внеси в блок "terms" и дай к каждому пояснение в 37 слов: что это значит для обычного человека в поведении.
3. Каждый принцип и каждая цепочка должны быть:
- понятны без дополнительного объяснения;
- приземлены к реальному поведению (что человек делает иначе);
- у каждого принципа обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения).
4. Избегай чрезмерной абстракции и канцелярита. Живая, но точная формулировка (например: не «Парадокс воли: повышение дисциплины требует…», а «Чтобы не собирать волю в кулак каждый раз, среду нужно настроить так, чтобы правильное действие было самым лёгким по умолчанию»).
5. Не используй вводные фразы, обращение к читателю и объяснения формата.
---
## КРИТИЧНО ДЛЯ ФОРМАТА
- Блок "terms" должен быть заполнен: все термины из твоего ответа с короткими пояснениями.
- У каждого принципа — массив "chains" с минимум одной цепочкой; при нескольких сценариях — несколько цепочек.
- У каждого принципа — поле "example" с одним бытовым примером в одну фразу.
---
## ФОРМАТ ОТВЕТА
Строго один JSON-объект с единственным ключом верхнего уровня "framework", без комментариев и markdown:
{
"framework": {
"terms": {
ермин1": "пояснение в 37 слов для обычного человека",
ермин2": "пояснение в 37 слов"
},
"principles": [
{
"title": "Краткое название принципа",
"description": "Живая формулировка с пояснением, как проявляется в жизни",
"example": "Один бытовой пример в одну фразу: работа, дом или отношения",
"chains": [
{
"cause": "Причина или ситуация, с которой всё начинается",
"mechanism": "Что происходит / какой процесс запускается",
"result": "К какому результату это приводит для человека"
}
]
}
]
}
}
Верни только этот объект — ничего до и после.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,54 @@
Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «инсайты» (insights): практически значимые понимания.
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Уже извлечённый блок framework (для согласованности): {previous_blocks_json}
---
## ЗАДАЧА
Извлеки инсайты — то, что человек по-новому понимает о себе/людях/среде и как это меняет поведение в конкретных ситуациях.
- Инсайты должны согласовываться с уже извлечённым framework; не противоречь принципам.
- Объединяй перекрывающиеся инсайты: один инсайт = одно понимание. Не дублируй одну мысль под разными названиями.
- Инсайт — это вывод или новое понимание, которое меняет поведение. Не включай в список определения терминов (что такое стимул, триггер и т.п.); определения остаются в framework. Если формулировка отвечает на вопрос «что это такое?», а не «что из этого следует для человека?» — это не инсайт.
## СТРОГИЕ ПРАВИЛА
1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц.
2. Язык простой, разговорно-профессиональный. При первом использовании в description слов «триггер», «стимул», «паттерн», «подкрепление» и т.п. добавь в скобках пояснение в 37 слов, например: триггер (то, что запускает действие почти автоматически).
3. Каждый инсайт должен быть:
- понятен без дополнительного объяснения;
- приземлён к реальному поведению (что человек делает иначе);
- у каждого инсайта обязательно заполни поле "example": один бытовой пример в одну фразу (работа, дом, отношения).
4. Избегай чрезмерной абстракции и канцелярита; используй живую, но точную формулировку.
5. Не используй вводные фразы, обращение к читателю и объяснения формата.
---
## КРИТИЧНО ДЛЯ ФОРМАТА
- Инсайты не противоречат принципам из переданного framework.
- У каждого инсайта — поле "example" с одним бытовым примером в одну фразу.
- Не дублируй перекрывающиеся инсайты: перед добавлением проверь — не выражает ли новый инсайт ту же опорную мысль, что уже есть в списке? Одна мысль («среда важнее силы воли», «привычка не забывается» и т.д.) = один инсайт. Ориентир: 47 инсайтов без смысловых дублей.
- Не включай определения терминов как отдельные инсайты; только выводы и понимания.
---
## ФОРМАТ ОТВЕТА
Строго один JSON-объект с единственным ключом верхнего уровня "insights", без комментариев и markdown:
{
"insights": [
{
"title": "Краткое название инсайта",
"description": "Что человек по-новому понимает и как это меняет поведение в конкретных ситуациях",
"example": "Один бытовой пример в одну фразу: работа, дом или отношения"
}
]
}
Верни только этот объект — ничего до и после.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,58 @@
Ты — эксперт по анализу нон-фикшн. Извлеки из главы только блок «ограничения» (limitations): риски и узкие места применения идей.
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Уже извлечённые блоки framework, insights, application (для согласованности): {previous_blocks_json}
---
## ЗАДАЧА
Извлеки ограничения: при каких условиях описанные идеи и техники не сработают или дадут риски. Ограничения должны относиться к уже извлечённым принципам и техникам; не противоречь им.
- Объединяй перекрывающиеся ограничения: одно ограничение = один тип риска или условия. Не дублируй одну мысль под разными формулировками. Один тип риска = один пункт (например: «внутренние эмоции» и «привычка на уровне нейронов/внутренних триггеров» — один тип риска «причина внутри, а не в среде»; не оформляй двумя разными пунктами).
- Ограничение — это конкретное условие или ситуация, при которых идеи/техники не сработают или дадут риски. Не включай общие truisms («всё индивидуально», «зависит от человека»); только ограничения с опорой в тексте или следующие из переданных принципов и техник.
- Краевой случай: если в главе нет явных ограничений, рисков или узких мест — верни пустой массив: "limitations": []. Не придумывай ограничения ради заполнения.
- Ориентир: 25 ограничений без смысловых дублей.
## СТРОГИЕ ПРАВИЛА
1. Не пересказывай текст и не цитируй большие фрагменты; работай на уровне обобщений и смысловых единиц.
2. Язык простой, разговорно-профессиональный. При первом использовании по порядку в списке ограничений слов «триггер», «стимул», «паттерн» и т.п. обязательно добавь в скобках пояснение в 37 слов, например: триггер (то, что в окружении запускает действие). В следующих пунктах тот же термин можно использовать без повторного пояснения.
3. Каждое ограничение должно быть:
- понятно без дополнительного объяснения;
- приземлено к реальным ситуациям (работа, дом, отношения);
- у каждого ограничения обязательно заполни поле "example": один бытовой пример ситуации, когда это ограничение проявляется (в одну фразу).
4. when_relevant — в каких ситуациях, контекстах или для каких людей это ограничение особенно важно учитывать.
5. Избегай чрезмерной абстракции и канцелярита; формулировки живые, но точные.
6. Не используй вводные фразы, обращение к читателю и объяснения формата.
---
## КРИТИЧНО ДЛЯ ФОРМАТА
- Ограничения не противоречат принципам и техникам из переданных блоков; они указывают, когда идеи не сработают или дадут риски.
- У каждого ограничения — поле "example" с одним бытовым примером ситуации в одну фразу (работа, дом, отношения).
- Не дублируй перекрывающиеся ограничения: перед добавлением проверь — не описывает ли новый пункт тот же тип риска, что уже есть? Если два пункта по смыслу про одно (например, «когда причина привычки внутренняя»), объедини в один.
- В первом по порядку ограничении, где встречается «триггер» или «стимул», дай пояснение в скобках (37 слов).
- Если в главе нет описанных ограничений или рисков — верни "limitations": [].
- Не включай общие truisms; только конкретные ограничения с опорой в тексте или в переданных блоках.
---
## ФОРМАТ ОТВЕТА
Строго один JSON-объект с единственным ключом верхнего уровня "limitations", без комментариев и markdown:
{
"limitations": [
{
"description": "Риск или узкое место при применении идей на практике",
"when_relevant": "В каких ситуациях или для каких людей это важно учитывать",
"example": "Один бытовой пример ситуации, когда это ограничение проявляется (работа, дом или отношения)"
}
]
}
Верни только этот объект — ничего до и после.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,159 @@
{
"framework": {
"terms": {
"стимул": "что в окружающей среде заставляет человека действовать",
"привычка": "повторяющееся действие, которое становится автоматическим",
"подкрепление": "воздействие, усиливающее вероятность повторения действия",
"среда": "окружение, влияющее на поведение через стимулы и ограничения",
"желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером",
"аутокаталитический процесс": "процесс, усиливающий себя сам"
},
"principles": [
{
"title": "Среда формирует поведение",
"description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети",
"chains": [
{
"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки",
"mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие",
"result": "Человек повторяет вредную привычку, не осознавая этого"
},
{
"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку",
"mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки",
"result": "Человек реже проявляет нежелательное поведение"
}
]
},
{
"title": "Привычки не исчезают, они только временно подавлены",
"description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях",
"example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил",
"chains": [
{
"cause": "Человек прекращает проявлять вредную привычку",
"mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой",
"result": "Привычка может вернуться, если появятся подходящие стимулы"
},
{
"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой",
"mechanism": "Стимулы запускают автоматические паттерны поведения",
"result": "Человек снова начинает делать то, что уже перестал"
}
]
},
{
"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент",
"description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст",
"example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня",
"chains": [
{
"cause": "Человек пытается контролировать себя в момент искушения",
"mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда",
"result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"
},
{
"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными",
"mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными",
"result": "Человек реже сталкивается с искушением"
}
]
},
{
"title": "Дисциплина — это настройка среды, а не внутреннее усилие",
"description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели",
"example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов",
"chains": [
{
"cause": "Человек пытается быть дисциплинированным только силой воли",
"mechanism": "Это требует большого количества энергии и часто неудачно",
"result": "Человек теряет мотивацию и возвращается к нежелательному поведению"
},
{
"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким",
"mechanism": "Стимулы для правильных действий становятся более доступными",
"result": "Человек чаще выбирает здоровые привычки"
}
]
},
{
"title": "Негативные эмоции усиливают негативное поведение",
"description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам",
"example": "Человек садится на диван и ест шоколад, когда ему плохо",
"chains": [
{
"cause": "Человек испытывает стресс или негативные эмоции",
"mechanism": "Это активирует привычку, которая помогает снизить дискомфорт",
"result": "Человек снова начинает делать то, что раньше снимало напряжение"
},
{
"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду",
"mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию",
"result": "Человек возвращается к нежелательной привычке"
}
]
}
]
},
"insights": [
{
"title": "Среда влияет на привычки больше, чем сила воли",
"description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"
},
{
"title": "Привычки не исчезают, только временно подавляются",
"description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях",
"example": "После посещения бара человек снова начинает пить, не осознавая этого"
},
{
"title": "Негативные эмоции усиливают вредное поведение",
"description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам",
"example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"
},
{
"title": "Сокращение стимулов уменьшает повторение нежелательного поведения",
"description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления",
"example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"
},
{
"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение",
"description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем",
"example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"
}
],
"application": {
"techniques": [
{
"name": "Снижение доступности стимула",
"goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров",
"context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети",
"steps": [
"Определите конкретный стимул (например, наличие телефона на столе)",
"Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)",
"Запишите дату и время изменения (для отслеживания эффективности)"
],
"client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным",
"success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 12 раз/день за 2 недели"
}
]
},
"limitations": [
{
"description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула",
"when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке",
"example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"
},
{
"description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение",
"when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды",
"example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"
},
{
"description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками",
"when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления",
"example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую"
}
]
}

View File

@@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""
Скрипт объединения нескольких JSON-файлов в один.
Файлы должны лежать в том же каталоге, что и скрипт. Каждый файл — один JSON-объект;
результат — один объект, собранный из верхнеуровневых ключей всех файлов.
При совпадении ключей побеждает значение из файла, идущего позже в списке.
"""
import argparse
import json
from pathlib import Path
def get_script_dir() -> Path:
"""Возвращает каталог, в котором расположен скрипт."""
return Path(__file__).resolve().parent
def merge_json_files(
filenames: list[str],
base_dir: Path,
output_path: Path,
indent: int | None = 2,
) -> None:
"""
Читает перечисленные JSON-файлы из base_dir и записывает объединённый объект в output_path.
Args:
filenames: Список имён файлов (без пути).
base_dir: Каталог с входными файлами.
output_path: Полный путь к результирующему JSON-файлу.
indent: Отступ для форматирования JSON (по умолчанию 2).
Raises:
FileNotFoundError: Если какой-либо входной файл не найден.
json.JSONDecodeError: Если содержимое файла не является валидным JSON.
"""
result: dict = {}
for name in filenames:
path = base_dir / name
if not path.is_file():
raise FileNotFoundError(f"Файл не найден: {path}")
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
if not isinstance(data, dict):
raise TypeError(
f"Файл {name} должен содержать JSON-объект (dict), получен: {type(data).__name__}"
)
result.update(data)
with open(output_path, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=indent)
def main() -> None:
"""Точка входа: разбор аргументов и вызов объединения."""
script_dir = get_script_dir()
parser = argparse.ArgumentParser(
description="Объединить несколько JSON-файлов из каталога скрипта в один файл."
)
parser.add_argument(
"files",
nargs="+",
metavar="FILE",
help="Имена JSON-файлов (в каталоге скрипта)",
)
parser.add_argument(
"-o",
"--output",
default="merged.json",
metavar="OUTPUT",
help="Имя результирующего файла (по умолчанию: merged.json)",
)
parser.add_argument(
"--no-indent",
action="store_true",
help="Не форматировать вывод (компактный JSON)",
)
args = parser.parse_args()
output_path = script_dir / args.output
indent = None if args.no_indent else 2
merge_json_files(
filenames=args.files,
base_dir=script_dir,
output_path=output_path,
indent=indent,
)
print(f"Записано: {output_path}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,119 @@
#!/usr/bin/env python3
"""
Один запуск блока framework через Ollama (qwen3:14b) для сравнения с эталоном выход_frame.json.
Вход: вход_главы.json, промпт extract_framework_v2.txt.
Выход: выход_frame_ollama.json и краткое сравнение с выход_frame.json.
"""
import json
import re
import sys
import time
import urllib.request
from pathlib import Path
OLLAMA_URL = "http://localhost:11434"
MODEL = "qwen3:14b"
DIR = Path(__file__).resolve().parent
def load_input() -> dict:
with open(DIR / "вход_главы.json", encoding="utf-8") as f:
return json.load(f)
def load_prompt() -> str:
with open(DIR / "extract_framework_v2.txt", encoding="utf-8") as f:
return f.read()
def substitute_prompt(prompt: str, data: dict) -> str:
return prompt.replace("{book_title}", data.get("book_title", "")).replace(
"{chapter_title}", data.get("chapter_title", "")
).replace("{chapter_text}", data.get("chapter_text", ""))
def extract_json_from_response(text: str) -> dict:
"""Достаёт JSON из ответа модели (может быть обёрнут в ```json ... ```)."""
text = text.strip()
match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
if match:
text = match.group(1).strip()
return json.loads(text)
def call_ollama(prompt: str) -> str:
body = json.dumps(
{
"model": MODEL,
"messages": [{"role": "user", "content": prompt}],
"stream": False,
"format": "json",
},
ensure_ascii=False,
).encode("utf-8")
req = urllib.request.Request(
f"{OLLAMA_URL}/api/chat",
data=body,
headers={"Content-Type": "application/json"},
method="POST",
)
try:
# Таймаут отключён — ждём завершения генерации (может быть 10+ минут на CPU)
with urllib.request.urlopen(req, timeout=None) as resp:
data = json.load(resp)
return data.get("message", {}).get("content", "")
except urllib.error.HTTPError as e:
body = ""
if e.fp:
try:
body = e.fp.read().decode("utf-8", errors="replace")[:1000]
except Exception:
pass
raise RuntimeError(f"Ollama HTTP {e.code}: {e.reason}. Body: {body}") from e
def main() -> int:
print("Загрузка вход_главы.json и промпта...")
inp = load_input()
prompt_tpl = load_prompt()
prompt = substitute_prompt(prompt_tpl, inp)
print(f"Вызов Ollama {MODEL} (таймаут отключён, ждём завершения)...")
t0 = time.monotonic()
try:
raw = call_ollama(prompt)
except Exception as e:
print(f"Ошибка вызова Ollama: {e}", file=sys.stderr)
return 1
elapsed = time.monotonic() - t0
print(f"Ответ получен за {elapsed:.1f} сек ({elapsed / 60:.1f} мин)")
try:
result = extract_json_from_response(raw)
except json.JSONDecodeError as e:
print(f"Не удалось распарсить JSON из ответа: {e}", file=sys.stderr)
print("Первые 500 символов ответа:", raw[:500], file=sys.stderr)
return 1
out_path = DIR / "выход_frame_ollama.json"
with open(out_path, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print(f"Результат сохранён: {out_path}")
# Сравнение с эталоном
ref_path = DIR / "выход_frame.json"
if ref_path.exists():
with open(ref_path, encoding="utf-8") as f:
ref = json.load(f)
fw_ollama = result.get("framework", {})
fw_ref = ref.get("framework", {})
terms_o = len(fw_ollama.get("terms", {}))
terms_r = len(fw_ref.get("terms", {}))
principles_o = len(fw_ollama.get("principles", []))
principles_r = len(fw_ref.get("principles", []))
print("\n--- Сравнение с эталоном выход_frame.json ---")
print(f" principles: эталон {principles_r}, Ollama {principles_o}")
print(f" terms: эталон {terms_r}, Ollama {terms_o}")
return 0
if __name__ == "__main__":
sys.exit(main())

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
{
"book_id": "00000000-0000-0000-0000-000000000001",
"chapter_id": "00000000-0000-0000-0000-000000000002",
"chapter_number": 7,
"chapter_title": "Секрет самоконтроля",
"book_title": "Атомные привычки",
"chapter_text": "В 1971 году, когда шел шестнадцатый год войны во Вьетнаме...",
"author": "Джеймс Клир"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Вход шага 1 — анализ главы",
"description": "Единый входной JSON для этапа 1 (анализ по блокам). Метаданные используются в подстановках промптов и передаются по пайплайну до шага 7 (Qdrant payload).",
"type": "object",
"required": ["book_id", "chapter_id", "chapter_number", "chapter_title", "book_title", "chapter_text"],
"properties": {
"book_id": {
"type": "string",
"description": "UUID книги"
},
"chapter_id": {
"type": "string",
"description": "UUID главы (используется как id точки в Qdrant на шаге 7)"
},
"chapter_number": {
"type": "integer",
"description": "Номер главы в книге"
},
"chapter_title": {
"type": "string",
"description": "Название главы (подстановка {chapter_title} в промптах)"
},
"book_title": {
"type": "string",
"description": "Название книги (подстановка {book_title} в промптах)"
},
"chapter_text": {
"type": "string",
"description": "Текст главы (подстановка {chapter_text} в промптах)"
},
"author": {
"type": "string",
"description": "Автор книги (опционально; для payload на шаге 7)"
}
}
}

View File

@@ -0,0 +1,18 @@
{
"application": {
"techniques": [
{
"name": "Снижение доступности стимула",
"goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров",
"context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети",
"steps": [
"Определите конкретный стимул (например, наличие телефона на столе)",
"Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)",
"Запишите дату и время изменения (для отслеживания эффективности)"
],
"client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным",
"success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 12 раз/день за 2 недели"
}
]
}
}

View File

@@ -0,0 +1,99 @@
{
"framework": {
"terms": {
"стимул": "что в окружающей среде заставляет человека действовать",
"привычка": "повторяющееся действие, которое становится автоматическим",
"подкрепление": "воздействие, усиливающее вероятность повторения действия",
"среда": "окружение, влияющее на поведение через стимулы и ограничения",
"желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером",
"аутокаталитический процесс": "процесс, усиливающий себя сам"
},
"principles": [
{
"title": "Среда формирует поведение",
"description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети",
"chains": [
{
"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки",
"mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие",
"result": "Человек повторяет вредную привычку, не осознавая этого"
},
{
"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку",
"mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки",
"result": "Человек реже проявляет нежелательное поведение"
}
]
},
{
"title": "Привычки не исчезают, они только временно подавлены",
"description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях",
"example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил",
"chains": [
{
"cause": "Человек прекращает проявлять вредную привычку",
"mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой",
"result": "Привычка может вернуться, если появятся подходящие стимулы"
},
{
"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой",
"mechanism": "Стимулы запускают автоматические паттерны поведения",
"result": "Человек снова начинает делать то, что уже перестал"
}
]
},
{
"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент",
"description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст",
"example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня",
"chains": [
{
"cause": "Человек пытается контролировать себя в момент искушения",
"mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда",
"result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"
},
{
"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными",
"mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными",
"result": "Человек реже сталкивается с искушением"
}
]
},
{
"title": "Дисциплина — это настройка среды, а не внутреннее усилие",
"description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели",
"example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов",
"chains": [
{
"cause": "Человек пытается быть дисциплинированным только силой воли",
"mechanism": "Это требует большого количества энергии и часто неудачно",
"result": "Человек теряет мотивацию и возвращается к нежелательному поведению"
},
{
"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким",
"mechanism": "Стимулы для правильных действий становятся более доступными",
"result": "Человек чаще выбирает здоровые привычки"
}
]
},
{
"title": "Негативные эмоции усиливают негативное поведение",
"description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам",
"example": "Человек садится на диван и ест шоколад, когда ему плохо",
"chains": [
{
"cause": "Человек испытывает стресс или негативные эмоции",
"mechanism": "Это активирует привычку, которая помогает снизить дискомфорт",
"result": "Человек снова начинает делать то, что раньше снимало напряжение"
},
{
"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду",
"mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию",
"result": "Человек возвращается к нежелательной привычке"
}
]
}
]
}
}

View File

@@ -0,0 +1,29 @@
{
"insights": [
{
"title": "Среда влияет на привычки больше, чем сила воли",
"description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"
},
{
"title": "Привычки не исчезают, только временно подавляются",
"description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях",
"example": "После посещения бара человек снова начинает пить, не осознавая этого"
},
{
"title": "Негативные эмоции усиливают вредное поведение",
"description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам",
"example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"
},
{
"title": "Сокращение стимулов уменьшает повторение нежелательного поведения",
"description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления",
"example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"
},
{
"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение",
"description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем",
"example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"
}
]
}

View File

@@ -0,0 +1,19 @@
{
"limitations": [
{
"description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула",
"when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке",
"example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"
},
{
"description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение",
"when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды",
"example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"
},
{
"description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками",
"when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления",
"example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую"
}
]
}

View File

@@ -0,0 +1,24 @@
# Валидация анализа по блокам
Отдельный промпт на каждый блок анализа главы. Цель — повысить качество проверки за счёт узкого фокуса.
## Блоки и промпты
| Блок | Файл промпта | Что проверяем |
|-------------|------------------------|----------------------------------------|
| framework | validate_framework.txt | Принципы, цепочки causemechanismresult |
| insights | validate_insights.txt | Инсайты (title, description) |
| application | validate_application.txt | Техники (name, goal, steps) |
| limitations | validate_limitations.txt | Ограничения, оговорки |
## Подстановки в промптах
- `{book_title}` — название книги
- `{chapter_title}` — название главы
- `{chapter_text}` — текст главы
- `{framework_json}` — JSON блока `framework`
- `{insights_json}` — JSON блока `insights`
- `{application_json}` — JSON блока `application`
- `{limitations_json}` — JSON блока `limitations`
Промпты рассчитаны на тестирование по одному; доработка — по результатам прогонов.

View File

@@ -0,0 +1,43 @@
Ты валидатор блока application (техники). Проверь ТОЛЬКО этот блок.
Данные:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Блок application (JSON): {application_json}
---
## ЗАДАЧА
Проверь соответствие блока application тексту главы:
1. Каждая техника (name, goal, steps) должна иметь опору в тексте (описание метода, примеры, рекомендации).
2. Утверждения или шаги без опоры в тексте — галлюцинации.
3. Описанные в тексте техники/методы, которых нет в блоке — пропуски.
Проверяй идеи и шаги, а не формулировки. steps особенно важны — они должны быть из текста, а не придуманы.
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"hallucinations": [
{
"location": "application/techniques[0]/steps",
"summary": "В анализе шаг '[цитата]', в тексте такого нет"
}
],
"missing_key_points": [
{
"summary": "В тексте описана техника X, в application её нет",
"evidence": "краткая отсылка к тексту"
}
]
}
VERDICT: ok — проблем нет; needs_review — 12 замечания; bad — галлюцинации в steps или много пропусков.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,43 @@
Ты валидатор блока framework (принципы и цепочки причина–механизм–результат). Проверь ТОЛЬКО этот блок.
Данные:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Блок framework (JSON): {framework_json}
---
## ЗАДАЧА
Проверь соответствие блока framework тексту главы:
1. Каждое утверждение в principles/description и chains (cause, mechanism, result) должно иметь опору в тексте.
2. Утверждения без опоры в тексте — галлюцинации.
3. Ключевые принципы/цепочки из текста, которых нет в блоке — пропуски.
Проверяй идеи, а не формулировки. Одна и та же мысль другими словами — не ошибка.
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"hallucinations": [
{
"location": "framework/principles[0]/chains[0]/mechanism",
"summary": "В анализе: '[цитата]', в тексте такого нет"
}
],
"missing_key_points": [
{
"summary": "В тексте описан принцип X, в framework его нет",
"evidence": "краткая отсылка к тексту"
}
]
}
VERDICT: ok — проблем нет; needs_review — есть 12 замечания; bad — много галлюцинаций или пропусков.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,43 @@
Ты валидатор блока insights (инсайты). Проверь ТОЛЬКО этот блок.
Данные:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Блок insights (JSON): {insights_json}
---
## ЗАДАЧА
Проверь соответствие блока insights тексту главы:
1. Каждый инсайт (title, description) должен иметь опору в тексте.
2. Утверждения без опоры — галлюцинации.
3. Важные инсайты из текста, которых нет в блоке — пропуски.
Проверяй идеи, а не формулировки.
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"hallucinations": [
{
"location": "insights[0]/description",
"summary": "В анализе: '[цитата]', в тексте такого нет"
}
],
"missing_key_points": [
{
"summary": "В тексте явный инсайт X, в insights его нет",
"evidence": "краткая отсылка к тексту"
}
]
}
VERDICT: ok — проблем нет; needs_review — 12 замечания; bad — много галлюцинаций или пропусков.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,43 @@
Ты валидатор блока limitations (ограничения, оговорки). Проверь ТОЛЬКО этот блок.
Данные:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Текст главы: {chapter_text}
- Блок limitations (JSON): {limitations_json}
---
## ЗАДАЧА
Проверь соответствие блока limitations тексту главы:
1. Каждое ограничение (description, при необходимости when_relevant) должно иметь опору в тексте или логично следовать из содержания главы.
2. Ограничения, которых нет в тексте и которые не вытекают из него — галлюцинации.
3. Важные оговорки/ограничения из текста, которых нет в блоке — пропуски.
Проверяй идеи. Допустимы разумные выводы из текста (например, «метод не мгновенный» при описании постепенных изменений).
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"hallucinations": [
{
"location": "limitations[0]/description",
"summary": "В анализе: '[цитата]', в тексте такого нет и не следует из него"
}
],
"missing_key_points": [
{
"summary": "В тексте есть оговорка X, в limitations её нет",
"evidence": "краткая отсылка к тексту"
}
]
}
VERDICT: ok — проблем нет; needs_review — 12 замечания; bad — выдуманные ограничения или существенные пропуски.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,21 @@
# Финальная валидация согласованности (шаг 2b)
Проверка связей между блоками полного анализа главы после склейки. Соответствие тексту главы не проверяется — оно уже обеспечено валидацией по блокам (каталог `2_валидация_анализа_по_блокам/`).
## Промпт
| Файл | Назначение |
|--------------------------|-------------------------------------------------|
| validate_consistency.txt | Проверка согласованности framework, insights, application, limitations |
## Подстановки
- `{book_title}` — название книги
- `{chapter_title}` — название главы
- `{full_analysis_json}` — полный JSON анализа (склейка блоков framework + insights + application + limitations)
## Использование
Вызывается после шага 2a (склейка блоков). При вердикте bad или needs_review — флаг `needs_review` по главе; опционально — «примиряющий» промпт для минимальных правок.
Выход 2b (merge.json) вместе с выходом шага 4 (валидация тегов) подаётся в **шаг 5 — мерж анализа и тегов** (`5_мерж_анализа_и_тегов/`). Результат мержа — вход для шага 6 (генерация эмбеддингов).

View File

@@ -0,0 +1,159 @@
{
"framework": {
"terms": {
"стимул": "что в окружающей среде заставляет человека действовать",
"привычка": "повторяющееся действие, которое становится автоматическим",
"подкрепление": "воздействие, усиливающее вероятность повторения действия",
"среда": "окружение, влияющее на поведение через стимулы и ограничения",
"желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером",
"аутокаталитический процесс": "процесс, усиливающий себя сам"
},
"principles": [
{
"title": "Среда формирует поведение",
"description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети",
"chains": [
{
"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки",
"mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие",
"result": "Человек повторяет вредную привычку, не осознавая этого"
},
{
"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку",
"mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки",
"result": "Человек реже проявляет нежелательное поведение"
}
]
},
{
"title": "Привычки не исчезают, они только временно подавлены",
"description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях",
"example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил",
"chains": [
{
"cause": "Человек прекращает проявлять вредную привычку",
"mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой",
"result": "Привычка может вернуться, если появятся подходящие стимулы"
},
{
"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой",
"mechanism": "Стимулы запускают автоматические паттерны поведения",
"result": "Человек снова начинает делать то, что уже перестал"
}
]
},
{
"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент",
"description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст",
"example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня",
"chains": [
{
"cause": "Человек пытается контролировать себя в момент искушения",
"mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда",
"result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"
},
{
"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными",
"mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными",
"result": "Человек реже сталкивается с искушением"
}
]
},
{
"title": "Дисциплина — это настройка среды, а не внутреннее усилие",
"description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели",
"example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов",
"chains": [
{
"cause": "Человек пытается быть дисциплинированным только силой воли",
"mechanism": "Это требует большого количества энергии и часто неудачно",
"result": "Человек теряет мотивацию и возвращается к нежелательному поведению"
},
{
"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким",
"mechanism": "Стимулы для правильных действий становятся более доступными",
"result": "Человек чаще выбирает здоровые привычки"
}
]
},
{
"title": "Негативные эмоции усиливают негативное поведение",
"description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам",
"example": "Человек садится на диван и ест шоколад, когда ему плохо",
"chains": [
{
"cause": "Человек испытывает стресс или негативные эмоции",
"mechanism": "Это активирует привычку, которая помогает снизить дискомфорт",
"result": "Человек снова начинает делать то, что раньше снимало напряжение"
},
{
"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду",
"mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию",
"result": "Человек возвращается к нежелательной привычке"
}
]
}
]
},
"insights": [
{
"title": "Среда влияет на привычки больше, чем сила воли",
"description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"
},
{
"title": "Привычки не исчезают, только временно подавляются",
"description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях",
"example": "После посещения бара человек снова начинает пить, не осознавая этого"
},
{
"title": "Негативные эмоции усиливают вредное поведение",
"description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам",
"example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"
},
{
"title": "Сокращение стимулов уменьшает повторение нежелательного поведения",
"description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления",
"example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"
},
{
"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение",
"description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем",
"example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"
}
],
"application": {
"techniques": [
{
"name": "Снижение доступности стимула",
"goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров",
"context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети",
"steps": [
"Определите конкретный стимул (например, наличие телефона на столе)",
"Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)",
"Запишите дату и время изменения (для отслеживания эффективности)"
],
"client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным",
"success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 12 раз/день за 2 недели"
}
]
},
"limitations": [
{
"description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула",
"when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке",
"example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"
},
{
"description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение",
"when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды",
"example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"
},
{
"description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками",
"when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления",
"example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую"
}
]
}

View File

@@ -0,0 +1,248 @@
{
"framework": {
"terms": {
"стимул": "что в окружающей среде заставляет человека действовать",
"привычка": "повторяющееся действие, которое становится автоматическим",
"подкрепление": "воздействие, усиливающее вероятность повторения действия",
"среда": "окружение, влияющее на поведение через стимулы и ограничения",
"желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером",
"аутокаталитический процесс": "процесс, усиливающий себя сам"
},
"principles": [
{
"title": "Среда формирует поведение",
"description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети",
"chains": [
{
"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки",
"mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие",
"result": "Человек повторяет вредную привычку, не осознавая этого"
},
{
"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку",
"mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки",
"result": "Человек реже проявляет нежелательное поведение"
}
]
},
{
"title": "Привычки не исчезают, они только временно подавлены",
"description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях",
"example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил",
"chains": [
{
"cause": "Человек прекращает проявлять вредную привычку",
"mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой",
"result": "Привычка может вернуться, если появятся подходящие стимулы"
},
{
"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой",
"mechanism": "Стимулы запускают автоматические паттерны поведения",
"result": "Человек снова начинает делать то, что уже перестал"
}
]
},
{
"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент",
"description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст",
"example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня",
"chains": [
{
"cause": "Человек пытается контролировать себя в момент искушения",
"mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда",
"result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"
},
{
"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными",
"mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными",
"result": "Человек реже сталкивается с искушением"
}
]
},
{
"title": "Дисциплина — это настройка среды, а не внутреннее усилие",
"description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели",
"example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов",
"chains": [
{
"cause": "Человек пытается быть дисциплинированным только силой воли",
"mechanism": "Это требует большого количества энергии и часто неудачно",
"result": "Человек теряет мотивацию и возвращается к нежелательному поведению"
},
{
"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким",
"mechanism": "Стимулы для правильных действий становятся более доступными",
"result": "Человек чаще выбирает здоровые привычки"
}
]
},
{
"title": "Негативные эмоции усиливают негативное поведение",
"description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам",
"example": "Человек садится на диван и ест шоколад, когда ему плохо",
"chains": [
{
"cause": "Человек испытывает стресс или негативные эмоции",
"mechanism": "Это активирует привычку, которая помогает снизить дискомфорт",
"result": "Человек снова начинает делать то, что раньше снимало напряжение"
},
{
"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду",
"mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию",
"result": "Человек возвращается к нежелательной привычке"
}
]
}
]
},
"insights": [
{
"title": "Среда влияет на привычки больше, чем сила воли",
"description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"
},
{
"title": "Привычки не исчезают, только временно подавляются",
"description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях",
"example": "После посещения бара человек снова начинает пить, не осознавая этого"
},
{
"title": "Негативные эмоции усиливают вредное поведение",
"description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам",
"example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"
},
{
"title": "Сокращение стимулов уменьшает повторение нежелательного поведения",
"description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления",
"example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"
},
{
"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение",
"description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем",
"example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"
}
],
"application": {
"techniques": [
{
"name": "Снижение доступности стимула",
"goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров",
"context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети",
"steps": [
"Определите конкретный стимул (например, наличие телефона на столе)",
"Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)",
"Запишите дату и время изменения (для отслеживания эффективности)"
],
"client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным",
"success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 12 раз/день за 2 недели"
}
]
},
"limitations": [
{
"description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула",
"when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке",
"example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"
},
{
"description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение",
"when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды",
"example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"
},
{
"description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками",
"when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления",
"example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую"
}
],
"tags": {
"principle": [
{
"tag": "среда формирует поведение",
"confidence": 0.95
},
{
"tag": "привычки не исчезают",
"confidence": 0.92
},
{
"tag": "самоконтроль краткосрочен",
"confidence": 0.9
},
{
"tag": "дисциплина через среду",
"confidence": 0.9
},
{
"tag": "негативные эмоции усиливают поведение",
"confidence": 0.85
}
],
"psychology": [
{
"tag": "стимул",
"confidence": 0.95
},
{
"tag": "привычка",
"confidence": 0.95
},
{
"tag": "желание вызванное стимулом",
"confidence": 0.9
},
{
"tag": "аутокаталитический процесс",
"confidence": 0.85
},
{
"tag": "подкрепление",
"confidence": 0.8
}
],
"method": [
{
"tag": "снижение доступности стимула",
"confidence": 0.95
},
{
"tag": "настройка среды",
"confidence": 0.92
},
{
"tag": "устранение триггеров",
"confidence": 0.9
}
],
"result": [
{
"tag": "уменьшение вредных привычек",
"confidence": 0.95
},
{
"tag": "устойчивое поведение",
"confidence": 0.9
},
{
"tag": "снижение искушений",
"confidence": 0.85
}
],
"context": [
{
"tag": "поведенческая психология",
"confidence": 0.95
},
{
"tag": "привычки",
"confidence": 0.92
},
{
"tag": "атомные привычки",
"confidence": 0.9
}
]
},
"removed": []
}

View File

@@ -0,0 +1,40 @@
Ты валидатор согласованности полного анализа главы. Проверяй ТОЛЬКО связи между блоками. Соответствие тексту главы уже проверено по блокам — не перепроверяй.
Данные:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
- Полный анализ (склейка блоков, JSON): {full_analysis_json}
---
## ЗАДАЧА
Проверь согласованность блоков между собой:
1. **application (техники) и framework (принципы):** каждая техника должна опираться на хотя бы один принцип или идею из framework; техники не должны противоречить принципам. Если техника «висит» без связи с framework или противоречит ему — рассогласованность.
2. **insights и framework:** инсайты не должны противоречить принципам и цепочкам causemechanismresult из framework. Один и тот же смысл разными словами — не ошибка; прямое противоречие — рассогласованность.
3. **limitations и остальное:** ограничения/оговорки должны относиться к тому, что реально описано в framework, insights или application (ограничение применимости техники, границы принципа и т.п.). Ограничения «ни о чём» или про несуществующие в анализе вещи — рассогласованность.
Проверяй только эти три типа связей. Не оценивай полноту или стиль — только внутреннюю согласованность.
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"inconsistencies": [
{
"type": "application_vs_framework" | "insights_vs_framework" | "limitations_vs_rest",
"location": "краткое указание (например: application/techniques[1], framework/principles[0])",
"summary": "суть рассогласованности в 12 предложениях"
}
]
}
VERDICT: ok — рассогласованностей нет; needs_review — 12 несущественных; bad — явные противоречия или несколько рассогласованностей.

View File

@@ -0,0 +1,200 @@
Ты валидатор согласованности полного анализа главы. Проверяй ТОЛЬКО связи между блоками. Соответствие тексту главы уже проверено по блокам — не перепроверяй.
Данные:
- Книга: "[указать название книги]"
- Глава: "[указать название главы]"
- Полный анализ (склейка блоков, JSON):
{
"framework": {
"terms": {
"стимул": "что в окружающей среде заставляет человека действовать",
"привычка": "повторяющееся действие, которое становится автоматическим",
"подкрепление": "воздействие, усиливающее вероятность повторения действия",
"среда": "окружение, влияющее на поведение через стимулы и ограничения",
"желание, вызванное стимулом": "непроизвольная тяга к действию, спровоцированному внешним триггером",
"аутокаталитический процесс": "процесс, усиливающий себя сам"
},
"principles": [
{
"title": "Среда формирует поведение",
"description": "Человек не управляет привычками напрямую, а воздействует на окружение, чтобы оно вело его к нужным действиям",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети",
"chains": [
{
"cause": "Человек находится в среде с доступными стимулами для нежелательной привычки",
"mechanism": "Стимул активирует уже сформированную привычку, которая запускает автоматическое действие",
"result": "Человек повторяет вредную привычку, не осознавая этого"
},
{
"cause": "Изменяется среда, удаляются стимулы, провоцирующие нежелательную привычку",
"mechanism": "Отсутствие триггеров снижает вероятность срабатывания привычки",
"result": "Человек реже проявляет нежелательное поведение"
}
]
},
{
"title": "Привычки не исчезают, они только временно подавлены",
"description": "Даже если человек перестаёт делать что-то, привычка остаётся в мозге и может вернуться при подходящих условиях",
"example": "Человек перестаёт курить, но снова начинает после посещения места, где раньше курил",
"chains": [
{
"cause": "Человек прекращает проявлять вредную привычку",
"mechanism": "Мозг сохраняет нейронные связи, связанные с этой привычкой",
"result": "Привычка может вернуться, если появятся подходящие стимулы"
},
{
"cause": "Окружение меняется, и в нем появляются триггеры, связанные с прошлой привычкой",
"mechanism": "Стимулы запускают автоматические паттерны поведения",
"result": "Человек снова начинает делать то, что уже перестал"
}
]
},
{
"title": "Самоконтроль — это краткосрочный, а не долгосрочный инструмент",
"description": "Противостояние искушению неэффективно на длительном сроке, нужно менять контекст",
"example": "Человек отказывается от сладкого, но возвращается к нему после стрессового дня",
"chains": [
{
"cause": "Человек пытается контролировать себя в момент искушения",
"mechanism": "Это требует энергии и усилий, которые невозможно поддерживать всегда",
"result": "Человек устаёт от борьбы и возвращается к нежелательной привычке"
},
{
"cause": "Человек изменяет окружение, чтобы искушения стали менее доступными",
"mechanism": "Стимулы для плохого поведения становятся незаметными или невозможными",
"result": "Человек реже сталкивается с искушением"
}
]
},
{
"title": "Дисциплина — это настройка среды, а не внутреннее усилие",
"description": "Сильные люди не просто дисциплинированы, а живут в среде, которая поддерживает их цели",
"example": "Человек встаёт раньше, потому что спальня тёмная и не имеет гаджетов",
"chains": [
{
"cause": "Человек пытается быть дисциплинированным только силой воли",
"mechanism": "Это требует большого количества энергии и часто неудачно",
"result": "Человек теряет мотивацию и возвращается к нежелательному поведению"
},
{
"cause": "Человек настраивает окружение так, чтобы хорошее поведение было лёгким",
"mechanism": "Стимулы для правильных действий становятся более доступными",
"result": "Человек чаще выбирает здоровые привычки"
}
]
},
{
"title": "Негативные эмоции усиливают негативное поведение",
"description": "Стресс, тревога и другие негативные чувства провоцируют возвращение к вредным привычкам",
"example": "Человек садится на диван и ест шоколад, когда ему плохо",
"chains": [
{
"cause": "Человек испытывает стресс или негативные эмоции",
"mechanism": "Это активирует привычку, которая помогает снизить дискомфорт",
"result": "Человек снова начинает делать то, что раньше снимало напряжение"
},
{
"cause": "Человек пытается избавиться от вредной привычки, но не меняет среду",
"mechanism": "Стресс и негативные эмоции остаются, усиливая желание к действию",
"result": "Человек возвращается к нежелательной привычке"
}
]
}
]
},
"insights": [
{
"title": "Среда влияет на привычки больше, чем сила воли",
"description": "Чтобы изменить привычку, нужно изменить окружение, а не надеяться только на самоконтроль",
"example": "Убрать телефон с рабочего стола, чтобы не отвлекаться на соцсети"
},
{
"title": "Привычки не исчезают, только временно подавляются",
"description": "Даже если человек перестаёт курить или есть сладкое, эти привычки остаются в мозге и могут вернуться при подходящих условиях",
"example": "После посещения бара человек снова начинает пить, не осознавая этого"
},
{
"title": "Негативные эмоции усиливают вредное поведение",
"description": "Стресс, тревога и другие негативные чувства могут спровоцировать возвращение к старым привычкам",
"example": "После ссоры человек снова начинает есть вредную пищу, чтобы успокоиться"
},
{
"title": "Сокращение стимулов уменьшает повторение нежелательного поведения",
"description": "Удаление триггеров, связанных с вредной привычкой, снижает вероятность её возобновления",
"example": "Убрать сигареты из дома, чтобы уменьшить вероятность их употребления"
},
{
"title": "Самоконтроль — это временная стратегия, а не долгосрочное решение",
"description": "Постоянно бороться с искушением утомительно и непрочное; нужно настраивать среду так, чтобы искушений не было совсем",
"example": "Поставить телефон в другую комнату, чтобы не проверять соцсети во время работы"
}
],
"application": {
"techniques": [
{
"name": "Снижение доступности стимула",
"goal": "Уменьшение вероятности повторения нежелательной привычки за счёт удаления её триггеров",
"context_example": "Вечер после работы, когда тянет залипнуть в телефон и проверять соцсети",
"steps": [
"Определите конкретный стимул (например, наличие телефона на столе)",
"Уберите объект из зоны видимости или досягаемости (например, оставьте телефон в другой комнате)",
"Запишите дату и время изменения (для отслеживания эффективности)"
],
"client_phrase": "Уберите источник искушения из вашей среды — действие станет менее вероятным",
"success_criteria": "Частота использования телефона в моменты, когда это не нужно, снижается с 5 раз/день до 12 раз/день за 2 недели"
}
]
},
"limitations": [
{
"description": "Идеи не работают, если триггер (то, что в окружении запускает действие) не устранён или остаётся доступным, так как привычка может вернуться при появлении стимула",
"when_relevant": "Когда человек не полностью убирает триггер из своей среды или сталкивается с ним в новой обстановке",
"example": "Человек удалил сигареты из дома, но снова начинает курить на работе среди коллег-курильщиков"
},
{
"description": "Техники могут не сработать, если негативные эмоции (стресс, тревога) остаются необратленными и усиливают нежелательное поведение",
"when_relevant": "Когда человек продолжает испытывать сильный стресс или эмоциональные трудности, не решая их на уровне среды",
"example": "Человек убрал телефон из комнаты, но всё равно переедает перед сном из-за хронической тревоги"
},
{
"description": "Изменения среды могут быть недостаточны, если привычка закреплена на уровне автоматических нейронных паттернов и не сопровождается новыми, здоровыми привычками",
"when_relevant": "Когда человек устраняет триггер, но не вводит альтернативное поведение для подкрепления",
"example": "Человек убрал телевизор из спальни, но не нашёл замену в виде чтения или медитации и проводит время впустую"
}
]
}
---
## ЗАДАЧА
Проверь согласованность блоков между собой:
1. **application (техники) и framework (принципы):** каждая техника должна опираться на хотя бы один принцип или идею из framework; техники не должны противоречить принципам. Если техника «висит» без связи с framework или противоречит ему — рассогласованность.
2. **insights и framework:** инсайты не должны противоречить принципам и цепочкам causemechanismresult из framework. Один и тот же смысл разными словами — не ошибка; прямое противоречие — рассогласованность.
3. **limitations и остальное:** ограничения/оговорки должны относиться к тому, что реально описано в framework, insights или application (ограничение применимости техники, границы принципа и т.п.). Ограничения «ни о чём» или про несуществующие в анализе вещи — рассогласованность.
Проверяй только эти три типа связей. Не оценивай полноту или стиль — только внутреннюю согласованность.
---
## ФОРМАТ ОТВЕТА
СТРОГО JSON без комментариев:
{
"verdict": "ok" | "needs_review" | "bad",
"score": 0.0,
"inconsistencies": [
{
"type": "application_vs_framework" | "insights_vs_framework" | "limitations_vs_rest",
"location": "краткое указание (например: application/techniques[1], framework/principles[0])",
"summary": "суть рассогласованности в 12 предложениях"
}
]
}
VERDICT: ok — рассогласованностей нет; needs_review — 12 несущественных; bad — явные противоречия или несколько рассогласованностей.

View File

@@ -0,0 +1,32 @@
# Извлечение тегов (шаг 3)
Отдельный шаг пайплайна после финальной валидации согласованности (2b). ИИ использует уже структурированный анализ главы (каркас, инсайты, применение) и оригинальный текст для извлечения тегов по категориям.
## Промпт
| Файл | Назначение |
|------------------|-------------------------------------------------|
| extract_tags.txt | Извлечение тегов по категориям из валидированного анализа |
## Подстановки
- `{book_title}` — название книги
- `{chapter_title}` — название главы
- `{framework}` — JSON блока framework
- `{insights}` — JSON блока insights
- `{application}` — JSON блока application
- `{limitations}` — JSON блока limitations (опционально)
- `{chapter_text}` — оригинальный текст главы (можно обрезать по лимиту токенов)
- `{allowed_tags_json}` — актуальный список допустимых тегов по категориям (из БД `tags`)
## Вход
Валидированный анализ главы (все блоки) + оригинальный текст главы + словарь допустимых тегов.
## Выход
JSON с тегами по категориям (ключи на английском: `principle`, `psychology`, `method`, `result`, `context`) и confidence score для каждого тега; при необходимости — кандидаты в `proposed` с полем `category` из того же набора. Маппинг категорий: ARCHITECTURE_SUMMARY.md → раздел «Хранение данных» → таблица `tags`.
## Использование
Вызывается после шага 2b (финальная валидация). Модель: qwen3-14b:8bit (или аналог). Перед вызовом в промпт подставляется актуальный список тегов из БД.

View File

@@ -0,0 +1,79 @@
Ты — эксперт по тегированию нон-фикшн. На основе валидированного анализа главы извлеки теги по категориям. Теги нужны для фильтрации и кросс-книжного поиска.
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
Данные анализа (JSON-блоки, сериализованные в строку):
- Каркас (принципы, цепочки, термины): {framework}
- Инсайты: {insights}
- Применение (техники, методики): {application}
- Ограничения: {limitations}
Оригинальный текст главы (выдержка для контекста): {chapter_text}
Допустимые теги по категориям — JSON (выбирай ТОЛЬКО из этого списка): {allowed_tags_json}
**Опора при выборе тегов:** в первую очередь блоки анализа (framework, insights, application); текст главы — для проверки релевантности и калибровки confidence.
---
## ЗАДАЧА
Извлеки теги по следующим категориям. Ключи категорий в ответе — на английском (соответствуют полю `category` в БД):
1. **principle** — по сути правила/принципа: название правила/принципа, ключевые концепции, связанные принципы.
2. **psychology** — по психологическому механизму: психологические концепции, проблемы, механизмы работы. Включай термин из списка, если он **существенно используется** в главе (объяснён, в цепочке причина–механизм–результат или в примере), а не только упомянут вскользь.
3. **method** — по методу/технике: конкретные методики, подходы, процессы.
4. **result** — по результату/цели: достигаемые результаты, цели применения.
5. **context** — по контексту книги: связь с общей концепцией книги, автор и подход, общая тематика.
Теги должны отражать **суть** главы, а не просто упоминания. Каждый тег — релевантен содержанию. Избегай слишком общих тегов. Приоритет: качество над количеством. **Не более 5 тегов на категорию;** при равной релевантности оставляй самые важные для поиска.
---
## СТРОГИЕ ПРАВИЛА
1. Выбирай теги **только** из переданного списка (`allowed_tags_json`). В поле `tag` копируй строку **точно как в списке** — без изменения формулировки, регистра и пунктуации.
2. Если для главы нужен смысл, которого нет в списке — верни его в блоке `proposed`: объект с полями `tag`, `category` (principle | psychology | method | result | context), `reason`. Не добавляй такой тег в основные категории.
3. Один и тот же смысл — один тег; не дублируй синонимами из списка.
4. **Confidence** (0.01.0) калибруй так: **0.91.0** — тема в ядре главы (принципы, главные идеи); **0.70.89** — есть в главе, но второстепенно или через примеры; **0.50.69** — только упомянуто, без разбора. Не завышай: различай «главное» и «по касательной».
5. Не используй вводные фразы и пояснения в ответе — только JSON.
---
## ФОРМАТ ОТВЕТА
Строго один JSON-объект без комментариев и markdown:
{
"tags": {
"principle": [
{ "tag": "название тега из списка", "confidence": 0.95 }
],
"psychology": [
{ "tag": "...", "confidence": 0.9 }
],
"method": [
{ "tag": "...", "confidence": 0.85 }
],
"result": [
{ "tag": "...", "confidence": 0.9 }
],
"context": [
{ "tag": "...", "confidence": 0.88 }
]
},
"proposed": [
{
"tag": "формулировка предлагаемого тега",
"category": "principle | psychology | method | result | context",
"reason": "краткое обоснование в 12 предложениях"
}
]
}
- Ключи в `tags` — английские, соответствуют полю `tags.category` в БД. Пустые категории — пустой массив `[]`. В каждом `tag` — строка в точности как в `allowed_tags_json`.
- Блок `proposed` — только если ни один существующий тег не подходит по смыслу; иначе пустой массив `[]`.
Верни только этот объект — ничего до и после.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
{
"tags": {
"principle": [
{ "tag": "среда формирует поведение", "confidence": 0.95 },
{ "tag": "привычки не исчезают", "confidence": 0.92 },
{ "tag": "самоконтроль краткосрочен", "confidence": 0.9 },
{ "tag": "дисциплина через среду", "confidence": 0.9 },
{ "tag": "негативные эмоции усиливают поведение", "confidence": 0.85 }
],
"psychology": [
{ "tag": "стимул", "confidence": 0.95 },
{ "tag": "привычка", "confidence": 0.95 },
{ "tag": "желание вызванное стимулом", "confidence": 0.9 },
{ "tag": "аутокаталитический процесс", "confidence": 0.85 },
{ "tag": "подкрепление", "confidence": 0.8 }
],
"method": [
{ "tag": "снижение доступности стимула", "confidence": 0.95 },
{ "tag": "настройка среды", "confidence": 0.92 },
{ "tag": "устранение триггеров", "confidence": 0.9 }
],
"result": [
{ "tag": "уменьшение вредных привычек", "confidence": 0.95 },
{ "tag": "устойчивое поведение", "confidence": 0.9 },
{ "tag": "снижение искушений", "confidence": 0.85 }
],
"context": [
{ "tag": "поведенческая психология", "confidence": 0.95 },
{ "tag": "привычки", "confidence": 0.92 },
{ "tag": "атомные привычки", "confidence": 0.9 }
]
},
"proposed": []
}

View File

@@ -0,0 +1,31 @@
# Валидация тегов (шаг 4)
Отдельный шаг пайплайна после извлечения тегов (шаг 3). Проверка релевантности каждого тега содержанию главы, соответствие каркасу/инсайтам/применению, фильтрация нерелевантных и слишком общих тегов, обновление confidence scores.
## Промпт
| Файл | Назначение |
|------------------|-------------------------------------------------|
| validate_tags.txt | Валидация извлечённых тегов по анализу и тексту главы |
## Подстановки
- `{book_title}` — название книги
- `{chapter_title}` — название главы
- `{extracted_tags_json}` — JSON из шага 3 (tags по категориям + proposed)
- `{framework}` — JSON блока framework
- `{insights}` — JSON блока insights
- `{application}` — JSON блока application
- `{chapter_text}` — выдержка текста главы (для проверки релевантности)
## Вход
Извлечённые теги (шаг 3) + валидированный анализ главы (framework, insights, application) + оригинальный текст главы.
## Выход
JSON: проверенные теги по категориям с обновлёнными confidence; теги, снятые при валидации, — в блоке `removed` (tag, category, reason). Формат `tags` совпадает с выходом шага 3 для передачи в эмбеддинг и сохранение в БД.
## Использование
Вызывается после шага 3 (извлечение тегов). Модель: qwen3-14b:8bit (или аналог). Время: ~2030 сек на главу.

View File

@@ -0,0 +1,67 @@
Ты валидатор тегов главы. Цель: снять только теги без опоры в главе или анализе; теги с опорой — оставлять, при необходимости понижая confidence. Не повышай confidence — только понижай или оставляй без изменений (калибровка уже сделана на шаге 3).
Контекст:
- Книга: "{book_title}"
- Глава: "{chapter_title}"
Извлечённые теги (JSON из шага 3): {extracted_tags_json}
Данные анализа (JSON-блоки):
- Каркас: {framework}
- Инсайты: {insights}
- Применение: {application}
Оригинальный текст главы (выдержка): {chapter_text}
---
## ЗАДАЧА
Проверь каждый тег. В `removed` попадают **только** теги без опоры в главе и в анализе или противоречащие смыслу главы.
1. **Опора в анализе:** если тег есть в анализе (framework.terms, названия принципов/инсайтов/техник, цепочки causemechanismresult) — **не снимать**; при необходимости только **понизить** confidence. Снимать только при отсутствии связи с главой/анализом или при противоречии.
2. **«Слишком общий» — не повод снимать:** тег, входящий в framework (terms, principles) или в описание техник/инсайтов, не снимать как «общий»; только понизить confidence при необходимости. Снимать — только если тег реально не связан с главой или противоречит анализу.
3. **При сомнении — оставлять:** если не уверен, снимать тег или нет — **оставлять** тег и при необходимости понизить confidence. В `removed` — только явно нерелевантные теги.
**Confidence:** только **понижать** или оставлять без изменений; **не повышать**. Шкала для понижения: 0.70.89 — второстепенно; 0.50.69 — только упомянуто.
---
## СТРОГИЕ ПРАВИЛА
1. Не добавляй новых тегов и не меняй формулировки тегов — только оставляй/снимай и обновляй confidence. Confidence не повышай — только понижай или оставляй как во входе.
2. Снятые теги перечисляй в блоке `removed`: поля `tag`, `category` (principle | psychology | method | result | context), `reason` (кратко, почему снят). В `removed` — только теги без опоры в главе и анализе или противоречащие смыслу.
3. В `tags` сохраняй ту же структуру по категориям (ключи на английском); пустые категории — пустой массив `[]`.
4. Ответ — только JSON, без вводных фраз и пояснений.
---
## ФОРМАТ ОТВЕТА
СТРОГО один JSON-объект без комментариев и markdown:
{
"tags": {
"principle": [
{ "tag": "строка тега без изменений", "confidence": 0.95 }
],
"psychology": [],
"method": [],
"result": [],
"context": []
},
"removed": [
{
"tag": "формулировка снятого тега",
"category": "principle | psychology | method | result | context",
"reason": "краткая причина снятия в 1 предложении"
}
]
}
- Ключи в `tags` — английские (principle, psychology, method, result, context). В каждом элементе `tag` — строка в точности как во входе.
- Блок `removed` — все теги, снятые при валидации; если ничего не снято — пустой массив `[]`.
Верни только этот объект — ничего до и после.

View File

@@ -0,0 +1,67 @@
Ты валидатор тегов главы. Цель: снять только теги без опоры в главе или анализе; теги с опорой — оставлять, при необходимости понижая confidence. Не повышай confidence — только понижай или оставляй без изменений (калибровка уже сделана на шаге 3).
Контекст:
- Книга: "Атомные привычки"
- Глава: "Глава 1. Среда и привычки"
Извлечённые теги (JSON из шага 3): {"tags":{"principle":[{"tag":"среда формирует поведение","confidence":0.95},{"tag":"привычки не исчезают","confidence":0.92},{"tag":"самоконтроль краткосрочен","confidence":0.9},{"tag":"дисциплина через среду","confidence":0.9},{"tag":"негативные эмоции усиливают поведение","confidence":0.85}],"psychology":[{"tag":"стимул","confidence":0.95},{"tag":"привычка","confidence":0.95},{"tag":"желание вызванное стимулом","confidence":0.9},{"tag":"аутокаталитический процесс","confidence":0.85},{"tag":"подкрепление","confidence":0.8}],"method":[{"tag":"снижение доступности стимула","confidence":0.95},{"tag":"настройка среды","confidence":0.92},{"tag":"устранение триггеров","confidence":0.9}],"result":[{"tag":"уменьшение вредных привычек","confidence":0.95},{"tag":"устойчивое поведение","confidence":0.9},{"tag":"снижение искушений","confidence":0.85}],"context":[{"tag":"поведенческая психология","confidence":0.95},{"tag":"привычки","confidence":0.92},{"tag":"атомные привычки","confidence":0.9}]},"proposed":[]}
Данные анализа (JSON-блоки):
- Каркас: {"framework":{"terms":{"стимул":"что в окружающей среде заставляет человека действовать","привычка":"повторяющееся действие, которое становится автоматическим","подкрепление":"воздействие, усиливающее вероятность повторения действия","среда":"окружение, влияющее на поведение через стимулы и ограничения","желание, вызванное стимулом":"непроизвольная тяга к действию, спровоцированному внешним триггером","аутокаталитический процесс":"процесс, усиливающий себя сам"},"principles":[{"title":"Среда формирует поведение","description":"Человек не управляет привычками напрямую, а воздействует на окружение","example":"Убрать телефон с рабочего стола","chains":[{"cause":"Среда с доступными стимулами для нежелательной привычки","mechanism":"Стимул активирует привычку","result":"Человек повторяет вредную привычку"},{"cause":"Изменяется среда, удаляются стимулы","mechanism":"Отсутствие триггеров","result":"Человек реже проявляет нежелательное поведение"}]},{"title":"Привычки не исчезают, они только временно подавлены","description":"Привычка остаётся в мозге и может вернуться при подходящих условиях","example":"Перестаёт курить, но снова начинает после посещения места","chains":[{"cause":"Человек прекращает проявлять вредную привычку","mechanism":"Мозг сохраняет нейронные связи","result":"Привычка может вернуться при подходящих стимулах"}]},{"title":"Самоконтроль — краткосрочный инструмент","description":"Противостояние искушению неэффективно на длительном сроке","chains":[{"cause":"Контроль себя в момент искушения","mechanism":"Требует энергии","result":"Устаёт и возвращается к привычке"},{"cause":"Изменяет окружение","mechanism":"Стимулы для плохого становятся незаметными","result":"Реже сталкивается с искушением"}]},{"title":"Дисциплина — настройка среды","description":"Сильные люди живут в среде, которая поддерживает цели","chains":[{"cause":"Дисциплина только силой воли","mechanism":"Много энергии, часто неудачно","result":"Теряет мотивацию"},{"cause":"Настраивает окружение","mechanism":"Стимулы для правильных действий доступнее","result":"Чаще выбирает здоровые привычки"}]},{"title":"Негативные эмоции усиливают негативное поведение","description":"Стресс, тревога провоцируют возвращение к вредным привычкам","chains":[{"cause":"Стресс или негативные эмоции","mechanism":"Активирует привычку для снижения дискомфорта","result":"Снова делает то, что снимало напряжение"}]}]}}
- Инсайты: {"insights":[{"title":"Среда влияет на привычки больше, чем сила воли","description":"Изменить окружение, а не надеяться на самоконтроль","example":"Убрать телефон с рабочего стола"},{"title":"Привычки не исчезают, только временно подавляются","description":"Привычки остаются в мозге, могут вернуться","example":"После посещения бара снова начинает пить"},{"title":"Негативные эмоции усиливают вредное поведение","description":"Стресс может спровоцировать возвращение к старым привычкам"},{"title":"Сокращение стимулов уменьшает нежелательное поведение","description":"Удаление триггеров снижает вероятность возобновления"},{"title":"Самоконтроль — временная стратегия","description":"Нужно настраивать среду так, чтобы искушений не было"}]}}
- Применение: {"application":{"techniques":[{"name":"Снижение доступности стимула","goal":"Уменьшение вероятности повторения нежелательной привычки за счёт удаления триггеров","context_example":"Вечер, когда тянет залипнуть в телефон","steps":["Определите стимул","Уберите объект из зоны видимости","Запишите дату изменения"],"client_phrase":"Уберите источник искушения из среды"}]}}
Оригинальный текст главы (выдержка): В 1971 году два американских конгрессмена выяснили, что более 15% солдат во Вьетнаме имели зависимость от героина. Ли Робинс обнаружил, что только 5% наркозависимых солдат снова начинали принимать героин в течение первого года после возвращения — девять из десяти избавлялись от зависимости после смены окружения. Зависимость может спонтанно исчезнуть при полной смене окружения: во Вьетнаме солдаты были в окружении стимулов, провоцировавших героин; в США — в среде без этих стимулов. Как только менялся контекст, менялась и привычка. Исследования показывают: «дисциплинированные» люди лучше структурируют жизнь так, чтобы не требовать героической силы воли. Люди с развитым самоконтролем меньше нуждаются в его применении. Способ развить качества — создать дисциплинированную среду. Привычка, закодированная в мозгу, «готова к использованию» при соответствующей ситуации. Ученые называют это «желание, вызванное стимулом»: внешний триггер вызывает навязчивое стремление повторить привычку. Вы можете избавиться от привычки, но не забыть ее. Противостояние искушению — неэффективная долгосрочная стратегия. Надёжный подход — искоренение плохих привычек в исходной точке: снизить воздействие стимула. Оставьте телефон в другой комнате; уберите телевизор из спальни. Обратная трактовка первого закона: сделать неочевидным то, что мешает. Самоконтроль — краткосрочная стратегия. Секрет самоконтроля: стимулы хороших привычек — очевидными, плохих — незаметными. Дурные привычки аутокаталитичны: процесс подпитывает сам себя. Подкрепление усиливает вероятность повторения действия.
---
## ЗАДАЧА
Проверь каждый тег. В `removed` попадают **только** теги без опоры в главе и в анализе или противоречащие смыслу главы.
1. **Опора в анализе:** если тег есть в анализе (framework.terms, названия принципов/инсайтов/техник, цепочки causemechanismresult) — **не снимать**; при необходимости только **понизить** confidence. Снимать только при отсутствии связи с главой/анализом или при противоречии.
2. **«Слишком общий» — не повод снимать:** тег, входящий в framework (terms, principles) или в описание техник/инсайтов, не снимать как «общий»; только понизить confidence при необходимости. Снимать — только если тег реально не связан с главой или противоречит анализу.
3. **При сомнении — оставлять:** если не уверен, снимать тег или нет — **оставлять** тег и при необходимости понизить confidence. В `removed` — только явно нерелевантные теги.
**Confidence:** только **понижать** или оставлять без изменений; **не повышать**. Шкала для понижения: 0.70.89 — второстепенно; 0.50.69 — только упомянуто.
---
## СТРОГИЕ ПРАВИЛА
1. Не добавляй новых тегов и не меняй формулировки тегов — только оставляй/снимай и обновляй confidence. Confidence не повышай — только понижай или оставляй как во входе.
2. Снятые теги перечисляй в блоке `removed`: поля `tag`, `category` (principle | psychology | method | result | context), `reason` (кратко, почему снят). В `removed` — только теги без опоры в главе и анализе или противоречащие смыслу.
3. В `tags` сохраняй ту же структуру по категориям (ключи на английском); пустые категории — пустой массив `[]`.
4. Ответ — только JSON, без вводных фраз и пояснений.
---
## ФОРМАТ ОТВЕТА
СТРОГО один JSON-объект без комментариев и markdown:
{
"tags": {
"principle": [
{ "tag": "строка тега без изменений", "confidence": 0.95 }
],
"psychology": [],
"method": [],
"result": [],
"context": []
},
"removed": [
{
"tag": "формулировка снятого тега",
"category": "principle | psychology | method | result | context",
"reason": "краткая причина снятия в 1 предложении"
}
]
}
- Ключи в `tags` — английские (principle, psychology, method, result, context). В каждом элементе `tag` — строка в точности как во входе.
- Блок `removed` — все теги, снятые при валидации; если ничего не снято — пустой массив `[]`.
Верни только этот объект — ничего до и после.

View File

@@ -0,0 +1,34 @@
{
"tags": {
"principle": [
{ "tag": "среда формирует поведение", "confidence": 0.95 },
{ "tag": "привычки не исчезают", "confidence": 0.92 },
{ "tag": "самоконтроль краткосрочен", "confidence": 0.9 },
{ "tag": "дисциплина через среду", "confidence": 0.9 },
{ "tag": "негативные эмоции усиливают поведение", "confidence": 0.85 }
],
"psychology": [
{ "tag": "стимул", "confidence": 0.95 },
{ "tag": "привычка", "confidence": 0.95 },
{ "tag": "желание вызванное стимулом", "confidence": 0.9 },
{ "tag": "аутокаталитический процесс", "confidence": 0.85 },
{ "tag": "подкрепление", "confidence": 0.8 }
],
"method": [
{ "tag": "снижение доступности стимула", "confidence": 0.95 },
{ "tag": "настройка среды", "confidence": 0.92 },
{ "tag": "устранение триггеров", "confidence": 0.9 }
],
"result": [
{ "tag": "уменьшение вредных привычек", "confidence": 0.95 },
{ "tag": "устойчивое поведение", "confidence": 0.9 },
{ "tag": "снижение искушений", "confidence": 0.85 }
],
"context": [
{ "tag": "поведенческая психология", "confidence": 0.95 },
{ "tag": "привычки", "confidence": 0.92 },
{ "tag": "атомные привычки", "confidence": 0.9 }
]
},
"removed": []
}

View File

@@ -0,0 +1,29 @@
# Мерж анализа и тегов (шаг 5)
Объединение выхода 2b (финальная валидация согласованности) и выхода 4 (валидация тегов) в один JSON. Этапы 2b и 4 разнесены по времени; шаг 5 выполняется после того, как оба результата готовы.
## Вход
| Источник | Файл | Содержимое |
|----------|------|------------|
| 2b | merge.json | framework, insights, application, limitations |
| 4 | выход_valid_tag.json | tags по категориям, removed |
| 1 (опционально) | вход_главы.json | book_id, chapter_id, chapter_number, chapter_title, book_title, author — для шага 7 |
## Выход
Один JSON: все поля анализа + `tags`, `removed`. Если задан `--input-chapter`, в выход добавляются метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author). Этот документ передаётся в шаг 6 (генерация эмбеддингов) и в шаг 7 (payload Qdrant).
## Использование
```bash
python3 merge_analysis_tags.py <merge.json> <выход_valid_tag.json> [--input-chapter вход_главы.json] [-o выход.json]
```
Пример (с метаданными для шага 7):
```bash
python3 merge_analysis_tags.py ../2b_финальная_валидация_согласованности/merge.json ../4_валидация_тегов/выход_valid_tag.json --input-chapter ../1_анализ_главы/вход_главы.example.json -o merged_with_tags.json
```
Без `-o` результат выводится в stdout.

View File

@@ -0,0 +1,127 @@
#!/usr/bin/env python3
"""
Этап 5: мерж валидированного анализа главы (2b) и валидированных тегов (4).
Вход:
- merge.json (2b): framework, insights, application, limitations
- выход_valid_tag.json (4): tags по категориям, removed
Выход: один JSON с анализом и тегами для передачи в шаг 6 (генерация эмбеддингов).
"""
import argparse
import json
import sys
from pathlib import Path
from typing import Any
def load_json(path: Path) -> Any:
"""Загружает JSON из файла."""
with open(path, encoding="utf-8") as f:
return json.load(f)
CHAPTER_META_KEYS = ("book_id", "chapter_id", "chapter_number", "chapter_title", "book_title", "author", "chapter_text")
def merge_analysis_and_tags(
analysis: dict[str, Any],
tags_doc: dict[str, Any],
input_chapter: dict[str, Any] | None = None,
) -> dict[str, Any]:
"""
Объединяет анализ главы и валидированные теги в один документ.
Args:
analysis: Результат 2b (framework, insights, application, limitations).
tags_doc: Результат 4 (tags по категориям, removed).
input_chapter: Опционально — вход этапа 1 (book_id, chapter_id, chapter_number, chapter_title, book_title, author).
Returns:
Документ с полями анализа, tags, removed и при наличии — метаданными главы/книги.
"""
result = dict(analysis)
result["tags"] = tags_doc.get("tags", {})
result["removed"] = tags_doc.get("removed", [])
if input_chapter:
for key in CHAPTER_META_KEYS:
if key in input_chapter and input_chapter[key] is not None:
result[key] = input_chapter[key]
return result
def main() -> int:
"""Точка входа CLI."""
parser = argparse.ArgumentParser(
description="Мерж валидированного анализа (2b) и валидированных тегов (4) в один JSON (этап 5).",
)
parser.add_argument(
"analysis",
type=Path,
help="Путь к merge.json (выход 2b).",
)
parser.add_argument(
"tags",
type=Path,
help="Путь к выход_valid_tag.json (выход 4).",
)
parser.add_argument(
"--input-chapter",
type=Path,
default=None,
help="Путь к входному JSON этапа 1 (вход_главы) — book_id, chapter_id, chapter_number, chapter_title, book_title, author, chapter_text. Если задан, эти поля попадают в выход для шагов 7 и 8.",
)
parser.add_argument(
"-o",
"--output",
type=Path,
default=None,
help="Путь к выходному JSON. По умолчанию — stdout.",
)
parser.add_argument(
"--indent",
type=int,
default=2,
help="Отступ для форматирования JSON (по умолчанию 2).",
)
args = parser.parse_args()
if not args.analysis.exists():
print(f"Ошибка: файл не найден: {args.analysis}", file=sys.stderr)
return 1
if not args.tags.exists():
print(f"Ошибка: файл не найден: {args.tags}", file=sys.stderr)
return 1
try:
analysis = load_json(args.analysis)
tags_doc = load_json(args.tags)
except json.JSONDecodeError as e:
print(f"Ошибка разбора JSON: {e}", file=sys.stderr)
return 1
input_chapter = None
if args.input_chapter is not None:
if not args.input_chapter.exists():
print(f"Ошибка: файл не найден: {args.input_chapter}", file=sys.stderr)
return 1
try:
input_chapter = load_json(args.input_chapter)
except json.JSONDecodeError as e:
print(f"Ошибка разбора input-chapter JSON: {e}", file=sys.stderr)
return 1
merged = merge_analysis_and_tags(analysis, tags_doc, input_chapter)
payload = json.dumps(merged, ensure_ascii=False, indent=args.indent)
if args.output is None:
print(payload)
else:
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(payload, encoding="utf-8")
return 0
if __name__ == "__main__":
sys.exit(main())

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,35 @@
# Генерация эмбеддингов (шаг 6)
Отдельный шаг пайплайна после мержа анализа и тегов (шаг 5). В вектор превращается **валидированный анализ главы** (каркас, инсайты, применение), а не сырой текст — поиск идёт по смыслу, а не по формулировкам.
## Модель
- **По умолчанию:** **BAAI/bge-m3** (bge-m3). Мультиязычная модель, хорошая поддержка русского; размерность вектора **1024**, лимит контекста **8192 токенов** — полный анализ главы обычно укладывается без обрезки. Размер ~1.2GB, ~515 сек на главу.
- **Лимит входа:** 8192 токенов (bge-m3). При превышении — стратегия из `embed_input_spec.txt` (truncation или chunk + агрегация).
- **Альтернативы:** nomic-embed-text, evilfreelancer/enbeddrus (для более лёгкого режима). Модель задаётся конфигом; при смене — пересоздание коллекций Qdrant (размерность 1024 для bge-m3).
## Вход
Выход шага 5 (мерж): валидированный анализ главы (framework, insights, application) — сериализуется в текст по спецификации `embed_input_spec.txt`. Теги в вектор не входят; они хранятся в payload Qdrant для фильтрации.
## Выход
Вектор эмбеддинга фиксированной размерности (**1024** для bge-m3). Сохраняется в Qdrant в коллекции `chapter_analyses` (коллекция создаётся с size=1024) вместе с payload (book_id, chapter_id, validation_score, tags и т.д.).
## Спецификация входа
| Файл | Назначение |
|-----------------------|----------------------------------------------------------------------------|
| embed_input_spec.txt | Рецепт построения текста для эмбеддинга: какие поля, порядок, приоритет при truncation |
## Подстановки при построении текста
- `{framework}` — сериализованный блок framework (принципы, terms, chains)
- `{insights}` — сериализованный блок insights
- `{application}` — сериализованный блок application
Ограничения и limitations в эмбеддинг по умолчанию не включаются (опционально — в конфиге). Теги — только в payload, не в тексте для эмбеддинга.
## Использование
Вызывается после шага 5 (мерж анализа и тегов). Модель задаётся конфигом (env/конфиг); смена модели не меняет формат хранения в Qdrant, при смене — пересчёт эмбеддингов по необходимости.

View File

@@ -0,0 +1,231 @@
#!/usr/bin/env python3
"""
CLI для получения эмбеддинга по JSON шага 5 (мерж анализа и тегов).
На вход — путь к JSON-файлу, сформированному на этапе 5 (merged_with_tags.json),
и имя модели. Текст для эмбеддинга собирается из блоков framework, insights, application
по спецификации embed_input_spec.txt. На выход — вектор.
"""
import argparse
import json
import re
import sys
import urllib.error
import urllib.request
from pathlib import Path
from typing import Any
def _serialize_framework(fw: dict[str, Any]) -> str:
"""Собирает текст секции FRAMEWORK из JSON блока framework."""
parts: list[str] = []
principles = fw.get("principles") or []
for p in principles:
line = f"Принцип: {p.get('title', '')}. Описание: {p.get('description', '')}."
if p.get("example"):
line += f" Пример: {p['example']}."
parts.append(line)
for chain in p.get("chains") or []:
c_line = "Причина: {} Механизм: {} Результат: {}.".format(
chain.get("cause", ""),
chain.get("mechanism", ""),
chain.get("result", ""),
)
parts.append(c_line)
terms = fw.get("terms") or {}
if terms:
terms_str = " ".join(f"{k}{v}" for k, v in terms.items())
parts.append(f"Термины: {terms_str}.")
return "\n".join(parts)
def _serialize_insights(insights: list[Any]) -> str:
"""Собирает текст секции INSIGHTS."""
parts: list[str] = []
for i in insights:
line = f"Инсайт: {i.get('title', '')}. {i.get('description', '')}."
if i.get("example"):
line += f" Пример: {i['example']}."
parts.append(line)
return "\n".join(parts)
def _serialize_application(app: dict[str, Any]) -> str:
"""Собирает текст секции APPLICATION из блока application."""
parts: list[str] = []
techniques = app.get("techniques") or []
for t in techniques:
line = f"Техника: {t.get('name', '')}. Цель: {t.get('goal', '')}."
if t.get("steps"):
steps = t["steps"] if isinstance(t["steps"], list) else [t["steps"]]
line += f" Шаги: {'; '.join(steps)}."
if t.get("context_example"):
line += f" Контекст: {t['context_example']}."
parts.append(line)
return "\n".join(parts)
def merged_json_to_embed_text(merged: dict[str, Any]) -> str:
"""
Собирает текст для эмбеддинга из JSON шага 5 по embed_input_spec.txt.
Входят только блоки framework, insights, application. Порядок секций:
FRAMEWORK, INSIGHTS, APPLICATION.
Limitations и теги не включаются: теги хранятся в payload Qdrant для фильтрации,
вектор строится по смыслу (принципы, инсайты, техники), не по тегам.
Args:
merged: Документ из шага 5 (merge.json + выход_valid_tag.json).
Returns:
Нормализованная строка для подачи в модель эмбеддингов.
"""
fw = merged.get("framework") or {}
insights = merged.get("insights") or []
app = merged.get("application") or {}
framework_text = _serialize_framework(fw)
insights_text = _serialize_insights(insights)
application_text = _serialize_application(app)
sections = [
"FRAMEWORK",
framework_text,
"INSIGHTS",
insights_text,
"APPLICATION",
application_text,
]
text = "\n\n".join(sections)
# Нормализация: схлопнуть множественные пробелы и переносы, обрезать по краям
text = re.sub(r"[ \t]+", " ", text)
text = re.sub(r"\n\s*\n", "\n\n", text)
return text.strip()
def get_embedding(
base_url: str,
model: str,
text: str,
) -> list[float]:
"""
Запрашивает эмбеддинг текста у OpenAI-совместимого API.
Args:
base_url: Базовый URL API (например http://localhost:1234/v1).
model: Имя модели эмбеддингов.
text: Текст для эмбеддинга.
Returns:
Вектор эмбеддинга (список float).
Raises:
urllib.error.HTTPError: При ошибке HTTP.
ValueError: Если в ответе нет ожидаемой структуры.
"""
url = f"{base_url.rstrip('/')}/embeddings"
payload = {
"model": model,
"input": text,
}
body = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(
url,
data=body,
headers={"Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(req, timeout=120) as resp:
data: dict[str, Any] = json.loads(resp.read().decode("utf-8"))
if "data" not in data or not data["data"]:
raise ValueError("В ответе API нет поля data с эмбеддингом")
embedding = data["data"][0].get("embedding")
if not embedding:
raise ValueError("В ответе API нет поля embedding")
return list(embedding)
def main() -> int:
"""Точка входа CLI."""
parser = argparse.ArgumentParser(
description="Эмбеддинг по JSON шага 5 (мерж анализа и тегов). На вход — JSON-файл, на выход — вектор.",
)
parser.add_argument(
"input_json",
type=Path,
help="Путь к JSON-файлу шага 5 (merged_with_tags.json).",
)
parser.add_argument(
"model",
help="Имя модели эмбеддингов (например text-embedding-bge-m3).",
)
parser.add_argument(
"--base-url",
default="http://localhost:1234/v1",
help="Базовый URL API (по умолчанию LM Studio).",
)
parser.add_argument(
"-o",
"--output",
type=Path,
default=None,
help="Путь к файлу для записи вектора (JSON). По умолчанию — stdout.",
)
parser.add_argument(
"--format",
choices=("json", "compact"),
default="json",
help="Формат вывода: json — массив, compact — числа через пробел.",
)
args = parser.parse_args()
if not args.input_json.exists():
print(f"Ошибка: файл не найден: {args.input_json}", file=sys.stderr)
return 1
try:
with open(args.input_json, encoding="utf-8") as f:
merged = json.load(f)
except json.JSONDecodeError as e:
print(f"Ошибка разбора JSON: {e}", file=sys.stderr)
return 1
text = merged_json_to_embed_text(merged)
if not text:
print("Ошибка: текст для эмбеддинга пуст (нет framework/insights/application).", file=sys.stderr)
return 1
try:
vector = get_embedding(args.base_url, args.model, text)
except urllib.error.HTTPError as e:
print(f"Ошибка HTTP {e.code}: {e.reason}", file=sys.stderr)
if e.fp:
try:
body = e.fp.read().decode("utf-8")
print(body[:500], file=sys.stderr)
except Exception:
pass
return 1
except urllib.error.URLError as e:
print(f"Ошибка запроса: {e.reason}", file=sys.stderr)
return 1
except ValueError as e:
print(f"Ошибка: {e}", file=sys.stderr)
return 1
if args.format == "json":
payload = json.dumps(vector, ensure_ascii=False)
else:
payload = " ".join(str(x) for x in vector)
if args.output is None:
print(payload)
else:
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(payload, encoding="utf-8")
return 0
if __name__ == "__main__":
sys.exit(main())

View File

@@ -0,0 +1,103 @@
# Спецификация входа для генерации эмбеддинга главы
Текст, который передаётся в модель эмбеддингов (по умолчанию BAAI/bge-m3), строится из **валидированного анализа главы**. Источник полей — JSON анализа по схеме из ARCHITECTURE_SUMMARY.md (блоки framework, insights, application). Цель — сохранить смысл для семантического поиска: по вектору ищут главы по смыслу (принципы, инсайты, техники), а не по сырому тексту.
---
## ЧТО ВКЛЮЧАТЬ
В текст для эмбеддинга входят **только** блоки анализа:
1. **Framework (каркас):** принципы (title, description, example), terms (термин → краткое пояснение), при необходимости — ключевые цепочки causemechanismresult (кратко).
2. **Insights (инсайты):** title, description (и при необходимости example) по каждому инсайту. Без лишних метаполей.
3. **Application (применение):** техники — name, goal, steps (кратко или полный список), при необходимости context_example. То, по чему будет искаться «как это применить».
**Не включать:**
- Оригинальный текст главы.
- Limitations — по умолчанию не включать (опционально через конфиг).
- Теги — хранятся в payload Qdrant, в вектор не входят.
---
## ПОРЯДОК И ФОРМАТ СЕРИАЛИЗАЦИИ
**Язык текста:** тот же, что и язык главы (или основной язык книги). Для мультиязычных коллекций — зафиксировать в конфиге (например, всегда русский / всегда язык главы).
**Порядок секций** (приоритет при truncation — сверху вниз):
```
FRAMEWORK
{framework}
INSIGHTS
{insights}
APPLICATION
{application}
```
**Разделители:**
- Между секциями: заголовок секции (FRAMEWORK, INSIGHTS, APPLICATION) + пустая строка.
- Внутри секции: элементы разделять переносом строки или маркером «—»; не склеивать в один абзац. Пример: каждый принцип — с новой строки; каждый инсайт — с новой строки; каждая техника — с новой строки.
**Формат полей:** читаемый текст с подписями («Принцип: …», «Инсайт: …», «Техника: …») или компактный структурированный текст. Избегать сырого JSON без подписей; предпочитать человекочитаемую склейку.
**Подстановки при сборке:**
- `{framework}` — строка из JSON блока framework (принципы, terms; chains при необходимости).
- `{insights}` — строка из JSON блока insights.
- `{application}` — строка из JSON блока application.
**Пример сериализации (фрагмент):**
```
FRAMEWORK
Принцип: Правило двух минут. Описание: Если действие занимает меньше двух минут — сделай его сразу. Пример: ответ на короткий email, вынести мусор.
Термины: атомная привычка — сверхмалое действие, повторяемое ежедневно.
INSIGHTS
Инсайт: Привычки формируют идентичность. Мы меняемся не через цели, а через системы и повторяющиеся действия.
APPLICATION
Техника: Снижение барьера входа. Цель: начать действие без откладывания. Шаги: сформулировать версию привычки «на 2 минуты»; выполнять её в одно и то же время; после закрепления — расширять.
```
**Нормализация перед подачей в модель:** схлопнуть множественные пробелы и переносы в один; обрезать пробелы по краям строк и в начале/конце итогового текста. Это уменьшает разброс из‑за форматирования.
---
## ЛИМИТ МОДЕЛИ И СТРАТЕГИЯ ПРЕВЫШЕНИЯ
- **Лимит (bge-m3):** 8192 токенов на вход. Полный анализ главы обычно укладывается. Для других моделей — лимит указывать в конфиге.
- **Если текст укладывается в лимит:** передать один сконкатенированный текст (FRAMEWORK + INSIGHTS + APPLICATION) в один вызов модели.
- **Если текст длиннее лимита** — выбрать одну из стратегий (зафиксировать в конфиге):
1. **truncate_priority:** обрезать текст до лимита. Сохранять в порядке приоритета: сначала APPLICATION (техники важны для поиска), затем INSIGHTS, затем FRAMEWORK. Отбрасывать с конца не поместившегося блока.
2. **truncate_per_section:** обрезать до лимита, сохраняя начало каждой секции. Сначала поместить начало FRAMEWORK, затем начало INSIGHTS, затем начало APPLICATION, пока не исчерпается лимит.
3. **chunk_aggregate:** разбить текст **последовательно** (с начала к концу) на чанки по лимиту; получить вектор для каждого чанка; усреднить векторы (или другой способ агрегации) и сохранить один итоговый вектор. Способ агрегации — в конфиге.
---
## ВЫХОД
- Один вектор фиксированной размерности. Для bge-m3 — **1024**. При смене модели размерность меняется; коллекции Qdrant создавать с соответствующим size.
- Вектор сохраняется в Qdrant в коллекции `chapter_analyses`. Payload — по схеме из ARCHITECTURE_SUMMARY.md: bookId, chapterId, chapterNumber, chapterTitle, validationScore, tags и др. Текст анализа в payload при необходимости хранить отдельно или не хранить (по политике системы).
---
## КОНФИГУРАЦИЯ
- Модель эмбеддингов: env/конфиг (по умолчанию EMBED_MODEL=bge-m3).
- Лимит токенов модели: конфиг (для bge-m3: EMBED_MAX_TOKENS=8192).
- Размерность вектора: для bge-m3 — 1024; при смене модели задавать в конфиге и пересоздавать коллекции Qdrant.
- Стратегия при превышении: конфиг (truncate_priority | truncate_per_section | chunk_aggregate).
- Включение limitations в текст: опционально, конфиг (по умолчанию false).
- Язык сериализации (при мультиязычности): опционально, конфиг (например, chapter_lang | book_lang | fixed:ru).

View File

@@ -0,0 +1,33 @@
# Сохранение в Qdrant (шаг 7)
Сохранение вектора эмбеддинга (шаг 6) и метаданных в коллекцию `chapter_analyses`. Метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author) берутся из merged JSON — они попадают туда на шаге 5 при мерже с `--input-chapter` (входной JSON этапа 1).
## Вход
- **merged JSON** (шаг 5): теги, анализ и метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author). Должны быть подмешаны при мерже через `--input-chapter` (вход этапа 1).
- **Вектор** (шаг 6): файл с JSON-массивом чисел или stdin.
- Опционально: `--validation-score`.
## Выход
Одна точка в коллекции Qdrant: id = `chapter_id`, vector = эмбеддинг, payload = bookId, chapterId, chapterNumber, chapterTitle, validationScore, tags, title, author (по схеме ARCHITECTURE_SUMMARY).
## Использование
```bash
# Вектор из файла (merged должен содержать book_id, chapter_id, chapter_number, chapter_title из шага 5 с --input-chapter)
python3 save_to_qdrant.py merged_with_tags.json vector.json [--validation-score 0.95]
# Вектор из stdin (пайплайн с шагом 6)
python3 6_генерация_эмбеддингов/embed_cli.py merged_with_tags.json model_name \
| python3 7_сохранение_qdrant/save_to_qdrant.py merged_with_tags.json -
```
## Переменные окружения
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `QDRANT_URL` | `http://localhost:6333` | URL Qdrant |
| `QDRANT_COLLECTION_CHAPTER_ANALYSES` | `chapter_analyses` | Имя коллекции |
В Docker используйте `QDRANT_URL=http://qdrant:6333`.

View File

@@ -0,0 +1,204 @@
#!/usr/bin/env python3
"""
Шаг 7: сохранение вектора эмбеддинга и payload в коллекцию Qdrant chapter_analyses.
Вход:
- merged JSON (шаг 5): теги, анализ и метаданные главы/книги (book_id, chapter_id,
chapter_number, chapter_title, book_title, author — из входного JSON этапа 1,
подмешанные при мерже через --input-chapter).
- вектор (файл или stdin): результат шага 6 (embed_cli.py).
Выход: одна точка в коллекции chapter_analyses (upsert по chapter_id).
"""
import argparse
import json
import os
import sys
import urllib.error
import urllib.request
from pathlib import Path
from typing import Any
def env(name: str, default: str) -> str:
"""Читает переменную окружения или default."""
return os.environ.get(name, default).strip()
def tags_from_merged(merged: dict[str, Any]) -> list[dict[str, Any]]:
"""Преобразует теги из merged JSON в плоский список для payload (tag, category, confidence)."""
result: list[dict[str, Any]] = []
tags_block = merged.get("tags") or {}
for category, items in tags_block.items():
for item in items if isinstance(items, list) else []:
if isinstance(item, dict) and "tag" in item:
result.append({
"tag": item["tag"],
"category": category,
"confidence": item.get("confidence"),
})
return result
def payload_from_merged(merged: dict[str, Any], validation_score: float | None = None) -> dict[str, Any]:
"""
Собирает payload для Qdrant из merged JSON (шаг 5).
Ожидает в merged поля из входного JSON этапа 1: book_id, chapter_id,
chapter_number, chapter_title, book_title; опционально author.
"""
required = ("book_id", "chapter_id", "chapter_number", "chapter_title")
missing = [k for k in required if not merged.get(k)]
if missing:
raise ValueError(
f"В merged JSON отсутствуют поля (должны быть из входного JSON этапа 1, мерж с --input-chapter): {missing}"
)
payload: dict[str, Any] = {
"bookId": merged["book_id"],
"chapterId": merged["chapter_id"],
"chapterNumber": int(merged["chapter_number"]),
"chapterTitle": merged["chapter_title"],
"tags": tags_from_merged(merged),
}
if validation_score is not None:
payload["validationScore"] = validation_score
if merged.get("book_title") is not None:
payload["title"] = merged["book_title"]
if merged.get("author") is not None:
payload["author"] = merged["author"]
return payload
def load_vector(path: Path | None) -> list[float]:
"""Загружает вектор из файла или stdin (JSON-массив)."""
if path is None or str(path) == "-":
data = json.load(sys.stdin)
else:
with open(path, encoding="utf-8") as f:
data = json.load(f)
if not isinstance(data, list):
raise ValueError("Вектор должен быть JSON-массивом чисел")
return [float(x) for x in data]
def upsert_point(
base_url: str,
collection: str,
point_id: str,
vector: list[float],
payload: dict[str, Any],
) -> dict[str, Any]:
"""Добавляет или обновляет одну точку в коллекции Qdrant."""
url = f"{base_url.rstrip('/')}/collections/{collection}/points?wait=true"
body = {
"points": [
{
"id": point_id,
"vector": vector,
"payload": payload,
}
]
}
req_body = json.dumps(body).encode("utf-8")
req = urllib.request.Request(
url,
data=req_body,
headers={"Content-Type": "application/json"},
method="PUT",
)
with urllib.request.urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode("utf-8"))
def main() -> int:
"""Точка входа CLI."""
parser = argparse.ArgumentParser(
description="Шаг 7: сохранить вектор и payload в Qdrant (коллекция chapter_analyses).",
)
parser.add_argument(
"merged_json",
type=Path,
help="Путь к merged JSON (шаг 5) — для тегов и др.",
)
parser.add_argument(
"vector",
nargs="?",
default=None,
help="Путь к файлу с вектором (JSON-массив) или '-' для stdin.",
)
parser.add_argument(
"--validation-score",
type=float,
default=None,
help="Оценка валидации (опционально).",
)
parser.add_argument(
"--qdrant-url",
default=env("QDRANT_URL", "http://localhost:6333"),
help="URL Qdrant (по умолчанию из QDRANT_URL или localhost:6333).",
)
parser.add_argument(
"--collection",
default=env("QDRANT_COLLECTION_CHAPTER_ANALYSES", "chapter_analyses"),
help="Имя коллекции.",
)
args = parser.parse_args()
if not args.merged_json.exists():
print(f"Ошибка: файл не найден: {args.merged_json}", file=sys.stderr)
return 1
try:
with open(args.merged_json, encoding="utf-8") as f:
merged = json.load(f)
except json.JSONDecodeError as e:
print(f"Ошибка разбора merged JSON: {e}", file=sys.stderr)
return 1
try:
vector = load_vector(args.vector)
except (ValueError, FileNotFoundError) as e:
print(f"Ошибка загрузки вектора: {e}", file=sys.stderr)
return 1
try:
payload = payload_from_merged(merged, validation_score=args.validation_score)
except ValueError as e:
print(f"Ошибка: {e}", file=sys.stderr)
return 1
chapter_id = merged["chapter_id"]
try:
result = upsert_point(
args.qdrant_url,
args.collection,
point_id=chapter_id,
vector=vector,
payload=payload,
)
except urllib.error.HTTPError as e:
print(f"Ошибка HTTP {e.code}: {e.reason}", file=sys.stderr)
if e.fp:
try:
print(e.fp.read().decode("utf-8")[:500], file=sys.stderr)
except Exception:
pass
return 1
except urllib.error.URLError as e:
print(f"Ошибка запроса к Qdrant: {e.reason}", file=sys.stderr)
return 1
except Exception as e:
print(f"Ошибка: {e}", file=sys.stderr)
return 1
if result.get("status") == "ok":
print(f"Точка {chapter_id} сохранена в коллекцию {args.collection}.", flush=True)
return 0
print(f"Неожиданный ответ Qdrant: {result}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())

View File

@@ -0,0 +1,45 @@
# Сохранение в Postgres (шаг 8)
Сохранение анализа главы и тегов в реляционную БД: книга, глава, запись в `chapter_analyses`, теги в `tags`, связи в `chapter_tags`. Вход — merged JSON (шаг 5) с метаданными из этапа 1.
## Схема
Перед первым запуском применить схему:
```bash
psql -h localhost -U n8n -d n8n -f schema.sql
# или через docker: docker exec -i postgres psql -U n8n -d n8n < 8_сохранение_postgres/schema.sql
```
Таблицы: `books`, `chapters`, `chapter_analyses`, `tags`, `chapter_tags` (см. ARCHITECTURE_SUMMARY.md).
## Вход
- **merged JSON** (шаг 5): book_id, chapter_id, chapter_number, chapter_title, book_title, author, framework, insights, application, limitations, tags. Метаданные должны быть подмешаны через `--input-chapter` на шаге 5.
## Действия
1. Upsert книги (books) по book_id.
2. Upsert главы (chapters) по chapter_id.
3. Insert/update анализа в chapter_analyses (analysis_result = framework + insights + application + limitations).
4. Get-or-create тегов в tags (name, category); связи в chapter_tags (chapter_id, tag_id, confidence, validated, source='ai_validation').
## Использование
```bash
pip install -r requirements.txt # один раз
python3 save_to_postgres.py 5_мерж_анализа_и_тегов/merged_with_tags.json [--validation-score 0.95]
```
## Переменные окружения
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `DATABASE_URL` | — | Полный URL (postgresql://user:pass@host:port/dbname). Если задан, остальные игнорируются. |
| `POSTGRES_HOST` | localhost | Хост Postgres |
| `POSTGRES_PORT` | 5432 | Порт |
| `POSTGRES_USER` | n8n | Пользователь |
| `POSTGRES_PASSWORD` | n8n_password | Пароль |
| `POSTGRES_DB` | n8n | Имя БД |
В Docker используйте `POSTGRES_HOST=postgres` (имя сервиса).

View File

@@ -0,0 +1 @@
psycopg2-binary>=2.9.9

View File

@@ -0,0 +1,252 @@
#!/usr/bin/env python3
"""
Шаг 8: сохранение анализа главы и тегов в Postgres.
Вход: merged JSON (шаг 5) с полями book_id, chapter_id, chapter_number, chapter_title,
book_title, author, framework, insights, application, limitations, tags.
Действия: upsert книги и главы, запись в chapter_analyses, get-or-create тегов в tags,
связи в chapter_tags. Ожидается, что схема уже применена (schema.sql).
"""
import argparse
import json
import os
import sys
import uuid
from pathlib import Path
from typing import Any
try:
import psycopg2
except ImportError:
print("Ошибка: установите psycopg2-binary (pip install psycopg2-binary).", file=sys.stderr)
sys.exit(1)
def env(name: str, default: str) -> str:
"""Читает переменную окружения или default."""
return os.environ.get(name, default).strip()
def get_connection(database_url: str | None = None):
"""Создаёт подключение к Postgres."""
if database_url:
return psycopg2.connect(database_url)
host = env("POSTGRES_HOST", "localhost")
port = env("POSTGRES_PORT", "5432")
user = env("POSTGRES_USER", "n8n")
password = env("POSTGRES_PASSWORD", "n8n_password")
dbname = env("POSTGRES_DB", "n8n")
return psycopg2.connect(
host=host,
port=port,
user=user,
password=password,
dbname=dbname,
)
def upsert_book(conn, book_id: str, title: str | None, author: str | None) -> None:
"""Вставка или обновление книги."""
with conn.cursor() as cur:
cur.execute(
"""
INSERT INTO books (id, title, author, updated_at)
VALUES (%s, %s, %s, NOW())
ON CONFLICT (id) DO UPDATE SET
title = COALESCE(EXCLUDED.title, books.title),
author = COALESCE(EXCLUDED.author, books.author),
updated_at = NOW()
""",
(book_id, title or "", author or ""),
)
def upsert_chapter(
conn,
chapter_id: str,
book_id: str,
chapter_number: int,
chapter_title: str | None,
content: str | None = None,
) -> None:
"""Вставка или обновление главы."""
with conn.cursor() as cur:
cur.execute(
"""
INSERT INTO chapters (id, book_id, chapter_number, chapter_title, content)
VALUES (%s, %s, %s, %s, %s)
ON CONFLICT (id) DO UPDATE SET
book_id = EXCLUDED.book_id,
chapter_number = EXCLUDED.chapter_number,
chapter_title = COALESCE(EXCLUDED.chapter_title, chapters.chapter_title),
content = COALESCE(EXCLUDED.content, chapters.content)
""",
(chapter_id, book_id, chapter_number, chapter_title or "", content),
)
def upsert_chapter_analysis(
conn,
chapter_id: str,
analysis_result: dict[str, Any],
validation_score: float | None = None,
) -> None:
"""Вставка или обновление анализа главы."""
with conn.cursor() as cur:
cur.execute(
"""
INSERT INTO chapter_analyses (chapter_id, analysis_result, validation_score, validated_at)
VALUES (%s, %s, %s, NOW())
ON CONFLICT (chapter_id) DO UPDATE SET
analysis_result = EXCLUDED.analysis_result,
validation_score = COALESCE(EXCLUDED.validation_score, chapter_analyses.validation_score),
validated_at = NOW()
""",
(chapter_id, json.dumps(analysis_result, ensure_ascii=False), validation_score),
)
def get_or_create_tag(conn, name: str, category: str) -> str:
"""Возвращает id тега по имени; создаёт тег при отсутствии."""
with conn.cursor() as cur:
cur.execute("SELECT id FROM tags WHERE name = %s", (name,))
row = cur.fetchone()
if row:
return str(row[0])
tag_id = str(uuid.uuid4())
cur.execute(
"INSERT INTO tags (id, name, category) VALUES (%s, %s, %s)",
(tag_id, name, category),
)
return tag_id
def upsert_chapter_tags(
conn,
chapter_id: str,
tags_flat: list[tuple[str, str, float | None]],
) -> None:
"""Связывает главу с тегами (get-or-create тегов, вставка в chapter_tags)."""
with conn.cursor() as cur:
for name, category, confidence in tags_flat:
tag_id = get_or_create_tag(conn, name, category)
cur.execute(
"""
INSERT INTO chapter_tags (chapter_id, tag_id, confidence, validated, source)
VALUES (%s, %s, %s, true, 'ai_validation')
ON CONFLICT (chapter_id, tag_id) DO UPDATE SET
confidence = EXCLUDED.confidence,
validated = true
""",
(chapter_id, tag_id, confidence),
)
def tags_from_merged(merged: dict[str, Any]) -> list[tuple[str, str, float | None]]:
"""(name, category, confidence) из merged JSON."""
result: list[tuple[str, str, float | None]] = []
for category, items in (merged.get("tags") or {}).items():
for item in items if isinstance(items, list) else []:
if isinstance(item, dict) and "tag" in item:
result.append((
item["tag"],
category,
item.get("confidence"),
))
return result
def analysis_result_from_merged(merged: dict[str, Any]) -> dict[str, Any]:
"""Блок для chapter_analyses.analysis_result (framework, insights, application, limitations)."""
return {
"framework": merged.get("framework"),
"insights": merged.get("insights"),
"application": merged.get("application"),
"limitations": merged.get("limitations"),
}
def main() -> int:
parser = argparse.ArgumentParser(
description="Шаг 8: сохранить анализ и теги в Postgres (merged JSON → books, chapters, chapter_analyses, tags, chapter_tags).",
)
parser.add_argument(
"merged_json",
type=Path,
help="Путь к merged JSON (шаг 5).",
)
parser.add_argument(
"--validation-score",
type=float,
default=None,
help="Оценка валидации (опционально).",
)
parser.add_argument(
"--database-url",
default=env("DATABASE_URL", ""),
help="URL подключения к Postgres (или POSTGRES_HOST/USER/PASSWORD/DB).",
)
args = parser.parse_args()
if not args.merged_json.exists():
print(f"Ошибка: файл не найден: {args.merged_json}", file=sys.stderr)
return 1
try:
with open(args.merged_json, encoding="utf-8") as f:
merged = json.load(f)
except json.JSONDecodeError as e:
print(f"Ошибка разбора JSON: {e}", file=sys.stderr)
return 1
required = ("book_id", "chapter_id", "chapter_number", "chapter_title")
missing = [k for k in required if not merged.get(k)]
if missing:
print(f"Ошибка: в merged нет полей (нужен мерж с --input-chapter): {missing}", file=sys.stderr)
return 1
database_url = args.database_url or None
try:
conn = get_connection(database_url)
except Exception as e:
print(f"Ошибка подключения к Postgres: {e}", file=sys.stderr)
return 1
try:
upsert_book(
conn,
merged["book_id"],
merged.get("book_title"),
merged.get("author"),
)
upsert_chapter(
conn,
merged["chapter_id"],
merged["book_id"],
int(merged["chapter_number"]),
merged.get("chapter_title"),
merged.get("chapter_text"), # если подмешали в мерж
)
upsert_chapter_analysis(
conn,
merged["chapter_id"],
analysis_result_from_merged(merged),
args.validation_score,
)
upsert_chapter_tags(conn, merged["chapter_id"], tags_from_merged(merged))
conn.commit()
except Exception as e:
conn.rollback()
print(f"Ошибка: {e}", file=sys.stderr)
return 1
finally:
conn.close()
print(f"Глава {merged['chapter_id']} сохранена в Postgres (books, chapters, chapter_analyses, tags, chapter_tags).", flush=True)
return 0
if __name__ == "__main__":
sys.exit(main())

View File

@@ -0,0 +1,56 @@
-- Минимальная схема для этапа 8: книги, главы, анализы глав, теги, связи глава–тег.
-- Запускать один раз (например: psql -f schema.sql или через скрипт инициализации).
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE IF NOT EXISTS books (
id UUID PRIMARY KEY,
title VARCHAR(1024),
author VARCHAR(512),
metadata JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapters (
id UUID PRIMARY KEY,
book_id UUID NOT NULL REFERENCES books(id) ON DELETE CASCADE,
chapter_number INTEGER NOT NULL,
chapter_title VARCHAR(1024),
content TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapter_analyses (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chapter_id UUID NOT NULL UNIQUE REFERENCES chapters(id) ON DELETE CASCADE,
analysis_result JSONB NOT NULL,
validation_score FLOAT,
validated_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(512) NOT NULL UNIQUE,
category VARCHAR(64),
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS chapter_tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
chapter_id UUID NOT NULL REFERENCES chapters(id) ON DELETE CASCADE,
tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
confidence FLOAT,
validated BOOLEAN DEFAULT true,
source VARCHAR(64) DEFAULT 'ai_validation',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE (chapter_id, tag_id)
);
CREATE INDEX IF NOT EXISTS idx_chapters_book_id ON chapters(book_id);
CREATE INDEX IF NOT EXISTS idx_chapter_analyses_chapter_id ON chapter_analyses(chapter_id);
CREATE INDEX IF NOT EXISTS idx_chapter_tags_chapter_id ON chapter_tags(chapter_id);
CREATE INDEX IF NOT EXISTS idx_chapter_tags_tag_id ON chapter_tags(tag_id);
CREATE INDEX IF NOT EXISTS idx_tags_category ON tags(category);

1377
ARCHITECTURE_SUMMARY.md Normal file

File diff suppressed because it is too large Load Diff

101
EPUB Parser Pipeline.json Normal file
View File

@@ -0,0 +1,101 @@
{
"name": "EPUB Parser Pipeline",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "epub-upload",
"responseMode": "responseNode",
"options": {
"rawBody": true
}
},
"id": "acc0fb8b-e1a9-41e8-a12b-a898a0b49f54",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1.1,
"position": [
752,
32
],
"webhookId": "epub-upload-webhook"
},
{
"parameters": {
"method": "POST",
"url": "http://epub-parser:5000/parse",
"sendBody": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"parameterType": "formBinaryData",
"name": "data",
"inputDataFieldName": "data"
}
]
},
"options": {}
},
"id": "255ac328-6456-4ca1-89ea-6d3bb32af971",
"name": "FastAPI Request",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1040,
0
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ $json }}",
"options": {}
},
"id": "2886fd4e-ebee-41ee-bc11-ca0e716b104f",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1296,
32
]
}
],
"pinData": {},
"connections": {
"Webhook": {
"main": [
[
{
"node": "FastAPI Request",
"type": "main",
"index": 0
}
]
]
},
"FastAPI Request": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"availableInMCP": false
},
"versionId": "e04355ab-d49d-4cfc-82b7-e40b90d72160",
"meta": {
"instanceId": "0627756eca94c4f84a889829afba19028b408eb6c4a023b2f7efeaae0c40f490"
},
"id": "JOTxekOa0aQppw5ckd9bC",
"tags": []
}

BIN
books/.DS_Store vendored Normal file

Binary file not shown.

BIN
books/5e41a8b020384.epub Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,291 @@
{
"book": {
"title": "Agile-трансформация. Раскрывая гибкость бизнеса",
"author": "Йорген Хессельберг",
"totalChapters": 35,
"totalCharacters": 727705,
"totalTokens": 302267
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "An Insider’s Guide to Agile Enterprise Transformation",
"characters": 14,
"tokens": 41,
"footnotesCount": 0,
"filePath": "t1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "Раскрывая гибкость бизнеса",
"characters": 33,
"tokens": 37,
"footnotesCount": 0,
"filePath": "t2.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "ИНФОРМАЦИЯОТ ИЗДАТЕЛЬСТВА",
"characters": 2007,
"tokens": 828,
"footnotesCount": 0,
"filePath": "info.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Posv",
"characters": 110,
"tokens": 61,
"footnotesCount": 0,
"filePath": "posv.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "ПРЕДИСЛОВИЕ БЬЯРТЕ БОГСНЕСА",
"characters": 2715,
"tokens": 1112,
"footnotesCount": 0,
"filePath": "pre1.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "ПРЕДИСЛОВИЕ РИЧАРДА ШЕРИДАНА",
"characters": 6254,
"tokens": 2529,
"footnotesCount": 1,
"filePath": "pre2.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "КОМУ СТОИТ ПРОЧИТАТЬ ЭТУ КНИГУ?",
"characters": 10176,
"tokens": 4096,
"footnotesCount": 0,
"filePath": "vv.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "АРГУМЕНТЫ В ПОЛЬЗУ ГИБКОСТИ",
"characters": 297,
"tokens": 143,
"footnotesCount": 0,
"filePath": "ch1.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "ПРОИСХОЖДЕНИЕ СОВРЕМЕННОГО МЕНЕДЖМЕНТА",
"characters": 57449,
"tokens": 23012,
"footnotesCount": 36,
"filePath": "G1.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "РАЗРАБОТКА ГИБКОСТИ БИЗНЕСА: БАЛАНС ТРЕХ ВАЖНЫХ РЫЧАГОВ",
"characters": 65946,
"tokens": 26417,
"footnotesCount": 22,
"filePath": "G2.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "ПЯТЬ ИЗМЕРЕНИЙ ГИБКОСТИ",
"characters": 230,
"tokens": 116,
"footnotesCount": 0,
"filePath": "ch2.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "СОЗДАНИЕ ПРАВИЛЬНОГО ПРОДУКТА: ПРОДУКТЫ, КОТОРЫЕ ПОЛЮБЯТ ПОТРЕБИТЕЛИ",
"characters": 74330,
"tokens": 29780,
"footnotesCount": 32,
"filePath": "G3.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "ФИЗИЧЕСКИЙ ДИЗАЙН РАБОЧЕГО МЕСТА",
"characters": 61729,
"tokens": 24719,
"footnotesCount": 14,
"filePath": "G4.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "НЕЛЬЗЯ НЕДООЦЕНИВАТЬ ВАЖНОСТЬ ЛЮДЕЙ",
"characters": 51401,
"tokens": 20589,
"footnotesCount": 20,
"filePath": "G5.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "РУКОВОДСТВО ПЯТОГО УРОВНЯ = ГИБКОЕ ЛИДЕРСТВО?",
"characters": 52810,
"tokens": 21156,
"footnotesCount": 18,
"filePath": "G6.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "ВЗАИМОДЕЙСТВИЕ — «МЫ ПРЕУСПЕЛИ, РАБОТАЯ ВМЕСТЕ»",
"characters": 78382,
"tokens": 31385,
"footnotesCount": 37,
"filePath": "G7.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "AGILE-ТРАНСФОРМАЦИЯ",
"characters": 329,
"tokens": 153,
"footnotesCount": 0,
"filePath": "ch3.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "СОЗДАНИЕ РАБОЧЕЙ AGILE-ГРУППЫ В ОРГАНИЗАЦИИ",
"characters": 44146,
"tokens": 17691,
"footnotesCount": 10,
"filePath": "G8.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "ОПЕРАЦИОННАЯ МОДЕЛЬ ГИБКОГО БИЗНЕСА",
"characters": 94436,
"tokens": 37803,
"footnotesCount": 23,
"filePath": "G9.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "AGILE-ТРАНСФОРМАЦИЯ: СТРАТЕГИЧЕСКАЯ ДОРОЖНАЯ КАРТА",
"characters": 94378,
"tokens": 37787,
"footnotesCount": 16,
"filePath": "G10.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "БЛАГОДАРНОСТИ",
"characters": 2967,
"tokens": 1209,
"footnotesCount": 0,
"filePath": "thanks.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 1179,
"tokens": 491,
"footnotesCount": 0,
"filePath": "about.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 2872,
"tokens": 2312,
"footnotesCount": 64,
"filePath": "note1.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "Глава 2",
"characters": 1880,
"tokens": 1516,
"footnotesCount": 38,
"filePath": "note2.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "Глава 3",
"characters": 2626,
"tokens": 2116,
"footnotesCount": 50,
"filePath": "note3.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "Глава 4",
"characters": 1578,
"tokens": 1275,
"footnotesCount": 24,
"filePath": "note4.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "Глава 5",
"characters": 2306,
"tokens": 1859,
"footnotesCount": 38,
"filePath": "note5.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "Глава 6",
"characters": 1817,
"tokens": 1467,
"footnotesCount": 36,
"filePath": "note6.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "Глава 7",
"characters": 3692,
"tokens": 2970,
"footnotesCount": 72,
"filePath": "note7.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "Глава 8",
"characters": 630,
"tokens": 515,
"footnotesCount": 16,
"filePath": "note8.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "Глава 9",
"characters": 2347,
"tokens": 1892,
"footnotesCount": 44,
"filePath": "note9.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Глава 10",
"characters": 1801,
"tokens": 1456,
"footnotesCount": 30,
"filePath": "note10.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "ПРИМЕЧАНИЯ РЕДАКЦИИ",
"characters": 4320,
"tokens": 3484,
"footnotesCount": 50,
"filePath": "links.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "МИФ Бизнес",
"characters": 161,
"tokens": 86,
"footnotesCount": 0,
"filePath": "business.html"
},
{
"chapterNumber": 35,
"chapterTitle": "НАД КНИГОЙ РАБОТАЛИ",
"characters": 357,
"tokens": 164,
"footnotesCount": 0,
"filePath": "end.xhtml"
}
]
}

View File

@@ -0,0 +1,267 @@
{
"book": {
"title": "Атомные привычки. Как приобрести хорошие привычки и избавиться от плохих",
"author": "Джеймс Клир",
"totalChapters": 32,
"totalCharacters": 387746,
"totalTokens": 155999
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Джеймс Клир Атомные привычки Как приобрести хорошие привычки и избавиться о плохих",
"characters": 82,
"tokens": 76,
"footnotesCount": 0,
"filePath": "ch1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "* * *",
"characters": 1038,
"tokens": 431,
"footnotesCount": 0,
"filePath": "ch1-1.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Введение Моя история",
"characters": 19573,
"tokens": 7851,
"footnotesCount": 0,
"filePath": "ch1-2.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Основные принципы Почему небольшие изменения приводят к грандиозным результатам",
"characters": 79,
"tokens": 76,
"footnotesCount": 0,
"filePath": "ch1-3.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Удивительная сила атомных привычек",
"characters": 27731,
"tokens": 11119,
"footnotesCount": 0,
"filePath": "ch1-4.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Как привычки формируют идентичность (и наоборот)",
"characters": 23868,
"tokens": 9580,
"footnotesCount": 0,
"filePath": "ch1-5.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "Четыре простых шага для формирования лучших привычек",
"characters": 19798,
"tokens": 7953,
"footnotesCount": 0,
"filePath": "ch1-6.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Первый закон Придайте очевидности",
"characters": 33,
"tokens": 40,
"footnotesCount": 0,
"filePath": "ch1-7.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Человек, который плохо выглядел",
"characters": 14776,
"tokens": 5936,
"footnotesCount": 0,
"filePath": "ch1-8.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Лучший способ сформировать новую привычку",
"characters": 17468,
"tokens": 7017,
"footnotesCount": 0,
"filePath": "ch1-9.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "Значение мотивации преувеличено: важность окружения",
"characters": 18232,
"tokens": 7326,
"footnotesCount": 0,
"filePath": "ch1-10.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "Секрет самоконтроля",
"characters": 10117,
"tokens": 4067,
"footnotesCount": 0,
"filePath": "ch1-11.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "Второй закон Добавьте привлекательности",
"characters": 39,
"tokens": 44,
"footnotesCount": 0,
"filePath": "ch1-12.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "Как сделать привычку привлекательной",
"characters": 19890,
"tokens": 7984,
"footnotesCount": 0,
"filePath": "ch1-13.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "Роль семьи и друзей в формировании привычек",
"characters": 17527,
"tokens": 7041,
"footnotesCount": 0,
"filePath": "ch1-14.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "Как найти и устранить причины вредных привычек",
"characters": 15973,
"tokens": 6421,
"footnotesCount": 0,
"filePath": "ch1-15.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "Третий закон Упростите",
"characters": 9908,
"tokens": 3985,
"footnotesCount": 0,
"filePath": "ch1-16.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "Закон наименьшего усилия",
"characters": 17359,
"tokens": 6966,
"footnotesCount": 0,
"filePath": "ch1-17.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "Правило двух минут",
"characters": 11986,
"tokens": 4815,
"footnotesCount": 0,
"filePath": "ch1-18.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "Как сделать хорошие привычки неизбежными, а плохие невозможными",
"characters": 12059,
"tokens": 4863,
"footnotesCount": 0,
"filePath": "ch1-19.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "Четвертый закон Привнесите удовольствие",
"characters": 39,
"tokens": 44,
"footnotesCount": 0,
"filePath": "ch1-20.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "Главное правило изменения поведения",
"characters": 20125,
"tokens": 8078,
"footnotesCount": 0,
"filePath": "ch1-21.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "Хорошие привычки каждый день",
"characters": 18060,
"tokens": 7249,
"footnotesCount": 0,
"filePath": "ch1-22.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "Как друзья могут помочь в овладении привычками",
"characters": 11540,
"tokens": 4648,
"footnotesCount": 0,
"filePath": "ch1-23.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "Правда о таланте (когда гены важны, а когда нет)",
"characters": 20896,
"tokens": 8391,
"footnotesCount": 0,
"filePath": "ch1-24.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "Правило Златовласки: как оставаться мотивированным в жизни и на работе",
"characters": 12960,
"tokens": 5226,
"footnotesCount": 0,
"filePath": "ch1-25.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "Обратная сторона хороших привычек",
"characters": 16591,
"tokens": 6663,
"footnotesCount": 0,
"filePath": "ch1-26.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "Заключение Секрет: как достичь долговременных результатов",
"characters": 4561,
"tokens": 1860,
"footnotesCount": 0,
"filePath": "ch1-27.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "Приложения",
"characters": 11535,
"tokens": 4632,
"footnotesCount": 0,
"filePath": "ch1-28.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "Благодарности",
"characters": 3878,
"tokens": 1570,
"footnotesCount": 0,
"filePath": "ch1-29.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "От издательства",
"characters": 385,
"tokens": 174,
"footnotesCount": 0,
"filePath": "ch1-30.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Примечания",
"characters": 9640,
"tokens": 3873,
"footnotesCount": 0,
"filePath": "ch2.xhtml"
}
]
}

View File

@@ -0,0 +1,243 @@
{
"book": {
"title": "Бизнес с нуля: Метод Lean Startup для быстрого тестирования идей и выбора бизнес-модели",
"author": "Эрик Рис",
"totalChapters": 29,
"totalCharacters": 501340,
"totalTokens": 201309
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Content03",
"characters": 5588,
"tokens": 2257,
"footnotesCount": 0,
"filePath": "Text/content03.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Content04",
"characters": 16,
"tokens": 28,
"footnotesCount": 0,
"filePath": "Text/content04.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Content0",
"characters": 0,
"tokens": 21,
"footnotesCount": 0,
"filePath": "Text/content0.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Content01",
"characters": 0,
"tokens": 22,
"footnotesCount": 0,
"filePath": "Text/content01.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Content02",
"characters": 832,
"tokens": 354,
"footnotesCount": 0,
"filePath": "Text/content02.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Истоки системы «экономичный стартап»",
"characters": 20081,
"tokens": 8065,
"footnotesCount": 0,
"filePath": "Text/content05.html"
},
{
"chapterNumber": 7,
"chapterTitle": "ВИДЕНИЕ",
"characters": 7,
"tokens": 23,
"footnotesCount": 0,
"filePath": "Text/content_1.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Как возникла система «экономичный стартап»",
"characters": 13962,
"tokens": 5618,
"footnotesCount": 0,
"filePath": "Text/content1.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Кого можно назвать предпринимателем?",
"characters": 21001,
"tokens": 8432,
"footnotesCount": 0,
"filePath": "Text/content2.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Кого можно назвать предпринимателем?",
"characters": 33221,
"tokens": 13320,
"footnotesCount": 0,
"filePath": "Text/content3.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Хотите долгосрочных изменений? Экспериментируйте!",
"characters": 30391,
"tokens": 12193,
"footnotesCount": 0,
"filePath": "Text/content4.html"
},
{
"chapterNumber": 12,
"chapterTitle": "САДИМСЯ ЗА РУЛЬ",
"characters": 8,
"tokens": 28,
"footnotesCount": 0,
"filePath": "Text/content_2.html"
},
{
"chapterNumber": 13,
"chapterTitle": "От видения к практике",
"characters": 5527,
"tokens": 2236,
"footnotesCount": 0,
"filePath": "Text/content5.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Стратегия основана на предположениях",
"characters": 21948,
"tokens": 8811,
"footnotesCount": 0,
"filePath": "Text/content6.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Тестирование",
"characters": 40666,
"tokens": 16288,
"footnotesCount": 0,
"filePath": "Text/content7.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Как работает учет инноваций: три обучающих этапа",
"characters": 59200,
"tokens": 23717,
"footnotesCount": 0,
"filePath": "Text/content8.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Учет инноваций ускоряет процесс",
"characters": 51652,
"tokens": 20690,
"footnotesCount": 0,
"filePath": "Text/content9.html"
},
{
"chapterNumber": 18,
"chapterTitle": "НАБИРАЕМ СКОРОСТЬ",
"characters": 9,
"tokens": 28,
"footnotesCount": 0,
"filePath": "Text/content_3.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Как запустить механизм",
"characters": 5837,
"tokens": 2361,
"footnotesCount": 0,
"filePath": "Text/content10.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Подход небольших партий в сфере предпринимательства",
"characters": 37655,
"tokens": 15101,
"footnotesCount": 0,
"filePath": "Text/content11.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Как добиться роста?",
"characters": 29714,
"tokens": 11911,
"footnotesCount": 0,
"filePath": "Text/content12.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Построение адаптивной организации",
"characters": 48018,
"tokens": 19239,
"footnotesCount": 0,
"filePath": "Text/content13.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Создание инноваций",
"characters": 33465,
"tokens": 13412,
"footnotesCount": 0,
"filePath": "Text/content14.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Эпилог: никаких потерь",
"characters": 22522,
"tokens": 9035,
"footnotesCount": 0,
"filePath": "Text/content15.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Присоединяйтесь к движению",
"characters": 4440,
"tokens": 1805,
"footnotesCount": 0,
"filePath": "Text/content16.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Список литературы",
"characters": 2753,
"tokens": 1126,
"footnotesCount": 0,
"filePath": "Text/content17.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Благодарности",
"characters": 7794,
"tokens": 3141,
"footnotesCount": 0,
"filePath": "Text/content18.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Link2",
"characters": 70,
"tokens": 46,
"footnotesCount": 0,
"filePath": "Text/link2.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Link",
"characters": 4963,
"tokens": 2001,
"footnotesCount": 0,
"filePath": "Text/link.html"
}
]
}

View File

@@ -0,0 +1,843 @@
{
"book": {
"title": "Вдохновленные",
"author": "Марти Каган",
"totalChapters": 104,
"totalCharacters": 493083,
"totalTokens": 201021
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Эту книгу хорошо дополняют:",
"characters": 147,
"tokens": 82,
"footnotesCount": 0,
"filePath": "tb.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "HOW TO CREATE TECH PRODUCTS CUSTOMERS LOVE",
"characters": 20,
"tokens": 38,
"footnotesCount": 0,
"filePath": "t1.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "ВСЕ, ЧТО НУЖНО ЗНАТЬ ПРОДАКТ-МЕНЕДЖЕРУ",
"characters": 35,
"tokens": 43,
"footnotesCount": 0,
"filePath": "t2.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Информация от издательства",
"characters": 1508,
"tokens": 629,
"footnotesCount": 0,
"filePath": "info.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Res",
"characters": 9202,
"tokens": 3696,
"footnotesCount": 0,
"filePath": "res.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Epi",
"characters": 681,
"tokens": 288,
"footnotesCount": 0,
"filePath": "epi.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "ПРЕДИСЛОВИЕ",
"characters": 4350,
"tokens": 1759,
"footnotesCount": 2,
"filePath": "pre.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "УРОКИ ЛУЧШИХ ТЕХНОЛОГИЧЕСКИХ КОМПАНИЙ",
"characters": 0,
"tokens": 29,
"footnotesCount": 0,
"filePath": "ch1.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Ch1 0",
"characters": 5429,
"tokens": 2189,
"footnotesCount": 0,
"filePath": "ch1-0.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "КТО СТОИТ ЗА КАЖДЫМ ОТЛИЧНЫМ ПРОДУКТОМ",
"characters": 2367,
"tokens": 975,
"footnotesCount": 1,
"filePath": "g1.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "ВЫСОКОТЕХНОЛОГИЧНЫЕ ПРОДУКТЫ И СЕРВИСЫ",
"characters": 1535,
"tokens": 643,
"footnotesCount": 0,
"filePath": "g2.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "СТАРТАПЫ: КАК ДОСТИЧЬ СООТВЕТСТВИЯ «ПРОДУКТ — РЫНОК»",
"characters": 2288,
"tokens": 949,
"footnotesCount": 0,
"filePath": "g3.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "КОМПАНИИ НА СТАДИИ РОСТА: УСПЕШНОЕ МАСШТАБИРОВАНИЕ",
"characters": 2092,
"tokens": 870,
"footnotesCount": 0,
"filePath": "g4.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "КОРПОРАЦИИ: НЕПРЕРЫВНЫЕ ПРОДУКТОВЫЕ ИННОВАЦИИ",
"characters": 3080,
"tokens": 1264,
"footnotesCount": 0,
"filePath": "g5.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "ФУНДАМЕНТАЛЬНЫЕ ПРИЧИНЫ НЕУДАЧ В РАБОТЕ НАД ПРОДУКТОМ",
"characters": 13298,
"tokens": 5354,
"footnotesCount": 0,
"filePath": "g6.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "LEAN И AGILE И НЕ ТОЛЬКО",
"characters": 3944,
"tokens": 1600,
"footnotesCount": 0,
"filePath": "g7.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "НЕПРЕРЫВНОЕ ИССЛЕДОВАНИЕ И ВЫВЕДЕНИЕ ПРОДУКТА НА РЫНОК",
"characters": 9468,
"tokens": 3822,
"footnotesCount": 2,
"filePath": "g8.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "ПРАВИЛЬНЫЕ ЛЮДИ",
"characters": 0,
"tokens": 21,
"footnotesCount": 0,
"filePath": "ch2.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "Ch2 0",
"characters": 578,
"tokens": 250,
"footnotesCount": 0,
"filePath": "ch2-0.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "ПРОДУКТОВЫЕ КОМАНДЫ",
"characters": 293,
"tokens": 142,
"footnotesCount": 0,
"filePath": "ch2-01.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "ПРИНЦИПЫ СИЛЬНЫХ ПРОДУКТОВЫХ КОМАНД",
"characters": 13976,
"tokens": 5618,
"footnotesCount": 2,
"filePath": "g9.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "ДОСКОНАЛЬНОЕ ЗНАНИЕ ПОТРЕБИТЕЛЯ",
"characters": 22156,
"tokens": 8889,
"footnotesCount": 0,
"filePath": "g10.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "КОМПЛЕКСНЫЙ ОПЫТ ВЗАИМОДЕЙСТВИЯ",
"characters": 11519,
"tokens": 4634,
"footnotesCount": 0,
"filePath": "g11.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "ИНЖЕНЕРЫ-ПРОГРАММИСТЫ",
"characters": 6166,
"tokens": 2489,
"footnotesCount": 0,
"filePath": "g12.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "ПРОДУКТОВЫЙ МАРКЕТОЛОГ",
"characters": 4627,
"tokens": 1873,
"footnotesCount": 0,
"filePath": "g13.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "ВСПОМОГАТЕЛЬНЫЕ РОЛИ",
"characters": 4836,
"tokens": 1957,
"footnotesCount": 0,
"filePath": "g14.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "ЗНАКОМЬТЕСЬ: ДЖЕЙН МЭННИНГ ИЗ GOOGLE",
"characters": 3982,
"tokens": 1621,
"footnotesCount": 1,
"filePath": "g15.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "МАСШТАБИРОВАНИЕ: ПЕРСОНАЛ",
"characters": 807,
"tokens": 350,
"footnotesCount": 0,
"filePath": "ch2-02.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "ЛИДЕРСТВО В УПРАВЛЕНИИ ПРОДУКТОМ",
"characters": 6828,
"tokens": 2758,
"footnotesCount": 0,
"filePath": "g16.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "ДИРЕКТОР ПО ПРОДУКТУ",
"characters": 12891,
"tokens": 5179,
"footnotesCount": 0,
"filePath": "g17.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "ДИРЕКТОР ПО ТЕХНОЛОГИЯМ",
"characters": 5581,
"tokens": 2256,
"footnotesCount": 0,
"filePath": "g18.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "ОПЕРАЦИОННЫЙ МЕНЕДЖЕР С ТЕХНИЧЕСКИМИ НАВЫКАМИ",
"characters": 2045,
"tokens": 851,
"footnotesCount": 1,
"filePath": "g19.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "СТРУКТУРИРОВАНИЕ ПРОДУКТОВЫХ КОМАНД",
"characters": 18241,
"tokens": 7325,
"footnotesCount": 1,
"filePath": "g20.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "ЗНАКОМЬТЕСЬ: ЛИА ХИКМАН ИЗ ADOBE",
"characters": 7178,
"tokens": 2898,
"footnotesCount": 0,
"filePath": "g21.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "ПРАВИЛЬНЫЙ ПРОДУКТ",
"characters": 0,
"tokens": 22,
"footnotesCount": 0,
"filePath": "ch3.xhtml"
},
{
"chapterNumber": 36,
"chapterTitle": "Ch3 0",
"characters": 220,
"tokens": 107,
"footnotesCount": 0,
"filePath": "ch3-0.xhtml"
},
{
"chapterNumber": 37,
"chapterTitle": "ДОРОЖНЫЕ КАРТЫ ПРОДУКТА",
"characters": 2777,
"tokens": 1137,
"footnotesCount": 0,
"filePath": "ch3-01.xhtml"
},
{
"chapterNumber": 38,
"chapterTitle": "ПРОБЛЕМЫ ДОРОЖНЫХ КАРТ ПРОДУКТА",
"characters": 4086,
"tokens": 1661,
"footnotesCount": 0,
"filePath": "g22.xhtml"
},
{
"chapterNumber": 39,
"chapterTitle": "АЛЬТЕРНАТИВА ДОРОЖНЫМ КАРТАМ",
"characters": 10593,
"tokens": 4263,
"footnotesCount": 1,
"filePath": "g23.xhtml"
},
{
"chapterNumber": 40,
"chapterTitle": "ВИДЕНИЕ ПРОДУКТА",
"characters": 157,
"tokens": 86,
"footnotesCount": 0,
"filePath": "ch3-02.xhtml"
},
{
"chapterNumber": 41,
"chapterTitle": "ВИДЕНИЕ ПРОДУКТА И СТРАТЕГИЯ ЕГО РАЗВИТИЯ",
"characters": 8604,
"tokens": 3472,
"footnotesCount": 0,
"filePath": "g24.xhtml"
},
{
"chapterNumber": 42,
"chapterTitle": "ПРИНЦИПЫ СОЗДАНИЯ ВИДЕНИЯ ПРОДУКТА",
"characters": 4099,
"tokens": 1667,
"footnotesCount": 1,
"filePath": "g25.xhtml"
},
{
"chapterNumber": 43,
"chapterTitle": "ПРИНЦИПЫ СТРАТЕГИИ РАЗВИТИЯ ПРОДУКТА",
"characters": 2150,
"tokens": 889,
"footnotesCount": 0,
"filePath": "g26.xhtml"
},
{
"chapterNumber": 44,
"chapterTitle": "ПРИНЦИПЫ ПРОДУКТА",
"characters": 1762,
"tokens": 725,
"footnotesCount": 0,
"filePath": "g27.xhtml"
},
{
"chapterNumber": 45,
"chapterTitle": "ЦЕЛИ СОЗДАНИЯ ПРОДУКТА",
"characters": 2616,
"tokens": 1072,
"footnotesCount": 0,
"filePath": "ch3-03.xhtml"
},
{
"chapterNumber": 46,
"chapterTitle": "ГЛАВА 28",
"characters": 3532,
"tokens": 1430,
"footnotesCount": 0,
"filePath": "g28.xhtml"
},
{
"chapterNumber": 47,
"chapterTitle": "ЦЕЛИ ПРОДУКТОВОЙ КОМАНДЫ",
"characters": 5736,
"tokens": 2318,
"footnotesCount": 0,
"filePath": "g29.xhtml"
},
{
"chapterNumber": 48,
"chapterTitle": "МАСШТАБИРОВАНИЕ: ПРОДУКТ",
"characters": 1140,
"tokens": 483,
"footnotesCount": 0,
"filePath": "ch3-04.xhtml"
},
{
"chapterNumber": 49,
"chapterTitle": "ЦЕЛИ СОЗДАНИЯ ПРОДУКТА И МАСШТАБИРОВАНИЕ",
"characters": 4576,
"tokens": 1861,
"footnotesCount": 0,
"filePath": "g30.xhtml"
},
{
"chapterNumber": 50,
"chapterTitle": "ПРОДВИЖЕНИЕ ПРОДУКТА",
"characters": 5145,
"tokens": 2081,
"footnotesCount": 0,
"filePath": "g31.xhtml"
},
{
"chapterNumber": 51,
"chapterTitle": "ЗНАКОМЬТЕСЬ: АЛЕКС ПРЕССЛАНД ИЗ BBC",
"characters": 3534,
"tokens": 1442,
"footnotesCount": 0,
"filePath": "g32.xhtml"
},
{
"chapterNumber": 52,
"chapterTitle": "ПРАВИЛЬНЫЙ ПРОЦЕСС",
"characters": 0,
"tokens": 22,
"footnotesCount": 0,
"filePath": "ch4.xhtml"
},
{
"chapterNumber": 53,
"chapterTitle": "Ch4 0",
"characters": 1217,
"tokens": 505,
"footnotesCount": 0,
"filePath": "ch4-0.xhtml"
},
{
"chapterNumber": 54,
"chapterTitle": "ИССЛЕДОВАНИЕ ПРОДУКТА",
"characters": 6046,
"tokens": 2444,
"footnotesCount": 0,
"filePath": "ch4-01.xhtml"
},
{
"chapterNumber": 55,
"chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ ПРОДУКТА",
"characters": 10219,
"tokens": 4114,
"footnotesCount": 0,
"filePath": "g33.xhtml"
},
{
"chapterNumber": 56,
"chapterTitle": "МЕТОДИКИ ИССЛЕДОВАНИЯ ПРОДУКТА: ОБЗОР",
"characters": 5362,
"tokens": 2173,
"footnotesCount": 0,
"filePath": "g34.xhtml"
},
{
"chapterNumber": 57,
"chapterTitle": "МЕТОДИКИ ДЛЯ ФОРМУЛИРОВАНИЯ ЗАДАЧ",
"characters": 6111,
"tokens": 2475,
"footnotesCount": 0,
"filePath": "ch4-02.xhtml"
},
{
"chapterNumber": 58,
"chapterTitle": "МЕТОДИКИ ДЛЯ ОЦЕНКИ ВОЗМОЖНОСТЕЙ",
"characters": 3281,
"tokens": 1339,
"footnotesCount": 0,
"filePath": "g35.xhtml"
},
{
"chapterNumber": 59,
"chapterTitle": "МЕТОДИКА «ПИСЬМО КЛИЕНТА»",
"characters": 4894,
"tokens": 1982,
"footnotesCount": 0,
"filePath": "g36.xhtml"
},
{
"chapterNumber": 60,
"chapterTitle": "МЕТОДИКА «КОНЦЕПЦИЯ СТАРТАПА»",
"characters": 7759,
"tokens": 3129,
"footnotesCount": 0,
"filePath": "g37.xhtml"
},
{
"chapterNumber": 61,
"chapterTitle": "МЕТОДИКИ ПЛАНИРОВАНИЯ",
"characters": 1009,
"tokens": 429,
"footnotesCount": 0,
"filePath": "ch4-03.xhtml"
},
{
"chapterNumber": 62,
"chapterTitle": "«КАРТА ИСТОРИИ»",
"characters": 3221,
"tokens": 1309,
"footnotesCount": 1,
"filePath": "g38.xhtml"
},
{
"chapterNumber": 63,
"chapterTitle": "ПРОГРАММА ПО ИССЛЕДОВАНИЮ ПОТРЕБИТЕЛЕЙ",
"characters": 20618,
"tokens": 8277,
"footnotesCount": 0,
"filePath": "g39.xhtml"
},
{
"chapterNumber": 64,
"chapterTitle": "ЗНАКОМЬТЕСЬ: МАРТИНА ЛАУЧЕНГКО ИЗ MICROSOFT",
"characters": 5241,
"tokens": 2128,
"footnotesCount": 0,
"filePath": "g40.xhtml"
},
{
"chapterNumber": 65,
"chapterTitle": "МЕТОДИКИ ДЛЯ ПОИСКА ИДЕЙ",
"characters": 1650,
"tokens": 687,
"footnotesCount": 0,
"filePath": "ch4-04.xhtml"
},
{
"chapterNumber": 66,
"chapterTitle": "ИНТЕРВЬЮ С ПОЛЬЗОВАТЕЛЕМ",
"characters": 4885,
"tokens": 1978,
"footnotesCount": 0,
"filePath": "g41.xhtml"
},
{
"chapterNumber": 67,
"chapterTitle": "КОНСЬЕРЖ-ТЕСТ",
"characters": 1802,
"tokens": 740,
"footnotesCount": 0,
"filePath": "g42.xhtml"
},
{
"chapterNumber": 68,
"chapterTitle": "СИЛА «НЕПРАВИЛЬНОГО» ПОВЕДЕНИЯ ПОТРЕБИТЕЛЯ",
"characters": 4440,
"tokens": 1807,
"footnotesCount": 0,
"filePath": "g43.xhtml"
},
{
"chapterNumber": 69,
"chapterTitle": "ГЛАВА 44",
"characters": 1795,
"tokens": 736,
"footnotesCount": 1,
"filePath": "g44.xhtml"
},
{
"chapterNumber": 70,
"chapterTitle": "МЕТОДИКИ ДЛЯ ПРОТОТИПИРОВАНИЯ",
"characters": 4042,
"tokens": 1645,
"footnotesCount": 0,
"filePath": "ch4-05.xhtml"
},
{
"chapterNumber": 71,
"chapterTitle": "ГЛАВА 45",
"characters": 2348,
"tokens": 957,
"footnotesCount": 0,
"filePath": "g45.xhtml"
},
{
"chapterNumber": 72,
"chapterTitle": "ПРОТОТИПЫ ДЛЯ ТЕСТИРОВАНИЯ РЕАЛИЗУЕМОСТИ",
"characters": 3612,
"tokens": 1475,
"footnotesCount": 0,
"filePath": "g46.xhtml"
},
{
"chapterNumber": 73,
"chapterTitle": "ПОЛЬЗОВАТЕЛЬСКИЕ ПРОТОТИПЫ",
"characters": 3587,
"tokens": 1459,
"footnotesCount": 0,
"filePath": "g47.xhtml"
},
{
"chapterNumber": 74,
"chapterTitle": "ПРОТОТИПЫ НА РЕАЛЬНЫХ ДАННЫХ",
"characters": 3491,
"tokens": 1422,
"footnotesCount": 0,
"filePath": "g48.xhtml"
},
{
"chapterNumber": 75,
"chapterTitle": "СМЕШАННЫЕ ПРОТОТИПЫ",
"characters": 2837,
"tokens": 1156,
"footnotesCount": 0,
"filePath": "g49.xhtml"
},
{
"chapterNumber": 76,
"chapterTitle": "МЕТОДИКИ ДЛЯ ТЕСТИРОВАНИЯ НА ЭТАПЕ ИССЛЕДОВАНИЯ ПРОДУКТА",
"characters": 2420,
"tokens": 1008,
"footnotesCount": 0,
"filePath": "ch4-06.xhtml"
},
{
"chapterNumber": 77,
"chapterTitle": "КАК ПОДОБРАТЬ ПОЛЬЗОВАТЕЛЕЙ ДЛЯ УЧАСТИЯ В ТЕСТИРОВАНИИ",
"characters": 14989,
"tokens": 6031,
"footnotesCount": 0,
"filePath": "g50.xhtml"
},
{
"chapterNumber": 78,
"chapterTitle": "КАЧЕСТВЕННОЕ ТЕСТИРОВАНИЕ ЦЕННОСТИ",
"characters": 2751,
"tokens": 1128,
"footnotesCount": 0,
"filePath": "g51.xhtml"
},
{
"chapterNumber": 79,
"chapterTitle": "МЕТОДИКИ ТЕСТИРОВАНИЯ СПРОСА",
"characters": 10509,
"tokens": 4229,
"footnotesCount": 0,
"filePath": "g52.xhtml"
},
{
"chapterNumber": 80,
"chapterTitle": "КАЧЕСТВЕННЫЕ МЕТОДИКИ ТЕСТИРОВАНИЯ ЦЕННОСТИ",
"characters": 7978,
"tokens": 3223,
"footnotesCount": 0,
"filePath": "g53.xhtml"
},
{
"chapterNumber": 81,
"chapterTitle": "КОЛИЧЕСТВЕННЫЕ МЕТОДИКИ ТЕСТИРОВАНИЯ ЦЕННОСТИ",
"characters": 16188,
"tokens": 6508,
"footnotesCount": 0,
"filePath": "g54.xhtml"
},
{
"chapterNumber": 82,
"chapterTitle": "ТЕСТИРОВАНИЕ РЕАЛИЗУЕМОСТИ",
"characters": 5955,
"tokens": 2407,
"footnotesCount": 0,
"filePath": "g55.xhtml"
},
{
"chapterNumber": 83,
"chapterTitle": "ТЕСТИРОВАНИЕ БИЗНЕС-ЖИЗНЕСПОСОБНОСТИ",
"characters": 10480,
"tokens": 4221,
"footnotesCount": 0,
"filePath": "g56.xhtml"
},
{
"chapterNumber": 84,
"chapterTitle": "ЗНАКОМЬТЕСЬ: КЕЙТ АРНОЛЬД ИЗ NETFLIX",
"characters": 4855,
"tokens": 1971,
"footnotesCount": 0,
"filePath": "g57.xhtml"
},
{
"chapterNumber": 85,
"chapterTitle": "МЕТОДИКИ ДЛЯ ПРЕОБРАЗОВАНИЙ",
"characters": 937,
"tokens": 402,
"footnotesCount": 0,
"filePath": "ch4-07.xhtml"
},
{
"chapterNumber": 86,
"chapterTitle": "СПРИНТ НА ЭТАПЕ ИССЛЕДОВАНИЯ ПРОДУКТА",
"characters": 7790,
"tokens": 3145,
"footnotesCount": 1,
"filePath": "g58.xhtml"
},
{
"chapterNumber": 87,
"chapterTitle": "ПИЛОТНЫЕ КОМАНДЫ",
"characters": 2454,
"tokens": 1002,
"footnotesCount": 0,
"filePath": "g59.xhtml"
},
{
"chapterNumber": 88,
"chapterTitle": "ОТКАЗ ОТ ДОРОЖНЫХ КАРТ",
"characters": 2357,
"tokens": 965,
"footnotesCount": 0,
"filePath": "g60.xhtml"
},
{
"chapterNumber": 89,
"chapterTitle": "МАСШТАБИРОВАНИЕ: ПРОЦЕСС",
"characters": 1875,
"tokens": 777,
"footnotesCount": 0,
"filePath": "ch4-08.xhtml"
},
{
"chapterNumber": 90,
"chapterTitle": "КТО ТАКИЕ ЗАИНТЕРЕСОВАННЫЕ СТОРОНЫ",
"characters": 14251,
"tokens": 5728,
"footnotesCount": 1,
"filePath": "g61.xhtml"
},
{
"chapterNumber": 91,
"chapterTitle": "РАСПРОСТРАНЕНИЕ НОВЫХ ЗНАНИЙ О ПРОДУКТЕ",
"characters": 2559,
"tokens": 1053,
"footnotesCount": 0,
"filePath": "g62.xhtml"
},
{
"chapterNumber": 92,
"chapterTitle": "ЗНАКОМЬТЕСЬ: КАМИЛЛА ХЕРСТ ИЗ APPLE",
"characters": 3673,
"tokens": 1498,
"footnotesCount": 1,
"filePath": "g63.xhtml"
},
{
"chapterNumber": 93,
"chapterTitle": "ЧАСТЬ V",
"characters": 0,
"tokens": 17,
"footnotesCount": 0,
"filePath": "ch5.xhtml"
},
{
"chapterNumber": 94,
"chapterTitle": "Ch5 0",
"characters": 696,
"tokens": 297,
"footnotesCount": 0,
"filePath": "ch5-0.xhtml"
},
{
"chapterNumber": 95,
"chapterTitle": "ХОРОШАЯ ИЛИ ПЛОХАЯ ПРОДУКТОВАЯ КОМАНДА",
"characters": 6159,
"tokens": 2493,
"footnotesCount": 0,
"filePath": "g64.xhtml"
},
{
"chapterNumber": 96,
"chapterTitle": "ПРИЧИНЫ ПРОБЛЕМ С ИННОВАЦИЯМИ",
"characters": 4923,
"tokens": 1995,
"footnotesCount": 0,
"filePath": "g65.xhtml"
},
{
"chapterNumber": 97,
"chapterTitle": "ПРИЧИНЫ ПРОБЛЕМ С ТЕМПАМИ РАЗРАБОТКИ",
"characters": 3592,
"tokens": 1465,
"footnotesCount": 0,
"filePath": "g66.xhtml"
},
{
"chapterNumber": 98,
"chapterTitle": "СОЗДАНИЕ СИЛЬНОЙ ПРОДУКТОВОЙ КУЛЬТУРЫ",
"characters": 5137,
"tokens": 2083,
"footnotesCount": 0,
"filePath": "g67.xhtml"
},
{
"chapterNumber": 99,
"chapterTitle": "БЛАГОДАРНОСТИ",
"characters": 2863,
"tokens": 1164,
"footnotesCount": 0,
"filePath": "th.xhtml"
},
{
"chapterNumber": 100,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 1885,
"tokens": 774,
"footnotesCount": 0,
"filePath": "about.xhtml"
},
{
"chapterNumber": 101,
"chapterTitle": "УЗНАЙТЕ БОЛЬШЕ",
"characters": 1099,
"tokens": 460,
"footnotesCount": 0,
"filePath": "more.xhtml"
},
{
"chapterNumber": 102,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 2813,
"tokens": 2266,
"footnotesCount": 34,
"filePath": "links.xhtml"
},
{
"chapterNumber": 103,
"chapterTitle": "МИФ Бизнес",
"characters": 161,
"tokens": 87,
"footnotesCount": 0,
"filePath": "business.html"
},
{
"chapterNumber": 104,
"chapterTitle": "НАД КНИГОЙ РАБОТАЛИ",
"characters": 392,
"tokens": 179,
"footnotesCount": 0,
"filePath": "end.xhtml"
}
]
}

View File

@@ -0,0 +1,291 @@
{
"book": {
"title": "Великие по собственному выбору",
"author": "Джим Коллинз & Мортен Хансен",
"totalChapters": 35,
"totalCharacters": 557715,
"totalTokens": 227225
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Информация от издательства",
"characters": 1175,
"tokens": 498,
"footnotesCount": 0,
"filePath": "Text/info.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "Epi",
"characters": 175,
"tokens": 88,
"footnotesCount": 0,
"filePath": "Text/epi.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Величие посреди хаоса",
"characters": 20370,
"tokens": 8180,
"footnotesCount": 7,
"filePath": "Text/gl1.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Вы Амундсен или Скотт?",
"characters": 50407,
"tokens": 20200,
"footnotesCount": 13,
"filePath": "Text/gl2.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Двадцатимильный марш",
"characters": 0,
"tokens": 25,
"footnotesCount": 0,
"filePath": "Text/gl3.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Двадцатимильный марш Джона Брауна",
"characters": 49679,
"tokens": 19903,
"footnotesCount": 1,
"filePath": "Text/gl3-1.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "Сначала пули, ядра потом",
"characters": 0,
"tokens": 26,
"footnotesCount": 0,
"filePath": "Text/gl4.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Сюрприз, большой сюрприз",
"characters": 55550,
"tokens": 22249,
"footnotesCount": 2,
"filePath": "Text/gl4-1.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Лидерство над линией смерти",
"characters": 0,
"tokens": 27,
"footnotesCount": 0,
"filePath": "Text/gl5.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Не все моменты в жизни равноценны",
"characters": 45592,
"tokens": 18276,
"footnotesCount": 8,
"filePath": "Text/gl5-1.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "Глава 6",
"characters": 0,
"tokens": 19,
"footnotesCount": 0,
"filePath": "Text/gl6.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "С фанатичной дисциплиной придерживаться рецепта СМаК",
"characters": 45866,
"tokens": 18385,
"footnotesCount": 0,
"filePath": "Text/gl6-1.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "Удача или опыт?",
"characters": 60149,
"tokens": 24091,
"footnotesCount": 2,
"filePath": "Text/gl7.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "ЭПИЛОГ",
"characters": 4114,
"tokens": 1667,
"footnotesCount": 0,
"filePath": "Text/epilog.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "Часто задаваемые вопросы",
"characters": 24967,
"tokens": 10014,
"footnotesCount": 2,
"filePath": "Text/faq.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ",
"characters": 0,
"tokens": 28,
"footnotesCount": 0,
"filePath": "Text/princip.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "Методология",
"characters": 20109,
"tokens": 8073,
"footnotesCount": 2,
"filePath": "Text/methodology.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "Отбор компаний в группу 10×",
"characters": 7163,
"tokens": 2894,
"footnotesCount": 0,
"filePath": "Text/otbor.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "Отбор компаний для сравнения",
"characters": 5200,
"tokens": 2111,
"footnotesCount": 0,
"filePath": "Text/otbor2.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "Двадцатимильный марш",
"characters": 3175,
"tokens": 1299,
"footnotesCount": 0,
"filePath": "Text/20miles.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "Анализ инноваций",
"characters": 5059,
"tokens": 2053,
"footnotesCount": 0,
"filePath": "Text/analyse_inn.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "Сначала пули, ядра потом",
"characters": 4138,
"tokens": 1683,
"footnotesCount": 1,
"filePath": "Text/puli.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "Анализ рисков по ликвидности и балансу",
"characters": 3369,
"tokens": 1390,
"footnotesCount": 4,
"filePath": "Text/analyse_risk.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "Анализ категорий риска",
"characters": 4389,
"tokens": 1790,
"footnotesCount": 3,
"filePath": "Text/analyse_cat.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "Анализ скорости",
"characters": 6479,
"tokens": 2629,
"footnotesCount": 7,
"filePath": "Text/analyse-speed.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "Анализ рецепта СМаК",
"characters": 2841,
"tokens": 1169,
"footnotesCount": 2,
"filePath": "Text/analyse-smak.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "Анализ удачи",
"characters": 8063,
"tokens": 3259,
"footnotesCount": 5,
"filePath": "Text/analyse-lucky.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "Анализ Зала Славы хоккея",
"characters": 1859,
"tokens": 770,
"footnotesCount": 1,
"filePath": "Text/zal.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 101705,
"tokens": 40705,
"footnotesCount": 0,
"filePath": "Text/notes.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "БЛАГОДАРНОСТИ",
"characters": 7161,
"tokens": 2889,
"footnotesCount": 0,
"filePath": "Text/thanks.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 568,
"tokens": 250,
"footnotesCount": 0,
"filePath": "Text/author.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Links",
"characters": 7488,
"tokens": 6136,
"footnotesCount": 118,
"filePath": "Text/links.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "Над книгой работали",
"characters": 302,
"tokens": 144,
"footnotesCount": 0,
"filePath": "Text/end.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "Books",
"characters": 10270,
"tokens": 4129,
"footnotesCount": 0,
"filePath": "Text/books.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "Максимально полезные книги от издательства «Манн, Иванов и Фербер»",
"characters": 333,
"tokens": 176,
"footnotesCount": 0,
"filePath": "Text/max.xhtml"
}
]
}

View File

@@ -0,0 +1,155 @@
{
"book": {
"title": "Всё о бизнесе за два часа: Секреты юристов и бухгалтеров",
"author": "Елена Ёлгина, Елена Смолякова, Александр Мельников",
"totalChapters": 18,
"totalCharacters": 363207,
"totalTokens": 145842
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Content01",
"characters": 0,
"tokens": 24,
"footnotesCount": 0,
"filePath": "Text/content01.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Dsc",
"characters": 897,
"tokens": 375,
"footnotesCount": 0,
"filePath": "Text/dsc.html"
},
{
"chapterNumber": 3,
"chapterTitle": "ИСПОЛЬЗОВАННЫЕ СОКРАЩЕНИЯ",
"characters": 1316,
"tokens": 557,
"footnotesCount": 0,
"filePath": "Text/content03.html"
},
{
"chapterNumber": 4,
"chapterTitle": "ВВЕДЕНИЕ",
"characters": 2559,
"tokens": 1047,
"footnotesCount": 0,
"filePath": "Text/content04.html"
},
{
"chapterNumber": 5,
"chapterTitle": "1. ИП или юридическое лицо? АО или ООО?",
"characters": 63381,
"tokens": 25387,
"footnotesCount": 0,
"filePath": "Text/content1.html"
},
{
"chapterNumber": 6,
"chapterTitle": "УПРОЩЕННАЯ СИСТЕМА НАЛОГООБЛОЖЕНИЯ (УСН)",
"characters": 39504,
"tokens": 15837,
"footnotesCount": 0,
"filePath": "Text/content2.html"
},
{
"chapterNumber": 7,
"chapterTitle": "ОБЩАЯ СИСТЕМА НАЛОГООБЛОЖЕНИЯ (ОСН)",
"characters": 66926,
"tokens": 26804,
"footnotesCount": 0,
"filePath": "Text/content3.html"
},
{
"chapterNumber": 8,
"chapterTitle": "СТРАХОВЫЕ ВЗНОСЫ И НДФЛ: «ЗАРПЛАТНЫЕ НАЛОГИ»",
"characters": 26378,
"tokens": 10588,
"footnotesCount": 0,
"filePath": "Text/content4.html"
},
{
"chapterNumber": 9,
"chapterTitle": "КАК ВЛИТЬ ДЕНЬГИ В БИЗНЕС?",
"characters": 7863,
"tokens": 3175,
"footnotesCount": 0,
"filePath": "Text/content5.html"
},
{
"chapterNumber": 10,
"chapterTitle": "ДОХОДЫ ОТ БИЗНЕСА: КАК ИХ ПОЛУЧИТЬ В СВОЙ КАРМАН?",
"characters": 12079,
"tokens": 4870,
"footnotesCount": 0,
"filePath": "Text/content6.html"
},
{
"chapterNumber": 11,
"chapterTitle": "3.1. Какие выгоды франшиза дает собственнику?",
"characters": 19093,
"tokens": 7675,
"footnotesCount": 0,
"filePath": "Text/content7.html"
},
{
"chapterNumber": 12,
"chapterTitle": "1. Зачем нужен бухгалтерский учет?",
"characters": 18384,
"tokens": 7386,
"footnotesCount": 0,
"filePath": "Text/content8.html"
},
{
"chapterNumber": 13,
"chapterTitle": "3. Кассового аппарата нет, а касса есть?",
"characters": 21867,
"tokens": 8782,
"footnotesCount": 0,
"filePath": "Text/content9.html"
},
{
"chapterNumber": 14,
"chapterTitle": "2. Как выплачивать зарплату?",
"characters": 22452,
"tokens": 9012,
"footnotesCount": 0,
"filePath": "Text/content10.html"
},
{
"chapterNumber": 15,
"chapterTitle": "БИЗНЕС-КЕЙС. НЕКОТОРЫЕ ПОДРОБНОСТИ И РАЗЪЯСНЕНИЯ",
"characters": 48842,
"tokens": 19576,
"footnotesCount": 0,
"filePath": "Text/content11.html"
},
{
"chapterNumber": 16,
"chapterTitle": "ЗАКЛЮЧЕНИЕ",
"characters": 3013,
"tokens": 1230,
"footnotesCount": 0,
"filePath": "Text/content05.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Список нормативных документов",
"characters": 8163,
"tokens": 3297,
"footnotesCount": 0,
"filePath": "Text/content06.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Content02",
"characters": 490,
"tokens": 220,
"footnotesCount": 0,
"filePath": "Text/content02.html"
}
]
}

View File

@@ -0,0 +1,347 @@
{
"book": {
"title": "Гроуинг 1.0. 22 маркетинговых действия для роста бизнеса",
"author": "ИГОРЬ МАНН",
"totalChapters": 42,
"totalCharacters": 119573,
"totalTokens": 49104
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Гроуинг Епаб",
"characters": 897,
"tokens": 385,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "Гроуинг Епаб 1",
"characters": 926,
"tokens": 399,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-1.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Гроуинг Епаб 2",
"characters": 5116,
"tokens": 2118,
"footnotesCount": 2,
"filePath": роуинг_-_ЕПАБ-2.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Гроуинг Епаб 3",
"characters": 10562,
"tokens": 4253,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-3.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Гроуинг Епаб 4",
"characters": 1378,
"tokens": 580,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-4.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Гроуинг Епаб 5",
"characters": 4134,
"tokens": 1682,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-5.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "Гроуинг Епаб 6",
"characters": 4207,
"tokens": 1711,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-6.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Гроуинг Епаб 7",
"characters": 28,
"tokens": 40,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-7.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Гроуинг Епаб 8",
"characters": 1267,
"tokens": 535,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-8.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Гроуинг Епаб 9",
"characters": 6558,
"tokens": 2653,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-9.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "Гроуинг Епаб 10",
"characters": 4569,
"tokens": 1857,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-10.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "Гроуинг Епаб 11",
"characters": 818,
"tokens": 357,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-11.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "Гроуинг Епаб 12",
"characters": 1764,
"tokens": 735,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-12.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "Гроуинг Епаб 13",
"characters": 2986,
"tokens": 1224,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-13.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "Гроуинг Епаб 14",
"characters": 558,
"tokens": 253,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-14.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "Гроуинг Епаб 15",
"characters": 1400,
"tokens": 590,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-15.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "Гроуинг Епаб 16",
"characters": 4366,
"tokens": 1776,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-16.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "Гроуинг Епаб 17",
"characters": 3167,
"tokens": 1296,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-17.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "Гроуинг Епаб 18",
"characters": 11225,
"tokens": 4520,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-18.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "Гроуинг Епаб 19",
"characters": 1338,
"tokens": 565,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-19.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "Гроуинг Епаб 20",
"characters": 1682,
"tokens": 702,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-20.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "Гроуинг Епаб 21",
"characters": 2305,
"tokens": 952,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-21.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "Гроуинг Епаб 22",
"characters": 548,
"tokens": 249,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-22.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "Гроуинг Епаб 23",
"characters": 1514,
"tokens": 635,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-23.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "Гроуинг Епаб 24",
"characters": 4573,
"tokens": 1859,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-24.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "Гроуинг Епаб 25",
"characters": 946,
"tokens": 408,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-25.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "Гроуинг Епаб 26",
"characters": 2235,
"tokens": 924,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-26.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "Гроуинг Епаб 27",
"characters": 3300,
"tokens": 1350,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-27.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "Гроуинг Епаб 28",
"characters": 692,
"tokens": 306,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-28.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "Гроуинг Епаб 29",
"characters": 7153,
"tokens": 2891,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-29.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "Гроуинг Епаб 30",
"characters": 2829,
"tokens": 1161,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-30.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Гроуинг Епаб 31",
"characters": 2857,
"tokens": 1172,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-31.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "Гроуинг Епаб 32",
"characters": 4493,
"tokens": 1827,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-32.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "Гроуинг Епаб 33",
"characters": 2801,
"tokens": 1150,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-33.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "Гроуинг Епаб 34",
"characters": 1880,
"tokens": 782,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-34.xhtml"
},
{
"chapterNumber": 36,
"chapterTitle": "Гроуинг Епаб 35",
"characters": 2314,
"tokens": 955,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-35.xhtml"
},
{
"chapterNumber": 37,
"chapterTitle": "Гроуинг Епаб 36",
"characters": 1344,
"tokens": 567,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-36.xhtml"
},
{
"chapterNumber": 38,
"chapterTitle": "Гроуинг Епаб 37",
"characters": 1831,
"tokens": 762,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-37.xhtml"
},
{
"chapterNumber": 39,
"chapterTitle": "Гроуинг Епаб 38",
"characters": 3615,
"tokens": 1476,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-38.xhtml"
},
{
"chapterNumber": 40,
"chapterTitle": "Гроуинг Епаб 39",
"characters": 2344,
"tokens": 967,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-39.xhtml"
},
{
"chapterNumber": 41,
"chapterTitle": "Гроуинг Епаб 40",
"characters": 801,
"tokens": 350,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-40.xhtml"
},
{
"chapterNumber": 42,
"chapterTitle": "Гроуинг Епаб 41",
"characters": 252,
"tokens": 130,
"footnotesCount": 0,
"filePath": роуинг_-_ЕПАБ-41.xhtml"
}
]
}

View File

@@ -0,0 +1,243 @@
{
"book": {
"title": "Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть",
"author": "Т. Харс Экер",
"totalChapters": 29,
"totalCharacters": 309740,
"totalTokens": 124976
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Т. Харв Экер Думай как миллионер. 17 уроков состоятельности для тех, кто готов разбогатеть",
"characters": 16252,
"tokens": 6552,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Почему финансовая программа столь важна?",
"characters": 8822,
"tokens": 3560,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Что такое финансовая программа и как она формируется?",
"characters": 6775,
"tokens": 2747,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Воздействие первое: вербальное программирование",
"characters": 7645,
"tokens": 3092,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Шаг к переменам: вербальное программирование",
"characters": 15152,
"tokens": 6093,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Воздействие третье: личный опыт",
"characters": 7012,
"tokens": 2832,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "На что же ориентирована ваша финансовая программа?",
"characters": 15708,
"tokens": 6319,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Семнадцать различий в мышлении и поступках богатых, бедных и представителей среднего класса",
"characters": 8056,
"tokens": 3274,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Первый признак жертвы: обвинения",
"characters": 6086,
"tokens": 2462,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Третий признак жертвы: жалобы",
"characters": 6040,
"tokens": 2443,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 5189,
"tokens": 2104,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Урок состоятельности № 3 Богатые становятся богатыми. Бедные хотят стать богатыми",
"characters": 11054,
"tokens": 4470,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Урок состоятельности № 4 Богатые мыслят глобально. Бедные мыслят мелко",
"characters": 8961,
"tokens": 3629,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Урок состоятельности № 5 Богатые рассматривают возможности. Бедные зациклены на препятствиях",
"characters": 12701,
"tokens": 5133,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 16013,
"tokens": 6434,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 11257,
"tokens": 4531,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 7211,
"tokens": 2913,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Урок состоятельности № 9 Богатые люди выше своих проблем. Бедные преувеличивают свои проблемы",
"characters": 7232,
"tokens": 2946,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Урок состоятельности № 10 Богатые умеют принимать подарки судьбы. Бедные не умеют",
"characters": 18680,
"tokens": 7521,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 12612,
"tokens": 5073,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 7933,
"tokens": 3202,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Можно не только купить пирожное, но и съесть его!",
"characters": 5607,
"tokens": 2278,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Урок состоятельности № 13 Богатых заботит собственный капитал. Бедных заботит сумма оклада",
"characters": 11487,
"tokens": 4647,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 15892,
"tokens": 6385,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Урок состоятельности № 15 На богатых работают их деньги. Бедные работают ради денег",
"characters": 21640,
"tokens": 8706,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Урок состоятельности № 16 Богатые действуют без опаски. Бедных останавливает страх",
"characters": 17571,
"tokens": 7077,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Практикум начинающего миллионера",
"characters": 16118,
"tokens": 6476,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Вместо заключения «Что же мне, черт возьми, теперь делать?»",
"characters": 4916,
"tokens": 2006,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Примечания",
"characters": 118,
"tokens": 71,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,283 @@
{
"book": {
"title": "Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах",
"author": "Антон Терехов",
"totalChapters": 34,
"totalCharacters": 394362,
"totalTokens": 159061
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Антон Терехов Истина в цене. Все о практическом ценообразовании, прибыли, выручке и клиентах",
"characters": 8303,
"tokens": 3373,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Глава 1.1. Какова ваша цель прибыль, доход или количество клиентов?",
"characters": 8197,
"tokens": 3321,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Глава 1.2. Психологический коридор цен. Несколько вопросов себе самому, своим клиентам и сотрудникам",
"characters": 7160,
"tokens": 2920,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Глава 1.3. Рассчитываем целевую цену",
"characters": 16826,
"tokens": 6760,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Глава 1.4. Единица измерения основа ценообразования",
"characters": 14131,
"tokens": 5689,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Глава 1.5. Ментальная бухгалтерия",
"characters": 16163,
"tokens": 6494,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Глава 1.6. Премиальные и люксовые цены. Почему кажется, что высокая цена гарантирует высокое качество",
"characters": 14654,
"tokens": 5917,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Глава 1.7. Низкие и сверхнизкие цены. Применять с аккуратностью",
"characters": 20924,
"tokens": 8410,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Глава 1.8. Постоянные и переменные издержки, юнит-экономика и убийственная скидка",
"characters": 15350,
"tokens": 6188,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Глава 1.9. Унылый отель и неценовая зависимость спроса",
"characters": 10291,
"tokens": 4153,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Глава 1.10. Лучше бы ты бежал за такси",
"characters": 11091,
"tokens": 4468,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Глава 1.11. Почему не надо торговать на маркетплейсах",
"characters": 7088,
"tokens": 2873,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Глава 2.1. Основная задача скидок и фиктивный прайс-лист",
"characters": 10006,
"tokens": 4041,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Глава 2.2. Ценовые якоря и эффект золотой середины",
"characters": 10279,
"tokens": 4148,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Глава 2.3. Польза и потеря. Почему балльные программы лояльности лучше, чем дисконтные. Почему картой платить невыгодно Польза и потеря…",
"characters": 14909,
"tokens": 6034,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Глава 2.4. Как увеличить прибыль с помощью бандлирования",
"characters": 11483,
"tokens": 4632,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Глава 2.5. Составные продукты и кросс-сейл",
"characters": 13377,
"tokens": 5383,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Глава 2.6. Добро пожаловать в мышеловку! Ассортимент бесплатных сыров",
"characters": 9727,
"tokens": 3934,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Глава 2.7. Динамическое ценообразование. Продаем квотами",
"characters": 18235,
"tokens": 7333,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Заметка 1. Все, что вокруг цены",
"characters": 13882,
"tokens": 5581,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Часть 3 Цены и клиенты. Ценовая дискриминация",
"characters": 10807,
"tokens": 4357,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Глава 3.2. Три типа ценовой дискриминации и их инструменты",
"characters": 7873,
"tokens": 3189,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Глава 3.3. Юридические вопросы ценовой дискриминации",
"characters": 11769,
"tokens": 4744,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Глава 3.5. Клиенты сами сортируют себя по платежеспособности",
"characters": 11713,
"tokens": 4726,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Глава 3.7. Почему не надо отбирать скидки у хороших клиентов",
"characters": 9938,
"tokens": 4016,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Часть 4 Ценообразование в модели подписки",
"characters": 7979,
"tokens": 3224,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Глава 4.2. Понятие тарифа. Распутываем запутанное",
"characters": 5616,
"tokens": 2282,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Глава 4.3. Экономика подписки",
"characters": 9474,
"tokens": 3817,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Глава 4.4. Самая короткая глава о том, как продавать подписку",
"characters": 7061,
"tokens": 2865,
"footnotesCount": 0,
"filePath": "content28.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Глава 4.6. Постоянные и переменные издержки, квоты и успех модели подписки",
"characters": 9039,
"tokens": 3661,
"footnotesCount": 0,
"filePath": "content29.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Глава 4.7. Принципы ценообразования в экосистемах",
"characters": 10546,
"tokens": 4254,
"footnotesCount": 0,
"filePath": "content30.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Приложение. Особенности ценообразования в сфере технологичных B2B-услуг",
"characters": 37711,
"tokens": 15129,
"footnotesCount": 0,
"filePath": "content31.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Об авторе",
"characters": 804,
"tokens": 341,
"footnotesCount": 0,
"filePath": "content32.html"
},
{
"chapterNumber": 34,
"chapterTitle": "Сноски",
"characters": 1956,
"tokens": 804,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,259 @@
{
"book": {
"title": "История настоящего предпринимателя",
"author": "Александр Долгов",
"totalChapters": 31,
"totalCharacters": 445204,
"totalTokens": 178922
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "История настоящего предпринимателя Александр Долгов",
"characters": 23574,
"tokens": 9465,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 35308,
"tokens": 14152,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 21186,
"tokens": 8503,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Сильный оффер",
"characters": 9776,
"tokens": 3931,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Как проводить собеседования",
"characters": 7568,
"tokens": 3053,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 30537,
"tokens": 12243,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 26791,
"tokens": 10745,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 26492,
"tokens": 10625,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 15170,
"tokens": 6097,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Перелом",
"characters": 9864,
"tokens": 3963,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 27570,
"tokens": 11058,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Глава 9. Франчайзинг новый MBA",
"characters": 15118,
"tokens": 6076,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 9696,
"tokens": 3908,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Сделка",
"characters": 9949,
"tokens": 3998,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Глава 11. Семейный бизнес",
"characters": 13077,
"tokens": 5257,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Глава 12. Правило «трех ногтей»",
"characters": 13401,
"tokens": 5389,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 5387,
"tokens": 2184,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Глава 13. Налоги",
"characters": 8709,
"tokens": 3506,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Налогообложение для самых маленьких",
"characters": 9774,
"tokens": 3940,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Прибыль Налоги НДФЛ Прибыль",
"characters": 5451,
"tokens": 2207,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 19927,
"tokens": 8000,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 26057,
"tokens": 10452,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Правила настоящего предпринимателя, который хочет что-либо производить в России",
"characters": 8225,
"tokens": 3338,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Маркетплейсы",
"characters": 6727,
"tokens": 2711,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Социальные сети",
"characters": 6452,
"tokens": 2603,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Контентный маркетинг",
"characters": 7068,
"tokens": 2852,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Кейсы",
"characters": 5569,
"tokens": 2246,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 9417,
"tokens": 3796,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Осознанные инвестиции",
"characters": 7937,
"tokens": 3199,
"footnotesCount": 0,
"filePath": "content28.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Репутация и инвестиции",
"characters": 8598,
"tokens": 3464,
"footnotesCount": 0,
"filePath": "content29.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Правила настоящего предпринимателя",
"characters": 14829,
"tokens": 5961,
"footnotesCount": 0,
"filePath": "content30.html"
}
]
}

View File

@@ -0,0 +1,195 @@
{
"book": {
"title": "На уровень выше. 25 правил вежливых и успешных людей",
"author": "Ольга Владимировна Шевелева",
"totalChapters": 23,
"totalCharacters": 254019,
"totalTokens": 102181
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Ольга Шевелева На уровень выше. 25 правил вежливых и успешных людей",
"characters": 7964,
"tokens": 3227,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Приветствие и прощание",
"characters": 5979,
"tokens": 2415,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Представление",
"characters": 7098,
"tokens": 2860,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Формы обращения",
"characters": 8382,
"tokens": 3374,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Рукопожатие",
"characters": 6943,
"tokens": 2797,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Визитные карточки",
"characters": 11178,
"tokens": 4493,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Поведение у двери, в лифте, на лестнице, при рассадке в автомобиле",
"characters": 5621,
"tokens": 2290,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Общение по телефону",
"characters": 15738,
"tokens": 6318,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Время ответа на деловые письма",
"characters": 10915,
"tokens": 4394,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Благодарность",
"characters": 32757,
"tokens": 13123,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Аксессуары",
"characters": 24684,
"tokens": 9894,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Прическа",
"characters": 7454,
"tokens": 3001,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Макияж/Наличие или отсутствие бороды",
"characters": 12688,
"tokens": 5106,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Аромат парфюмерии",
"characters": 11202,
"tokens": 4503,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Верхняя одежда",
"characters": 6367,
"tokens": 2568,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Сменная обувь",
"characters": 5772,
"tokens": 2330,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Положение сумки или портфеля",
"characters": 18301,
"tokens": 7348,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Рассадка во время деловых встреч",
"characters": 6973,
"tokens": 2818,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Кофе-брейк и предложение напитков",
"characters": 11107,
"tokens": 4472,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Business meal",
"characters": 17000,
"tokens": 6822,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Поведение на приемах",
"characters": 14280,
"tokens": 5737,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Заключение",
"characters": 3965,
"tokens": 1607,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Примечания",
"characters": 1651,
"tokens": 684,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,267 @@
{
"book": {
"title": "Онлайн-бизнес: юридическая упаковка и сопровождение интернет-проектов",
"author": "Елена Федорук",
"totalChapters": 32,
"totalCharacters": 325761,
"totalTokens": 131380
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Кто такой инфоюрист и что он может сделать для онлайн-проекта?",
"characters": 23536,
"tokens": 9454,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Онлайн-бизнес",
"characters": 5476,
"tokens": 2211,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Что нужно знать для юридического сопровождения онлайн-проекта",
"characters": 5230,
"tokens": 2132,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "1. Как юридически закрепить отношения между продюсером и экспертом?",
"characters": 6814,
"tokens": 2767,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "2. Партнерство с иностранным элементом",
"characters": 8043,
"tokens": 3248,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "3. Пять вопросов про авторские права для составления договора",
"characters": 6557,
"tokens": 2662,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "5. Чего нет в шаблонах договоров?",
"characters": 8225,
"tokens": 3319,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "7. 6 самых распространенных ошибок в договоре продюсера и эксперта",
"characters": 8523,
"tokens": 3451,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "9. Особенности юридического оформления онлайн-проектов с привлеченными инвестициями",
"characters": 17135,
"tokens": 6903,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Бизнес-старт в онлайне. Выбор организационно- правовой формы",
"characters": 7156,
"tokens": 2902,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "3. Что мы знаем об ИП?",
"characters": 12241,
"tokens": 4921,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Выбор системы налогообложения",
"characters": 9199,
"tokens": 3707,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "1. Налоговые каникулы",
"characters": 7469,
"tokens": 3012,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "1. Какие договоры экономически выгодно заключать с контрагентами?",
"characters": 12906,
"tokens": 5205,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "3. Юридическая сила электронной переписки",
"characters": 7654,
"tokens": 3094,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "4. Аналоги собственноручной подписи",
"characters": 5504,
"tokens": 2232,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "2. Необходимый минимум документов для сайта",
"characters": 20316,
"tokens": 8160,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "4. Обработка персональных данных пользователей сайта",
"characters": 19762,
"tokens": 7941,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "5. Как правильно размещать документы на сайте",
"characters": 7419,
"tokens": 3002,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "1. Что именно признается рекламой?",
"characters": 5965,
"tokens": 2416,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "5. Лайфхаки от рекламщиков, которые помогут похвалить себя и при этом действовать в рамках закона",
"characters": 10632,
"tokens": 4307,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Правовой аудит онлайн-проекта",
"characters": 7693,
"tokens": 3105,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Взаимодействие с клиентами. Возвраты",
"characters": 13912,
"tokens": 5595,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Защита интеллектуальной собственности и деловой репутации в интернете",
"characters": 7856,
"tokens": 3186,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "3. Передача авторских прав в онлайн-бизнесе",
"characters": 9906,
"tokens": 3996,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "4. Как защитить авторские права?",
"characters": 9342,
"tokens": 3765,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "5. Как доказать собственное авторство?",
"characters": 5290,
"tokens": 2148,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "8. Три мифа о защите авторского права",
"characters": 6493,
"tokens": 2628,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "11. Авторское право на фотографии",
"characters": 15456,
"tokens": 6212,
"footnotesCount": 0,
"filePath": "content28.html"
},
{
"chapterNumber": 30,
"chapterTitle": "О лицензировании образовательной деятельности",
"characters": 14076,
"tokens": 5665,
"footnotesCount": 0,
"filePath": "content29.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Заключение",
"characters": 16574,
"tokens": 6650,
"footnotesCount": 0,
"filePath": "content30.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Примечания",
"characters": 3401,
"tokens": 1384,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,371 @@
{
"book": {
"title": "Планируй. Как правильно планировать каждый год своей жиз-ни и сделать максимум запланированного",
"author": "Игорь Манн",
"totalChapters": 45,
"totalCharacters": 111982,
"totalTokens": 46375
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Гроуинг 1.1 Epub 1",
"characters": 402,
"tokens": 192,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "Гроуинг 1.1 Epub 1 1",
"characters": 677,
"tokens": 304,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-1.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Гроуинг 1.1 Epub 1 2",
"characters": 4781,
"tokens": 1946,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-2.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Гроуинг 1.1 Epub 1 3",
"characters": 1630,
"tokens": 686,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-3.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Гроуинг 1.1 Epub 1 4",
"characters": 592,
"tokens": 270,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-4.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Гроуинг 1.1 Epub 1 5",
"characters": 0,
"tokens": 34,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-5.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "Гроуинг 1.1 Epub 1 6",
"characters": 8924,
"tokens": 3603,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-6.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Гроуинг 1.1 Epub 1 7",
"characters": 10954,
"tokens": 4415,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-7.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Гроуинг 1.1 Epub 1 8",
"characters": 6465,
"tokens": 2620,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-8.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Гроуинг 1.1 Epub 1 9",
"characters": 8421,
"tokens": 3403,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-9.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "Гроуинг 1.1 Epub 1 10",
"characters": 2828,
"tokens": 1167,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-10.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "Гроуинг 1.1 Epub 1 11",
"characters": 1475,
"tokens": 626,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-11.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "Гроуинг 1.1 Epub 1 12",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-12.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "Гроуинг 1.1 Epub 1 13",
"characters": 1995,
"tokens": 834,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-13.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "Гроуинг 1.1 Epub 1 14",
"characters": 4648,
"tokens": 1895,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-14.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "Гроуинг 1.1 Epub 1 15",
"characters": 6452,
"tokens": 2616,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-15.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "Гроуинг 1.1 Epub 1 16",
"characters": 12181,
"tokens": 4908,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-16.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "Гроуинг 1.1 Epub 1 17",
"characters": 8269,
"tokens": 3343,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-17.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "Гроуинг 1.1 Epub 1 18",
"characters": 589,
"tokens": 271,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-18.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "Гроуинг 1.1 Epub 1 19",
"characters": 539,
"tokens": 251,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-19.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "Гроуинг 1.1 Epub 1 20",
"characters": 10,
"tokens": 40,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-20.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "Гроуинг 1.1 Epub 1 21",
"characters": 554,
"tokens": 257,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-21.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "Гроуинг 1.1 Epub 1 22",
"characters": 3056,
"tokens": 1258,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-22.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "Гроуинг 1.1 Epub 1 23",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-23.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "Гроуинг 1.1 Epub 1 24",
"characters": 5769,
"tokens": 2343,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-24.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "Гроуинг 1.1 Epub 1 25",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-25.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "Гроуинг 1.1 Epub 1 26",
"characters": 8049,
"tokens": 3255,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-26.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "Гроуинг 1.1 Epub 1 27",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-27.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "Гроуинг 1.1 Epub 1 28",
"characters": 9549,
"tokens": 3855,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-28.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "Гроуинг 1.1 Epub 1 29",
"characters": 1878,
"tokens": 787,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-29.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "Гроуинг 1.1 Epub 1 30",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-30.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Гроуинг 1.1 Epub 1 31",
"characters": 801,
"tokens": 356,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-31.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "Гроуинг 1.1 Epub 1 32",
"characters": 0,
"tokens": 36,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-32.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "Гроуинг 1.1 Epub 1 33",
"characters": 255,
"tokens": 138,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-33.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "Гроуинг 1.1 Epub 1 34",
"characters": 20,
"tokens": 44,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-34.xhtml"
},
{
"chapterNumber": 36,
"chapterTitle": "Гроуинг 1.1 Epub 1 35",
"characters": 47,
"tokens": 54,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-35.xhtml"
},
{
"chapterNumber": 37,
"chapterTitle": "Гроуинг 1.1 Epub 1 36",
"characters": 12,
"tokens": 40,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-36.xhtml"
},
{
"chapterNumber": 38,
"chapterTitle": "Гроуинг 1.1 Epub 1 37",
"characters": 24,
"tokens": 45,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-37.xhtml"
},
{
"chapterNumber": 39,
"chapterTitle": "Гроуинг 1.1 Epub 1 38",
"characters": 17,
"tokens": 42,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-38.xhtml"
},
{
"chapterNumber": 40,
"chapterTitle": "Гроуинг 1.1 Epub 1 39",
"characters": 24,
"tokens": 45,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-39.xhtml"
},
{
"chapterNumber": 41,
"chapterTitle": "Гроуинг 1.1 Epub 1 40",
"characters": 28,
"tokens": 47,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-40.xhtml"
},
{
"chapterNumber": 42,
"chapterTitle": "Гроуинг 1.1 Epub 1 41",
"characters": 20,
"tokens": 44,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-41.xhtml"
},
{
"chapterNumber": 43,
"chapterTitle": "Гроуинг 1.1 Epub 1 42",
"characters": 19,
"tokens": 43,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-42.xhtml"
},
{
"chapterNumber": 44,
"chapterTitle": "Гроуинг 1.1 Epub 1 43",
"characters": 14,
"tokens": 41,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-43.xhtml"
},
{
"chapterNumber": 45,
"chapterTitle": "Гроуинг 1.1 Epub 1 44",
"characters": 14,
"tokens": 41,
"footnotesCount": 0,
"filePath": роуинг_1.1_EPUB-1-44.xhtml"
}
]
}

View File

@@ -0,0 +1,291 @@
{
"book": {
"title": "По собственному выбору: от хорошего к великому",
"author": "Джим Коллинз & Мортен Хансен",
"totalChapters": 35,
"totalCharacters": 549997,
"totalTokens": 224125
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Информация от издательства",
"characters": 1241,
"tokens": 524,
"footnotesCount": 0,
"filePath": "Text/info.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "Предисловие к русскому изданию",
"characters": 2646,
"tokens": 1089,
"footnotesCount": 0,
"filePath": "Text/predis.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Epi",
"characters": 175,
"tokens": 88,
"footnotesCount": 0,
"filePath": "Text/epi.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Величие посреди хаоса",
"characters": 20337,
"tokens": 8165,
"footnotesCount": 6,
"filePath": "Text/gl1.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "ВЫ АМУНДСЕН ИЛИ СКОТТ?",
"characters": 50406,
"tokens": 20201,
"footnotesCount": 14,
"filePath": "Text/gl2.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Двадцатимильный марш",
"characters": 0,
"tokens": 25,
"footnotesCount": 0,
"filePath": "Text/gl3.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "ДВАДЦАТИМИЛЬНЫЙ МАРШ ДЖОНА БРАУНА",
"characters": 49679,
"tokens": 19903,
"footnotesCount": 1,
"filePath": "Text/gl3-1.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Сначала пули, ядра потом",
"characters": 0,
"tokens": 26,
"footnotesCount": 0,
"filePath": "Text/gl4.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "СЮРПРИЗ, БОЛЬШОЙ СЮРПРИЗ",
"characters": 55550,
"tokens": 22249,
"footnotesCount": 2,
"filePath": "Text/gl4-1.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Лидерство над линией смерти",
"characters": 0,
"tokens": 27,
"footnotesCount": 0,
"filePath": "Text/gl5.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "НЕ ВСЕ МОМЕНТЫ В ЖИЗНИ РАВНОЦЕННЫ",
"characters": 45565,
"tokens": 18266,
"footnotesCount": 8,
"filePath": "Text/gl5-1.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "Глава 6",
"characters": 0,
"tokens": 19,
"footnotesCount": 0,
"filePath": "Text/gl6.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "С ФАНАТИЧНОЙ ДИСЦИПЛИНОЙ ПРИДЕРЖИВАТЬСЯ РЕЦЕПТА СМАК",
"characters": 45857,
"tokens": 18381,
"footnotesCount": 0,
"filePath": "Text/gl6-1.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "УДАЧА ИЛИ ОПЫТ?",
"characters": 60131,
"tokens": 24084,
"footnotesCount": 2,
"filePath": "Text/gl7.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "ЭПИЛОГ",
"characters": 4114,
"tokens": 1667,
"footnotesCount": 0,
"filePath": "Text/epilog.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ",
"characters": 24968,
"tokens": 10015,
"footnotesCount": 2,
"filePath": "Text/faq.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "ПРИНЦИПЫ ИССЛЕДОВАНИЯ",
"characters": 0,
"tokens": 28,
"footnotesCount": 0,
"filePath": "Text/princip.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "МЕТОДОЛОГИЯ",
"characters": 20090,
"tokens": 8066,
"footnotesCount": 2,
"filePath": "Text/methodology.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "ОТБОР КОМПАНИЙ В ГРУППУ 10×",
"characters": 7163,
"tokens": 2894,
"footnotesCount": 0,
"filePath": "Text/otbor.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "ОТБОР КОМПАНИЙ ДЛЯ СРАВНЕНИЯ",
"characters": 5200,
"tokens": 2111,
"footnotesCount": 0,
"filePath": "Text/otbor2.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "ДВАДЦАТИМИЛЬНЫЙ МАРШ",
"characters": 3164,
"tokens": 1294,
"footnotesCount": 0,
"filePath": "Text/20miles.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "АНАЛИЗ ИННОВАЦИЙ",
"characters": 5054,
"tokens": 2051,
"footnotesCount": 0,
"filePath": "Text/analyse_inn.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "СНАЧАЛА ПУЛИ, ЯДРА ПОТОМ",
"characters": 4138,
"tokens": 1683,
"footnotesCount": 1,
"filePath": "Text/puli.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "АНАЛИЗ РИСКОВ ПО ЛИКВИДНОСТИ И БАЛАНСУ",
"characters": 3364,
"tokens": 1388,
"footnotesCount": 4,
"filePath": "Text/analyse_risk.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "АНАЛИЗ КАТЕГОРИЙ РИСКА",
"characters": 4389,
"tokens": 1790,
"footnotesCount": 3,
"filePath": "Text/analyse_cat.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "АНАЛИЗ СКОРОСТИ",
"characters": 6462,
"tokens": 2622,
"footnotesCount": 7,
"filePath": "Text/analyse-speed.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "АНАЛИЗ РЕЦЕПТА СМАК",
"characters": 2843,
"tokens": 1170,
"footnotesCount": 2,
"filePath": "Text/analyse-smak.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "АНАЛИЗ УДАЧИ",
"characters": 8117,
"tokens": 3280,
"footnotesCount": 5,
"filePath": "Text/analyse-lucky.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "АНАЛИЗ ЗАЛА СЛАВЫ ХОККЕЯ",
"characters": 1859,
"tokens": 770,
"footnotesCount": 1,
"filePath": "Text/zal.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 101705,
"tokens": 40705,
"footnotesCount": 0,
"filePath": "Text/notes.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "БЛАГОДАРНОСТИ",
"characters": 7161,
"tokens": 2889,
"footnotesCount": 0,
"filePath": "Text/thanks.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 568,
"tokens": 250,
"footnotesCount": 0,
"filePath": "Text/author.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "Links",
"characters": 7488,
"tokens": 6136,
"footnotesCount": 118,
"filePath": "Text/links.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "МИФ Бизнес",
"characters": 161,
"tokens": 85,
"footnotesCount": 0,
"filePath": "Text/max.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "Над книгой работали",
"characters": 402,
"tokens": 184,
"footnotesCount": 0,
"filePath": "Text/end.xhtml"
}
]
}

View File

@@ -0,0 +1,299 @@
{
"book": {
"title": "Пять пороков команды: практика преодоления",
"author": "Патрик Ленсиони",
"totalChapters": 36,
"totalCharacters": 194733,
"totalTokens": 79211
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "OVERCOMING THE FIVE DYSFUNCTIONS OF A TEAM",
"characters": 25,
"tokens": 40,
"footnotesCount": 0,
"filePath": "t1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "ПЯТЬ ПОРОКОВ КОМАНДЫ: ПРАКТИКА ПРЕОДОЛЕНИЯ",
"characters": 37,
"tokens": 44,
"footnotesCount": 0,
"filePath": "t2.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Информацияот издательства",
"characters": 1427,
"tokens": 595,
"footnotesCount": 0,
"filePath": "inf.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Posv",
"characters": 150,
"tokens": 77,
"footnotesCount": 0,
"filePath": "posv.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "ДЛЯ ЧЕГО ЭТА КНИГА?",
"characters": 1789,
"tokens": 736,
"footnotesCount": 0,
"filePath": "vv.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "ОПРЕДЕЛИМСЯ С ПОНЯТИЯМИ",
"characters": 0,
"tokens": 23,
"footnotesCount": 0,
"filePath": "C1.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "C11",
"characters": 229,
"tokens": 107,
"footnotesCount": 0,
"filePath": "C11.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "АРГУМЕНТЫ В ПОЛЬЗУ КОМАНДНОЙ РАБОТЫ",
"characters": 3335,
"tokens": 1362,
"footnotesCount": 0,
"filePath": "g1.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "КОРОТКО О ПРЕДЛАГАЕМОЙ МОДЕЛИ",
"characters": 2383,
"tokens": 978,
"footnotesCount": 0,
"filePath": "g2.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Вопрос 1: «А действительно ли мы команда?»",
"characters": 2245,
"tokens": 928,
"footnotesCount": 0,
"filePath": "g3.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "БОРЬБА С ПЯТЬЮ ПОРОКАМИ КОМАНДЫ",
"characters": 0,
"tokens": 26,
"footnotesCount": 0,
"filePath": "C2.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "C21",
"characters": 294,
"tokens": 133,
"footnotesCount": 0,
"filePath": "C21.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "БОРЬБА С ПОРОКОМ 1",
"characters": 33480,
"tokens": 13413,
"footnotesCount": 4,
"filePath": "g4.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "Как управлять конфликтной ситуацией",
"characters": 21618,
"tokens": 8675,
"footnotesCount": 1,
"filePath": "g5.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "БОРЬБА С ПОРОКОМ 3",
"characters": 13300,
"tokens": 5341,
"footnotesCount": 0,
"filePath": "g6.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "ИСТОРИЯ О НЕДОСТАТКЕ ТРЕБОВАТЕЛЬНОСТИ",
"characters": 12022,
"tokens": 4836,
"footnotesCount": 0,
"filePath": "g7.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "ИСТОРИЯ О ПРЕОБЛАДАНИИ ИНДИВИДУАЛЬНОГО НАД КОМАНДНЫМ",
"characters": 17651,
"tokens": 7094,
"footnotesCount": 1,
"filePath": "g8.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "ОТВЕТЫ НА ВОПРОСЫ. ПРЕДВОСХИЩАЯ ТРУДНОСТИ",
"characters": 0,
"tokens": 30,
"footnotesCount": 0,
"filePath": "C3.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "C31",
"characters": 312,
"tokens": 140,
"footnotesCount": 0,
"filePath": "C31.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "Сколько времени занимает формирование команды?",
"characters": 7831,
"tokens": 3164,
"footnotesCount": 2,
"filePath": "g9.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "ВОЗРАЖЕНИЯ УЧАСТНИКОВ ДИСКУССИИ",
"characters": 5433,
"tokens": 2200,
"footnotesCount": 0,
"filePath": "g10.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "ПРЕПЯТСТВИЯ, КОТОРЫХ НАДО ИЗБЕГАТЬ",
"characters": 10085,
"tokens": 4062,
"footnotesCount": 0,
"filePath": "g11.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "КАК СФОРМИРОВАТЬ КОМАНДУ",
"characters": 0,
"tokens": 23,
"footnotesCount": 0,
"filePath": "C4.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "C41",
"characters": 158,
"tokens": 79,
"footnotesCount": 0,
"filePath": "C41.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "ПЛАН ДЕЙСТВИЙ ПО ФОРМИРОВАНИЮ КОМАНДЫ",
"characters": 5396,
"tokens": 2187,
"footnotesCount": 0,
"filePath": "g12.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "ПЕРВАЯ ВЫЕЗДНАЯ ВСТРЕЧА",
"characters": 6938,
"tokens": 2799,
"footnotesCount": 0,
"filePath": "g13.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "ПОДРОБНЕЕ О ПРИЕМАХ И УПРАЖНЕНИЯХ",
"characters": 29991,
"tokens": 12024,
"footnotesCount": 0,
"filePath": "g14.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "ГЛОССАРИЙ",
"characters": 8034,
"tokens": 3233,
"footnotesCount": 1,
"filePath": "gloss.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "ИСТОЧНИКИ",
"characters": 3700,
"tokens": 1498,
"footnotesCount": 0,
"filePath": "ist.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "СЛОВА БЛАГОДАРНОСТИ",
"characters": 1710,
"tokens": 705,
"footnotesCount": 0,
"filePath": "th.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 2314,
"tokens": 945,
"footnotesCount": 0,
"filePath": "about.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "Пять пороков команды",
"characters": 536,
"tokens": 236,
"footnotesCount": 0,
"filePath": "r1.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "Сердце компании",
"characters": 579,
"tokens": 251,
"footnotesCount": 0,
"filePath": "r2.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 1203,
"tokens": 976,
"footnotesCount": 18,
"filePath": "links.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "МИФ Бизнес",
"characters": 161,
"tokens": 83,
"footnotesCount": 0,
"filePath": "biz.xhtml"
},
{
"chapterNumber": 36,
"chapterTitle": "НАД КНИГОЙ РАБОТАЛИ",
"characters": 367,
"tokens": 168,
"footnotesCount": 0,
"filePath": "end.xhtml"
}
]
}

View File

@@ -0,0 +1,147 @@
{
"book": {
"title": "Рисуй, чтобы победить: проверенный способ руководить, продавать, изобретать и обучать",
"author": "Дэн Роэм",
"totalChapters": 17,
"totalCharacters": 147803,
"totalTokens": 59596
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Дэн Роэм Рисуй, чтобы победить. Проверенный способ руководить, продавать, изобретать и обучать",
"characters": 94,
"tokens": 87,
"footnotesCount": 0,
"filePath": "ch1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "* * *",
"characters": 569,
"tokens": 243,
"footnotesCount": 0,
"filePath": "ch1-1.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Ch1 2",
"characters": 34,
"tokens": 29,
"footnotesCount": 0,
"filePath": "ch1-2.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Запуск",
"characters": 1784,
"tokens": 729,
"footnotesCount": 0,
"filePath": "ch1-3.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "Глава 1. Рисуйте так, словно от этого зависит ваша жизнь",
"characters": 10237,
"tokens": 4130,
"footnotesCount": 0,
"filePath": "ch1-4.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "Глава 2. Побеждает тот, кто лучше рисует",
"characters": 17648,
"tokens": 7089,
"footnotesCount": 0,
"filePath": "ch1-5.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "Глава 3. Сначала нарисуйте круг, потом дайте ему имя",
"characters": 11682,
"tokens": 4706,
"footnotesCount": 0,
"filePath": "ch1-6.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "Глава 4. Взгляд указывает, разум повинуется",
"characters": 14219,
"tokens": 5718,
"footnotesCount": 0,
"filePath": "ch1-7.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "Глава 5. Начните с вопроса «кто?»",
"characters": 14575,
"tokens": 5857,
"footnotesCount": 0,
"filePath": "ch1-8.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "Глава 6. Чтобы руководить, нарисуйте вашу цель",
"characters": 17871,
"tokens": 7180,
"footnotesCount": 0,
"filePath": "ch1-9.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "Глава 7. Чтобы продавать, рисуйте вместе",
"characters": 15255,
"tokens": 6133,
"footnotesCount": 0,
"filePath": "ch1-10.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "Глава 8. Чтобы изобретать, нарисуйте мир вверх тормашками",
"characters": 17765,
"tokens": 7143,
"footnotesCount": 0,
"filePath": "ch1-11.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "Глава 9. Чтобы научить, нарисуйте историю",
"characters": 13131,
"tokens": 5283,
"footnotesCount": 0,
"filePath": "ch1-12.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "Глава 10. Когда не знаете, что делать, рисуйте",
"characters": 6681,
"tokens": 2706,
"footnotesCount": 0,
"filePath": "ch1-13.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "Благодарности",
"characters": 4954,
"tokens": 2001,
"footnotesCount": 0,
"filePath": "ch1-14.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "Эту книгу хорошо дополняют:",
"characters": 128,
"tokens": 76,
"footnotesCount": 0,
"filePath": "ch1-15.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "Сноски",
"characters": 1176,
"tokens": 486,
"footnotesCount": 0,
"filePath": "ch2.xhtml"
}
]
}

View File

@@ -0,0 +1,755 @@
{
"book": {
"title": "Стартап. Настольная книга основателя",
"author": "Стив Бланк, Боб Дорф",
"totalChapters": 93,
"totalCharacters": 925726,
"totalTokens": 372955
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Section00",
"characters": 1102,
"tokens": 464,
"footnotesCount": 0,
"filePath": "Text/Section00.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Section01",
"characters": 8771,
"tokens": 3532,
"footnotesCount": 0,
"filePath": "Text/Section01.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Section02",
"characters": 1786,
"tokens": 738,
"footnotesCount": 0,
"filePath": "Text/Section02.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Section03",
"characters": 8806,
"tokens": 3546,
"footnotesCount": 0,
"filePath": "Text/Section03.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Section04",
"characters": 3424,
"tokens": 1393,
"footnotesCount": 0,
"filePath": "Text/Section04.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Section05",
"characters": 10173,
"tokens": 4093,
"footnotesCount": 0,
"filePath": "Text/Section05.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Section06",
"characters": 6412,
"tokens": 2588,
"footnotesCount": 0,
"filePath": "Text/Section06.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Section07",
"characters": 6694,
"tokens": 2701,
"footnotesCount": 0,
"filePath": "Text/Section07.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Section08",
"characters": 12351,
"tokens": 4964,
"footnotesCount": 0,
"filePath": "Text/Section08.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Путь к озарению: модель развития потребителей Манифест развития потребителей",
"characters": 94,
"tokens": 88,
"footnotesCount": 0,
"filePath": "Text/Section09.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Section10",
"characters": 35939,
"tokens": 14399,
"footnotesCount": 0,
"filePath": "Text/Section10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Section11",
"characters": 23733,
"tokens": 9517,
"footnotesCount": 0,
"filePath": "Text/Section11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Section111",
"characters": 36942,
"tokens": 14802,
"footnotesCount": 0,
"filePath": "Text/Section111.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Введение к этапу выявления потребителей Глава 4 Выявление потребителей",
"characters": 379,
"tokens": 200,
"footnotesCount": 0,
"filePath": "Text/Section12.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Section13",
"characters": 41,
"tokens": 40,
"footnotesCount": 0,
"filePath": "Text/Section13.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Section1301",
"characters": 23426,
"tokens": 9397,
"footnotesCount": 0,
"filePath": "Text/Section1301.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Выявление потребителей",
"characters": 97760,
"tokens": 39133,
"footnotesCount": 0,
"filePath": "Text/Section14.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Section1401",
"characters": 266,
"tokens": 133,
"footnotesCount": 0,
"filePath": "Text/Section1401.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Section1402",
"characters": 97441,
"tokens": 39003,
"footnotesCount": 0,
"filePath": "Text/Section1402.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Выявление потребителей",
"characters": 62191,
"tokens": 24905,
"footnotesCount": 0,
"filePath": "Text/Section15.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Выявление потребителей",
"characters": 53472,
"tokens": 21417,
"footnotesCount": 0,
"filePath": "Text/Section16.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Выявление потребителей",
"characters": 27287,
"tokens": 10943,
"footnotesCount": 0,
"filePath": "Text/Section17.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Введение к этапу верификации потребителей Глава 9 Верификация потребителей",
"characters": 360,
"tokens": 194,
"footnotesCount": 0,
"filePath": "Text/Section18.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Введение к этапу верификации потребителей Во время путешествия мы обычно забываем его цель",
"characters": 23873,
"tokens": 9606,
"footnotesCount": 0,
"filePath": "Text/Section19.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Верификация потребителей",
"characters": 97584,
"tokens": 39063,
"footnotesCount": 0,
"filePath": "Text/Section20.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Верификация потребителей",
"characters": 86770,
"tokens": 34738,
"footnotesCount": 0,
"filePath": "Text/Section21.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Верификация потребителей",
"characters": 24160,
"tokens": 9694,
"footnotesCount": 0,
"filePath": "Text/Section22.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Верификация потребителей",
"characters": 57355,
"tokens": 22972,
"footnotesCount": 0,
"filePath": "Text/Section24.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Section25",
"characters": 16946,
"tokens": 6802,
"footnotesCount": 0,
"filePath": "Text/Section25.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Section26",
"characters": 316,
"tokens": 150,
"footnotesCount": 0,
"filePath": "Text/Section26.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Section001",
"characters": 1495,
"tokens": 624,
"footnotesCount": 0,
"filePath": "Text/Section001.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Section0001",
"characters": 1033,
"tokens": 440,
"footnotesCount": 0,
"filePath": "Text/Section0001.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Section0002",
"characters": 1586,
"tokens": 661,
"footnotesCount": 0,
"filePath": "Text/Section0002.html"
},
{
"chapterNumber": 34,
"chapterTitle": "Section0003",
"characters": 1365,
"tokens": 573,
"footnotesCount": 0,
"filePath": "Text/Section0003.html"
},
{
"chapterNumber": 35,
"chapterTitle": "Section0004",
"characters": 1646,
"tokens": 685,
"footnotesCount": 0,
"filePath": "Text/Section0004.html"
},
{
"chapterNumber": 36,
"chapterTitle": "Section0005",
"characters": 1621,
"tokens": 675,
"footnotesCount": 0,
"filePath": "Text/Section0005.html"
},
{
"chapterNumber": 37,
"chapterTitle": "Section0006",
"characters": 843,
"tokens": 364,
"footnotesCount": 0,
"filePath": "Text/Section0006.html"
},
{
"chapterNumber": 38,
"chapterTitle": "Section0007",
"characters": 1229,
"tokens": 518,
"footnotesCount": 0,
"filePath": "Text/Section0007.html"
},
{
"chapterNumber": 39,
"chapterTitle": "Section0008",
"characters": 1079,
"tokens": 458,
"footnotesCount": 0,
"filePath": "Text/Section0008.html"
},
{
"chapterNumber": 40,
"chapterTitle": "Section0009",
"characters": 1101,
"tokens": 467,
"footnotesCount": 0,
"filePath": "Text/Section0009.html"
},
{
"chapterNumber": 41,
"chapterTitle": "Section0010",
"characters": 684,
"tokens": 300,
"footnotesCount": 0,
"filePath": "Text/Section0010.html"
},
{
"chapterNumber": 42,
"chapterTitle": "Section0011",
"characters": 729,
"tokens": 318,
"footnotesCount": 0,
"filePath": "Text/Section0011.html"
},
{
"chapterNumber": 43,
"chapterTitle": "Section0012",
"characters": 817,
"tokens": 353,
"footnotesCount": 0,
"filePath": "Text/Section0012.html"
},
{
"chapterNumber": 44,
"chapterTitle": "Section0013",
"characters": 584,
"tokens": 260,
"footnotesCount": 0,
"filePath": "Text/Section0013.html"
},
{
"chapterNumber": 45,
"chapterTitle": "Section0014",
"characters": 687,
"tokens": 301,
"footnotesCount": 0,
"filePath": "Text/Section0014.html"
},
{
"chapterNumber": 46,
"chapterTitle": "Section0015",
"characters": 701,
"tokens": 307,
"footnotesCount": 0,
"filePath": "Text/Section0015.html"
},
{
"chapterNumber": 47,
"chapterTitle": "Section0016",
"characters": 920,
"tokens": 395,
"footnotesCount": 0,
"filePath": "Text/Section0016.html"
},
{
"chapterNumber": 48,
"chapterTitle": "Section0017",
"characters": 888,
"tokens": 382,
"footnotesCount": 0,
"filePath": "Text/Section0017.html"
},
{
"chapterNumber": 49,
"chapterTitle": "Выявление потребителей",
"characters": 1169,
"tokens": 498,
"footnotesCount": 0,
"filePath": "Text/Section0018.html"
},
{
"chapterNumber": 50,
"chapterTitle": "Section0019",
"characters": 1043,
"tokens": 444,
"footnotesCount": 0,
"filePath": "Text/Section0019.html"
},
{
"chapterNumber": 51,
"chapterTitle": "Section0020",
"characters": 1327,
"tokens": 557,
"footnotesCount": 0,
"filePath": "Text/Section0020.html"
},
{
"chapterNumber": 52,
"chapterTitle": "Section0021",
"characters": 998,
"tokens": 426,
"footnotesCount": 0,
"filePath": "Text/Section0021.html"
},
{
"chapterNumber": 53,
"chapterTitle": "Section0022",
"characters": 961,
"tokens": 411,
"footnotesCount": 0,
"filePath": "Text/Section0022.html"
},
{
"chapterNumber": 54,
"chapterTitle": "Section0023",
"characters": 1141,
"tokens": 483,
"footnotesCount": 0,
"filePath": "Text/Section0023.html"
},
{
"chapterNumber": 55,
"chapterTitle": "Section0024",
"characters": 699,
"tokens": 306,
"footnotesCount": 0,
"filePath": "Text/Section0024.html"
},
{
"chapterNumber": 56,
"chapterTitle": "Section0025",
"characters": 556,
"tokens": 249,
"footnotesCount": 0,
"filePath": "Text/Section0025.html"
},
{
"chapterNumber": 57,
"chapterTitle": "Section0026",
"characters": 1212,
"tokens": 511,
"footnotesCount": 0,
"filePath": "Text/Section0026.html"
},
{
"chapterNumber": 58,
"chapterTitle": "Section0027",
"characters": 800,
"tokens": 347,
"footnotesCount": 0,
"filePath": "Text/Section0027.html"
},
{
"chapterNumber": 59,
"chapterTitle": "Выявление потребителей",
"characters": 1081,
"tokens": 463,
"footnotesCount": 0,
"filePath": "Text/Section0028.html"
},
{
"chapterNumber": 60,
"chapterTitle": "Выявление потребителей",
"characters": 928,
"tokens": 402,
"footnotesCount": 0,
"filePath": "Text/Section0029.html"
},
{
"chapterNumber": 61,
"chapterTitle": "Верификация потребителей",
"characters": 618,
"tokens": 279,
"footnotesCount": 0,
"filePath": "Text/Section0030.html"
},
{
"chapterNumber": 62,
"chapterTitle": "Верификация потребителей",
"characters": 1686,
"tokens": 706,
"footnotesCount": 0,
"filePath": "Text/Section0031.html"
},
{
"chapterNumber": 63,
"chapterTitle": "Верификация потребителей",
"characters": 988,
"tokens": 427,
"footnotesCount": 0,
"filePath": "Text/Section0032.html"
},
{
"chapterNumber": 64,
"chapterTitle": "Верификация потребителей",
"characters": 655,
"tokens": 294,
"footnotesCount": 0,
"filePath": "Text/Section0033.html"
},
{
"chapterNumber": 65,
"chapterTitle": "Верификация потребителей",
"characters": 892,
"tokens": 388,
"footnotesCount": 0,
"filePath": "Text/Section0034.html"
},
{
"chapterNumber": 66,
"chapterTitle": "Верификация потребителей",
"characters": 1144,
"tokens": 489,
"footnotesCount": 0,
"filePath": "Text/Section0035.html"
},
{
"chapterNumber": 67,
"chapterTitle": "Верификация потребителей",
"characters": 1103,
"tokens": 473,
"footnotesCount": 0,
"filePath": "Text/Section0036.html"
},
{
"chapterNumber": 68,
"chapterTitle": "Верификация потребителей",
"characters": 599,
"tokens": 271,
"footnotesCount": 0,
"filePath": "Text/Section0037.html"
},
{
"chapterNumber": 69,
"chapterTitle": "Верификация потребителей",
"characters": 638,
"tokens": 287,
"footnotesCount": 0,
"filePath": "Text/Section0038.html"
},
{
"chapterNumber": 70,
"chapterTitle": "Верификация потребителей",
"characters": 722,
"tokens": 320,
"footnotesCount": 0,
"filePath": "Text/Section0039.html"
},
{
"chapterNumber": 71,
"chapterTitle": "Верификация потребителей",
"characters": 466,
"tokens": 218,
"footnotesCount": 0,
"filePath": "Text/Section0040.html"
},
{
"chapterNumber": 72,
"chapterTitle": "Верификация потребителей",
"characters": 689,
"tokens": 307,
"footnotesCount": 0,
"filePath": "Text/Section0041.html"
},
{
"chapterNumber": 73,
"chapterTitle": "Верификация потребителей",
"characters": 931,
"tokens": 404,
"footnotesCount": 0,
"filePath": "Text/Section0042.html"
},
{
"chapterNumber": 74,
"chapterTitle": "Верификация потребителей",
"characters": 732,
"tokens": 324,
"footnotesCount": 0,
"filePath": "Text/Section0043.html"
},
{
"chapterNumber": 75,
"chapterTitle": "Верификация потребителей",
"characters": 661,
"tokens": 296,
"footnotesCount": 0,
"filePath": "Text/Section0044.html"
},
{
"chapterNumber": 76,
"chapterTitle": "Верификация потребителей",
"characters": 1005,
"tokens": 434,
"footnotesCount": 0,
"filePath": "Text/Section0045.html"
},
{
"chapterNumber": 77,
"chapterTitle": "Section0046",
"characters": 584,
"tokens": 260,
"footnotesCount": 0,
"filePath": "Text/Section0046.html"
},
{
"chapterNumber": 78,
"chapterTitle": "Верификация потребителей",
"characters": 609,
"tokens": 275,
"footnotesCount": 0,
"filePath": "Text/Section0047.html"
},
{
"chapterNumber": 79,
"chapterTitle": "Верификация потребителей",
"characters": 448,
"tokens": 211,
"footnotesCount": 0,
"filePath": "Text/Section0048.html"
},
{
"chapterNumber": 80,
"chapterTitle": "Верификация потребителей",
"characters": 642,
"tokens": 288,
"footnotesCount": 0,
"filePath": "Text/Section0049.html"
},
{
"chapterNumber": 81,
"chapterTitle": "Верификация потребителей",
"characters": 676,
"tokens": 302,
"footnotesCount": 0,
"filePath": "Text/Section0050.html"
},
{
"chapterNumber": 82,
"chapterTitle": "Верификация потребителей",
"characters": 752,
"tokens": 332,
"footnotesCount": 0,
"filePath": "Text/Section0051.html"
},
{
"chapterNumber": 83,
"chapterTitle": "Верификация потребителей",
"characters": 1212,
"tokens": 516,
"footnotesCount": 0,
"filePath": "Text/Section0052.html"
},
{
"chapterNumber": 84,
"chapterTitle": "Верификация потребителей",
"characters": 572,
"tokens": 260,
"footnotesCount": 0,
"filePath": "Text/Section0053.html"
},
{
"chapterNumber": 85,
"chapterTitle": "Верификация потребителей",
"characters": 1044,
"tokens": 449,
"footnotesCount": 0,
"filePath": "Text/Section0054.html"
},
{
"chapterNumber": 86,
"chapterTitle": "Верификация потребителей",
"characters": 736,
"tokens": 326,
"footnotesCount": 0,
"filePath": "Text/Section0055.html"
},
{
"chapterNumber": 87,
"chapterTitle": "Верификация потребителей",
"characters": 809,
"tokens": 355,
"footnotesCount": 0,
"filePath": "Text/Section0056.html"
},
{
"chapterNumber": 88,
"chapterTitle": "Section27",
"characters": 21503,
"tokens": 8625,
"footnotesCount": 0,
"filePath": "Text/Section27.html"
},
{
"chapterNumber": 89,
"chapterTitle": "Section28",
"characters": 10016,
"tokens": 4030,
"footnotesCount": 0,
"filePath": "Text/Section28.html"
},
{
"chapterNumber": 90,
"chapterTitle": "Section29",
"characters": 9430,
"tokens": 3796,
"footnotesCount": 0,
"filePath": "Text/Section29.html"
},
{
"chapterNumber": 91,
"chapterTitle": "Section30",
"characters": 6115,
"tokens": 2470,
"footnotesCount": 0,
"filePath": "Text/Section30.html"
},
{
"chapterNumber": 92,
"chapterTitle": "Section31",
"characters": 146,
"tokens": 82,
"footnotesCount": 0,
"filePath": "Text/Section31.html"
},
{
"chapterNumber": 93,
"chapterTitle": "Link",
"characters": 126,
"tokens": 68,
"footnotesCount": 0,
"filePath": "Text/link.html"
}
]
}

View File

@@ -0,0 +1,355 @@
{
"book": {
"title": "Стратегия вверх тормашками. Нестандартный подход к маркетингу для малого и среднего бизнеса, который сэкономит вам деньги, время и нервы",
"author": "Николай Викторович Молчанов",
"totalChapters": 43,
"totalCharacters": 293937,
"totalTokens": 119060
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Глава 1 Используем психологию Подводим потребителя к нужному нам выбору",
"characters": 5006,
"tokens": 2047,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Окружаем «нужный» вариант точками экстремума",
"characters": 5734,
"tokens": 2326,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Предъявляем «нужный» вариант в правильной последовательности",
"characters": 6555,
"tokens": 2662,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Делаем цену привлекательной учитываем особенности восприятия стоимости",
"characters": 5789,
"tokens": 2359,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Находим и демонстрируем сигналы качества",
"characters": 12211,
"tokens": 4916,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Глава 2 Используем психологию Убеждаем покупателя в правильности выбора",
"characters": 13520,
"tokens": 5453,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Используем эффективную структуру и приемы коммуникации с клиентами",
"characters": 5532,
"tokens": 2254,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Резонирующий фокус",
"characters": 5498,
"tokens": 2222,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Акцентируем внимание не только на преимуществах покупки, но и на угрозах в случае отказа от нее",
"characters": 5053,
"tokens": 2075,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Контролируем: мы предлагаем выбрать что-то или отказаться от чего-то",
"characters": 10044,
"tokens": 4060,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Глава 3 Перекрываем каналы утечки выручки",
"characters": 9698,
"tokens": 3912,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Самая распространенная проблема «входа» в воронку продаж о компании знают, но не те, кто надо",
"characters": 5519,
"tokens": 2262,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Самый забытый этап жизнь после покупки",
"characters": 8557,
"tokens": 3455,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Часть II Готовимся к росту укрепляем положение на рынке",
"characters": 6257,
"tokens": 2541,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Правила проведения сегментации потребителей",
"characters": 5837,
"tokens": 2368,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Вычисляем «мертвые души» среди лояльных клиентов",
"characters": 6409,
"tokens": 2599,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Глава 5 Достигаем превосходства над конкурентами",
"characters": 5818,
"tokens": 2363,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Определяем временной горизонт анализа",
"characters": 9057,
"tokens": 3653,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Определяем конкурентные силы",
"characters": 5350,
"tokens": 2168,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Оцениваем имеющиеся конкурентные преимущества",
"characters": 7262,
"tokens": 2939,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Выбираем основу для конкурентного преимущества",
"characters": 6550,
"tokens": 2655,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Находим свое конкурентное преимущество",
"characters": 9944,
"tokens": 4009,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Проверяем проблемы ценовой политики",
"characters": 6039,
"tokens": 2446,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Запускаем процесс ценообразования",
"characters": 5661,
"tokens": 2294,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Решаем вопрос с политикой скидок",
"characters": 9693,
"tokens": 3906,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Часть III Устремляемся в счастливое будущее завоевываем рынки и потребителей",
"characters": 9156,
"tokens": 3710,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Обезвреживаем бомбу оптимистичного планирования",
"characters": 6450,
"tokens": 2615,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Повышаем точность прогнозирования",
"characters": 5671,
"tokens": 2298,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Глава 8 Выходим на новые рынки",
"characters": 7586,
"tokens": 3063,
"footnotesCount": 0,
"filePath": "content28.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Создаем маркетинговые возможности",
"characters": 4856,
"tokens": 1972,
"footnotesCount": 0,
"filePath": "content29.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Запускаем новые продукты",
"characters": 5262,
"tokens": 2130,
"footnotesCount": 0,
"filePath": "content30.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Инновация привлекательна, но с точки зрения компании",
"characters": 7096,
"tokens": 2875,
"footnotesCount": 0,
"filePath": "content31.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Новый продукт понятен, привлекателен, но требует изменить поведение потребителя",
"characters": 7364,
"tokens": 2993,
"footnotesCount": 0,
"filePath": "content32.html"
},
{
"chapterNumber": 34,
"chapterTitle": "Создайте собственный миф",
"characters": 4951,
"tokens": 2006,
"footnotesCount": 0,
"filePath": "content33.html"
},
{
"chapterNumber": 35,
"chapterTitle": "Сохраняйте позиционирование, выходя в новые сегменты рынка",
"characters": 5691,
"tokens": 2316,
"footnotesCount": 0,
"filePath": "content34.html"
},
{
"chapterNumber": 36,
"chapterTitle": "Вступаем в борьбу с конкурентами",
"characters": 5128,
"tokens": 2080,
"footnotesCount": 0,
"filePath": "content35.html"
},
{
"chapterNumber": 37,
"chapterTitle": "Глава 9 Готовим ответственного за изменения",
"characters": 8503,
"tokens": 3435,
"footnotesCount": 0,
"filePath": "content36.html"
},
{
"chapterNumber": 38,
"chapterTitle": "Учимся принимать верные решения",
"characters": 8395,
"tokens": 3387,
"footnotesCount": 0,
"filePath": "content37.html"
},
{
"chapterNumber": 39,
"chapterTitle": "Не принимайте пустяковых решений",
"characters": 10870,
"tokens": 4377,
"footnotesCount": 0,
"filePath": "content38.html"
},
{
"chapterNumber": 40,
"chapterTitle": "Решаем верить ли цифрам",
"characters": 5917,
"tokens": 2393,
"footnotesCount": 0,
"filePath": "content39.html"
},
{
"chapterNumber": 41,
"chapterTitle": "Вместо заключения История производителя туалетной бумаги",
"characters": 5092,
"tokens": 2075,
"footnotesCount": 0,
"filePath": "content40.html"
},
{
"chapterNumber": 42,
"chapterTitle": "Избегайте стратегии верблюда",
"characters": 3277,
"tokens": 1338,
"footnotesCount": 0,
"filePath": "content41.html"
},
{
"chapterNumber": 43,
"chapterTitle": "Сноски",
"characters": 79,
"tokens": 53,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,275 @@
{
"book": {
"title": "Управление цепочками поставок и логистикой — простыми словами: Методы и практика планирования, построения, обслуживания, контроля и расширения системы перевозок и снабжения",
"author": "Пол Майерсон",
"totalChapters": 33,
"totalCharacters": 563591,
"totalTokens": 226469
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Content01",
"characters": 0,
"tokens": 22,
"footnotesCount": 0,
"filePath": "Text/content01.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Desc",
"characters": 897,
"tokens": 374,
"footnotesCount": 0,
"filePath": "Text/desc.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Content03",
"characters": 3103,
"tokens": 1263,
"footnotesCount": 0,
"filePath": "Text/content03.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Content04",
"characters": 288,
"tokens": 137,
"footnotesCount": 0,
"filePath": "Text/content04.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Предисловие к русскому изданию",
"characters": 3113,
"tokens": 1276,
"footnotesCount": 0,
"filePath": "Text/content05.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Управление цепочками поставок и логистикой: общая информация",
"characters": 7,
"tokens": 42,
"footnotesCount": 0,
"filePath": "Text/chast1.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Интегрированная цепочка поставок с добавленной ценностью",
"characters": 20935,
"tokens": 8414,
"footnotesCount": 0,
"filePath": "Text/content1.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Подробнее о цепочке поставок",
"characters": 31749,
"tokens": 12728,
"footnotesCount": 0,
"filePath": "Text/content2.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Планирование в рамках цепочки поставок",
"characters": 8,
"tokens": 34,
"footnotesCount": 0,
"filePath": "Text/chast2.html"
},
{
"chapterNumber": 10,
"chapterTitle": "«Полный газ, смотрим в зеркало заднего вида» — таким было прогнозирование раньше",
"characters": 33358,
"tokens": 13393,
"footnotesCount": 0,
"filePath": "Text/content3.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Планирование и контроль запасов",
"characters": 30024,
"tokens": 12039,
"footnotesCount": 0,
"filePath": "Text/content4.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Совокупное и календарное планирование",
"characters": 37184,
"tokens": 14905,
"footnotesCount": 0,
"filePath": "Text/content5.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Функционирование цепочки поставок",
"characters": 9,
"tokens": 33,
"footnotesCount": 0,
"filePath": "Text/chast3.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Снабжение в цепочке поставок",
"characters": 29761,
"tokens": 11933,
"footnotesCount": 0,
"filePath": "Text/content6.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Транспортные системы",
"characters": 48575,
"tokens": 19456,
"footnotesCount": 0,
"filePath": "Text/content7.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Управление складскими операциями",
"characters": 41449,
"tokens": 16609,
"footnotesCount": 0,
"filePath": "Text/content8.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Управление заказами и отношениями с клиентами",
"characters": 16485,
"tokens": 6630,
"footnotesCount": 0,
"filePath": "Text/content9.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Обратная логистика и устойчивое развитие",
"characters": 31764,
"tokens": 12740,
"footnotesCount": 0,
"filePath": "Text/content10.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Операции в глобальных цепях поставок и управление рисками",
"characters": 28157,
"tokens": 11303,
"footnotesCount": 0,
"filePath": "Text/content11.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Интеграция и сотрудничество по цепочкам поставок",
"characters": 8,
"tokens": 39,
"footnotesCount": 0,
"filePath": "Text/chast4.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Партнеры по цепочкам поставок",
"characters": 22428,
"tokens": 9001,
"footnotesCount": 0,
"filePath": "Text/content12.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Интеграция цепочек поставок через системы сотрудничества",
"characters": 22004,
"tokens": 8842,
"footnotesCount": 0,
"filePath": "Text/content13.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Технологии для цепочек поставок",
"characters": 27582,
"tokens": 11063,
"footnotesCount": 0,
"filePath": "Text/content14.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Проектирование сетей цепочек поставок и логистики",
"characters": 7,
"tokens": 38,
"footnotesCount": 0,
"filePath": "Text/chast5.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Выбор места для склада",
"characters": 36189,
"tokens": 14502,
"footnotesCount": 0,
"filePath": "Text/content15.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Решения по зонированию склада",
"characters": 24674,
"tokens": 9899,
"footnotesCount": 0,
"filePath": "Text/content16.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Измерение, контроль и совершенствование цепочек поставок и логистики",
"characters": 8,
"tokens": 47,
"footnotesCount": 0,
"filePath": "Text/chast6.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Показатели и средства измерения",
"characters": 19056,
"tokens": 7653,
"footnotesCount": 0,
"filePath": "Text/content17.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Бережливое и гибкое мышление в цепочках поставок и логистике",
"characters": 33058,
"tokens": 13266,
"footnotesCount": 0,
"filePath": "Text/content18.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Перспективы управления цепочками поставок и логистикой",
"characters": 17545,
"tokens": 7058,
"footnotesCount": 0,
"filePath": "Text/content19.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Section0001",
"characters": 0,
"tokens": 27,
"footnotesCount": 0,
"filePath": "Text/Section0001.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Link",
"characters": 3484,
"tokens": 1409,
"footnotesCount": 0,
"filePath": "Text/link.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Content02",
"characters": 682,
"tokens": 294,
"footnotesCount": 0,
"filePath": "Text/content02.html"
}
]
}

View File

@@ -0,0 +1,395 @@
{
"book": {
"title": "Управляя кризисом. Как выращивать успешные компании",
"author": "Дмитрий Симоненко",
"totalChapters": 48,
"totalCharacters": 369691,
"totalTokens": 149275
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Дмитрий Симоненко Управляя кризисом: Как выращивать успешные компании",
"characters": 5482,
"tokens": 2235,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Зачем покупают бизнес?",
"characters": 5896,
"tokens": 2382,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Глава 1 Зачем и для кого я пишу эту книгу?",
"characters": 7776,
"tokens": 3142,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Чему не научат в бизнес-школах",
"characters": 6528,
"tokens": 2639,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Зачем нужна эта книга?",
"characters": 9835,
"tokens": 3958,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Что с этим делать?",
"characters": 8431,
"tokens": 3395,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Точка опоры предпринимателя",
"characters": 21302,
"tokens": 8546,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Глава 3 Где брать идеи и как превращать их в бизнес?",
"characters": 6323,
"tokens": 2565,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Крутая идея плохое решение",
"characters": 9821,
"tokens": 3955,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Конкурентное преимущество: время и место",
"characters": 7145,
"tokens": 2890,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Глава 4 Как написать бизнес-план на $100 млн?",
"characters": 8442,
"tokens": 3411,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "От кофемолки к роботам",
"characters": 5894,
"tokens": 2382,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Роботы: техзадание и первые клиенты",
"characters": 8068,
"tokens": 3258,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Глава 5 Как нанять и удержать лучших людей",
"characters": 5102,
"tokens": 2073,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Лубянка и французский заговор",
"characters": 8844,
"tokens": 3565,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Почему Ирландия?",
"characters": 6111,
"tokens": 2467,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Женщины и амбиции",
"characters": 7536,
"tokens": 3037,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Итоги: как найти и нанять лучших людей",
"characters": 6837,
"tokens": 2766,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Балу учитель и систематизатор",
"characters": 8741,
"tokens": 3525,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Кто и когда нужен?",
"characters": 6035,
"tokens": 2438,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Итоги: 4 этапа создания команды мечты",
"characters": 5482,
"tokens": 2223,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Глава 7 СКольких вынесет Боливар? / Партнеры и стейкхолдеры",
"characters": 7174,
"tokens": 2909,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Как правильно выбирать партнеров и инвесторов",
"characters": 6502,
"tokens": 2635,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Глава 8 Инвестиции: умные деньги и токсичные инвесторы",
"characters": 8352,
"tokens": 3378,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Ангелы и демоны",
"characters": 5428,
"tokens": 2194,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Бизнес-ангел мошенник: как я привлек деньги в Plesk",
"characters": 7745,
"tokens": 3135,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Венчурные фонды",
"characters": 7702,
"tokens": 3103,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Итоги: глупые и умные деньги",
"characters": 11463,
"tokens": 4613,
"footnotesCount": 0,
"filePath": "content27.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Глава 9 Сколько денег нужно для бизнеса и когда их привлекать?",
"characters": 6073,
"tokens": 2470,
"footnotesCount": 0,
"filePath": "content28.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Квант инвестиций: сколько нужно денег?",
"characters": 7848,
"tokens": 3171,
"footnotesCount": 0,
"filePath": "content29.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Кэшаут: как вынуть деньги и не пустить бизнес под откос?",
"characters": 10032,
"tokens": 4051,
"footnotesCount": 0,
"filePath": "content30.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Глава 10 Кто я такой?",
"characters": 8612,
"tokens": 3469,
"footnotesCount": 0,
"filePath": "content31.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Позитивный взгляд и иллюзии",
"characters": 5460,
"tokens": 2211,
"footnotesCount": 0,
"filePath": "content32.html"
},
{
"chapterNumber": 34,
"chapterTitle": "видов конкурентных преимуществ",
"characters": 5869,
"tokens": 2376,
"footnotesCount": 0,
"filePath": "content33.html"
},
{
"chapterNumber": 35,
"chapterTitle": "Глава 11 Как создать высокотехнологичное производство?",
"characters": 8490,
"tokens": 3434,
"footnotesCount": 0,
"filePath": "content34.html"
},
{
"chapterNumber": 36,
"chapterTitle": "Как это работает?",
"characters": 7398,
"tokens": 2982,
"footnotesCount": 0,
"filePath": "content35.html"
},
{
"chapterNumber": 37,
"chapterTitle": "Незнание есть благословение?",
"characters": 6937,
"tokens": 2802,
"footnotesCount": 0,
"filePath": "content36.html"
},
{
"chapterNumber": 38,
"chapterTitle": "Глава 12 Как выйти на международный уровень (И стоит ли)?",
"characters": 8643,
"tokens": 3496,
"footnotesCount": 0,
"filePath": "content37.html"
},
{
"chapterNumber": 39,
"chapterTitle": "Стратегия развития",
"characters": 8681,
"tokens": 3496,
"footnotesCount": 0,
"filePath": "content38.html"
},
{
"chapterNumber": 40,
"chapterTitle": "Сильные стороны России",
"characters": 7642,
"tokens": 3081,
"footnotesCount": 0,
"filePath": "content39.html"
},
{
"chapterNumber": 41,
"chapterTitle": "Глава 13 Проблема роста?",
"characters": 5809,
"tokens": 2349,
"footnotesCount": 0,
"filePath": "content40.html"
},
{
"chapterNumber": 42,
"chapterTitle": "Кризис № 1. Как стать предпринимателем",
"characters": 6608,
"tokens": 2675,
"footnotesCount": 0,
"filePath": "content41.html"
},
{
"chapterNumber": 43,
"chapterTitle": "Кризис № 2. Проблема роста",
"characters": 6077,
"tokens": 2457,
"footnotesCount": 0,
"filePath": "content42.html"
},
{
"chapterNumber": 44,
"chapterTitle": "Нужно ли бизнесмену МВА?",
"characters": 5935,
"tokens": 2400,
"footnotesCount": 0,
"filePath": "content43.html"
},
{
"chapterNumber": 45,
"chapterTitle": "Глава 14 Как продать компанию?",
"characters": 6882,
"tokens": 2781,
"footnotesCount": 0,
"filePath": "content44.html"
},
{
"chapterNumber": 46,
"chapterTitle": "Зачем покупать бизнес?",
"characters": 5825,
"tokens": 2355,
"footnotesCount": 0,
"filePath": "content45.html"
},
{
"chapterNumber": 47,
"chapterTitle": "Как подготовить бизнес к продаже?",
"characters": 7628,
"tokens": 3081,
"footnotesCount": 0,
"filePath": "content46.html"
},
{
"chapterNumber": 48,
"chapterTitle": "Заключение",
"characters": 13245,
"tokens": 5319,
"footnotesCount": 0,
"filePath": "content47.html"
}
]
}

View File

@@ -0,0 +1,235 @@
{
"book": {
"title": "Фиолетовая корова. Сделайте свой бизнес выдающимся!",
"author": "Сет Годин",
"totalChapters": 28,
"totalCharacters": 208945,
"totalTokens": 84453
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Сет Годин Фиолетовая корова. Сделайте свой бизнес выдающимся!",
"characters": 5342,
"tokens": 2176,
"footnotesCount": 0,
"filePath": "content0.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Величайшая идея нарезанного хлеба",
"characters": 5170,
"tokens": 2097,
"footnotesCount": 0,
"filePath": "content1.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Почему вам нужна Фиолетовая корова",
"characters": 8074,
"tokens": 3258,
"footnotesCount": 0,
"filePath": "content2.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Смерть телевизионнопромышленного комплекса",
"characters": 7067,
"tokens": 2858,
"footnotesCount": 0,
"filePath": "content3.html"
},
{
"chapterNumber": 5,
"chapterTitle": "ПРЕДСТАВЛЯЕМ НОВОЕ ИМЯ KPMG В КОНСАЛТИНГЕ И НОВУЮ ЭРУ В УПРАВЛЕНИИ",
"characters": 5999,
"tokens": 2441,
"footnotesCount": 0,
"filePath": "content4.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Пример: что должен делать Tide?",
"characters": 6163,
"tokens": 2493,
"footnotesCount": 0,
"filePath": "content5.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Проникновение на рынок",
"characters": 5564,
"tokens": 2249,
"footnotesCount": 0,
"filePath": "content6.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Идеи, которые распространяются и побеждают",
"characters": 5489,
"tokens": 2227,
"footnotesCount": 0,
"filePath": "content7.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Кто слушает?",
"characters": 5697,
"tokens": 2298,
"footnotesCount": 0,
"filePath": "content8.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Кого это волнует?",
"characters": 7680,
"tokens": 3094,
"footnotesCount": 0,
"filePath": "content9.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Проблема с Коровой…",
"characters": 11749,
"tokens": 4723,
"footnotesCount": 0,
"filePath": "content10.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Прогнозы, доходы и Фиолетовая корова",
"characters": 10900,
"tokens": 4391,
"footnotesCount": 0,
"filePath": "content11.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Анализ эффективности на массовом рынке",
"characters": 7115,
"tokens": 2878,
"footnotesCount": 0,
"filePath": "content12.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Преимущества Фиолетовой коровы",
"characters": 5292,
"tokens": 2145,
"footnotesCount": 0,
"filePath": "content13.html"
},
{
"chapterNumber": 15,
"chapterTitle": "Антоним слова «выдающийся»",
"characters": 6267,
"tokens": 2533,
"footnotesCount": 0,
"filePath": "content14.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Семьдесят два альбома группы Pearl Jam",
"characters": 5539,
"tokens": 2247,
"footnotesCount": 0,
"filePath": "content15.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Пример: почтовая служба США",
"characters": 5268,
"tokens": 2134,
"footnotesCount": 0,
"filePath": "content16.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Пример: как компания Dutch Boy перевернула весь лакокрасочный бизнес",
"characters": 5751,
"tokens": 2344,
"footnotesCount": 0,
"filePath": "content17.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Продавайте то, что покупают (и о чем говорят)",
"characters": 6557,
"tokens": 2657,
"footnotesCount": 0,
"filePath": "content18.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Магический цикл Фиолетовой коровы",
"characters": 6625,
"tokens": 2680,
"footnotesCount": 0,
"filePath": "content19.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Что сегодня означает выражение «заниматься маркетингом»?",
"characters": 10495,
"tokens": 4237,
"footnotesCount": 0,
"filePath": "content20.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Нужно ли быть возмутительным и скандальным, чтобы стать выдающимся?",
"characters": 6783,
"tokens": 2756,
"footnotesCount": 0,
"filePath": "content21.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Что должны делать в Hallmark.com?",
"characters": 6292,
"tokens": 2546,
"footnotesCount": 0,
"filePath": "content22.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Пример: Трейси, специалист по печати и рекламе",
"characters": 5558,
"tokens": 2258,
"footnotesCount": 0,
"filePath": "content23.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Обязательно ли «вкладывать душу»?",
"characters": 9550,
"tokens": 3850,
"footnotesCount": 0,
"filePath": "content24.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Реальные факты",
"characters": 27628,
"tokens": 11073,
"footnotesCount": 0,
"filePath": "content25.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Соль совсем не скучный продукт, или Еще восемь способов заставить работать Фиолетовую корову",
"characters": 4731,
"tokens": 1946,
"footnotesCount": 0,
"filePath": "content26.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Примечания",
"characters": 4600,
"tokens": 1864,
"footnotesCount": 0,
"filePath": "contentnotes0.html"
}
]
}

View File

@@ -0,0 +1,579 @@
{
"book": {
"title": "Чему я научился, потеряв миллион долларов",
"author": "Джим Пол, Брендан Мойнихан",
"totalChapters": 71,
"totalCharacters": 346154,
"totalTokens": 143210
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "Предисловие",
"characters": 3558,
"tokens": 1445,
"footnotesCount": 0,
"filePath": "index_split_000.html"
},
{
"chapterNumber": 2,
"chapterTitle": "Предисловие к изданию Columbia Business School publishing",
"characters": 3378,
"tokens": 1391,
"footnotesCount": 0,
"filePath": "index_split_001.html"
},
{
"chapterNumber": 3,
"chapterTitle": "Зачем писать книгу о проигрыше?",
"characters": 9846,
"tokens": 3968,
"footnotesCount": 0,
"filePath": "index_split_002.html"
},
{
"chapterNumber": 4,
"chapterTitle": "Записки трейдера",
"characters": 5989,
"tokens": 2419,
"footnotesCount": 1,
"filePath": "index_split_003.html"
},
{
"chapterNumber": 5,
"chapterTitle": "Голодное детство",
"characters": 11269,
"tokens": 4531,
"footnotesCount": 4,
"filePath": "index_split_004.html"
},
{
"chapterNumber": 6,
"chapterTitle": "Джин — это напиток или игра?",
"characters": 41227,
"tokens": 16519,
"footnotesCount": 5,
"filePath": "index_split_005.html"
},
{
"chapterNumber": 7,
"chapterTitle": "Как работать на бирже",
"characters": 15896,
"tokens": 6384,
"footnotesCount": 0,
"filePath": "index_split_006.html"
},
{
"chapterNumber": 8,
"chapterTitle": "Фиаско арабского скакуна",
"characters": 36627,
"tokens": 14677,
"footnotesCount": 11,
"filePath": "index_split_007.html"
},
{
"chapterNumber": 9,
"chapterTitle": "Как зарабатывают профессионалы?",
"characters": 9576,
"tokens": 3860,
"footnotesCount": 1,
"filePath": "index_split_008.html"
},
{
"chapterNumber": 10,
"chapterTitle": "Плевать на традиции?",
"characters": 9541,
"tokens": 3842,
"footnotesCount": 3,
"filePath": "index_split_009.html"
},
{
"chapterNumber": 11,
"chapterTitle": "Как потеря на рынке становится внутренней",
"characters": 25321,
"tokens": 10162,
"footnotesCount": 3,
"filePath": "index_split_010.html"
},
{
"chapterNumber": 12,
"chapterTitle": "Как поведенческие характеристики определяют суть деятельности",
"characters": 30941,
"tokens": 12418,
"footnotesCount": 4,
"filePath": "index_split_011.html"
},
{
"chapterNumber": 13,
"chapterTitle": "Общепринятый взгляд на поведение толпы",
"characters": 29415,
"tokens": 11799,
"footnotesCount": 8,
"filePath": "index_split_012.html"
},
{
"chapterNumber": 14,
"chapterTitle": "Как действовать в условиях неопределенности",
"characters": 63379,
"tokens": 25386,
"footnotesCount": 9,
"filePath": "index_split_013.html"
},
{
"chapterNumber": 15,
"chapterTitle": "А что если...",
"characters": 13029,
"tokens": 5234,
"footnotesCount": 2,
"filePath": "index_split_014.html"
},
{
"chapterNumber": 16,
"chapterTitle": "Постскриптум",
"characters": 19609,
"tokens": 7865,
"footnotesCount": 2,
"filePath": "index_split_015.html"
},
{
"chapterNumber": 17,
"chapterTitle": "Приложение",
"characters": 3933,
"tokens": 1595,
"footnotesCount": 0,
"filePath": "index_split_016.html"
},
{
"chapterNumber": 18,
"chapterTitle": "Примечания",
"characters": 6139,
"tokens": 2501,
"footnotesCount": 1,
"filePath": "index_split_017.html"
},
{
"chapterNumber": 19,
"chapterTitle": "Index Split 018",
"characters": 111,
"tokens": 112,
"footnotesCount": 1,
"filePath": "index_split_018.html"
},
{
"chapterNumber": 20,
"chapterTitle": "Index Split 019",
"characters": 88,
"tokens": 94,
"footnotesCount": 1,
"filePath": "index_split_019.html"
},
{
"chapterNumber": 21,
"chapterTitle": "Index Split 020",
"characters": 57,
"tokens": 68,
"footnotesCount": 1,
"filePath": "index_split_020.html"
},
{
"chapterNumber": 22,
"chapterTitle": "Index Split 021",
"characters": 59,
"tokens": 70,
"footnotesCount": 1,
"filePath": "index_split_021.html"
},
{
"chapterNumber": 23,
"chapterTitle": "Index Split 022",
"characters": 178,
"tokens": 166,
"footnotesCount": 1,
"filePath": "index_split_022.html"
},
{
"chapterNumber": 24,
"chapterTitle": "Index Split 023",
"characters": 90,
"tokens": 96,
"footnotesCount": 1,
"filePath": "index_split_023.html"
},
{
"chapterNumber": 25,
"chapterTitle": "Index Split 024",
"characters": 184,
"tokens": 170,
"footnotesCount": 1,
"filePath": "index_split_024.html"
},
{
"chapterNumber": 26,
"chapterTitle": "Index Split 025",
"characters": 93,
"tokens": 98,
"footnotesCount": 1,
"filePath": "index_split_025.html"
},
{
"chapterNumber": 27,
"chapterTitle": "Index Split 026",
"characters": 124,
"tokens": 122,
"footnotesCount": 1,
"filePath": "index_split_026.html"
},
{
"chapterNumber": 28,
"chapterTitle": "Index Split 027",
"characters": 100,
"tokens": 104,
"footnotesCount": 1,
"filePath": "index_split_027.html"
},
{
"chapterNumber": 29,
"chapterTitle": "Index Split 028",
"characters": 147,
"tokens": 140,
"footnotesCount": 1,
"filePath": "index_split_028.html"
},
{
"chapterNumber": 30,
"chapterTitle": "Index Split 029",
"characters": 175,
"tokens": 164,
"footnotesCount": 1,
"filePath": "index_split_029.html"
},
{
"chapterNumber": 31,
"chapterTitle": "Index Split 030",
"characters": 92,
"tokens": 96,
"footnotesCount": 1,
"filePath": "index_split_030.html"
},
{
"chapterNumber": 32,
"chapterTitle": "Index Split 031",
"characters": 92,
"tokens": 96,
"footnotesCount": 1,
"filePath": "index_split_031.html"
},
{
"chapterNumber": 33,
"chapterTitle": "Index Split 032",
"characters": 220,
"tokens": 200,
"footnotesCount": 1,
"filePath": "index_split_032.html"
},
{
"chapterNumber": 34,
"chapterTitle": "Index Split 033",
"characters": 65,
"tokens": 76,
"footnotesCount": 1,
"filePath": "index_split_033.html"
},
{
"chapterNumber": 35,
"chapterTitle": "Index Split 034",
"characters": 85,
"tokens": 92,
"footnotesCount": 1,
"filePath": "index_split_034.html"
},
{
"chapterNumber": 36,
"chapterTitle": "Index Split 035",
"characters": 154,
"tokens": 146,
"footnotesCount": 1,
"filePath": "index_split_035.html"
},
{
"chapterNumber": 37,
"chapterTitle": "Index Split 036",
"characters": 137,
"tokens": 132,
"footnotesCount": 1,
"filePath": "index_split_036.html"
},
{
"chapterNumber": 38,
"chapterTitle": "Index Split 037",
"characters": 57,
"tokens": 68,
"footnotesCount": 1,
"filePath": "index_split_037.html"
},
{
"chapterNumber": 39,
"chapterTitle": "Index Split 038",
"characters": 158,
"tokens": 150,
"footnotesCount": 1,
"filePath": "index_split_038.html"
},
{
"chapterNumber": 40,
"chapterTitle": "Index Split 039",
"characters": 111,
"tokens": 112,
"footnotesCount": 1,
"filePath": "index_split_039.html"
},
{
"chapterNumber": 41,
"chapterTitle": "Index Split 040",
"characters": 94,
"tokens": 98,
"footnotesCount": 1,
"filePath": "index_split_040.html"
},
{
"chapterNumber": 42,
"chapterTitle": "Index Split 041",
"characters": 94,
"tokens": 98,
"footnotesCount": 1,
"filePath": "index_split_041.html"
},
{
"chapterNumber": 43,
"chapterTitle": "Index Split 042",
"characters": 201,
"tokens": 184,
"footnotesCount": 1,
"filePath": "index_split_042.html"
},
{
"chapterNumber": 44,
"chapterTitle": "Index Split 043",
"characters": 213,
"tokens": 194,
"footnotesCount": 1,
"filePath": "index_split_043.html"
},
{
"chapterNumber": 45,
"chapterTitle": "Index Split 044",
"characters": 227,
"tokens": 204,
"footnotesCount": 1,
"filePath": "index_split_044.html"
},
{
"chapterNumber": 46,
"chapterTitle": "Index Split 045",
"characters": 55,
"tokens": 68,
"footnotesCount": 1,
"filePath": "index_split_045.html"
},
{
"chapterNumber": 47,
"chapterTitle": "Index Split 046",
"characters": 170,
"tokens": 160,
"footnotesCount": 1,
"filePath": "index_split_046.html"
},
{
"chapterNumber": 48,
"chapterTitle": "Index Split 047",
"characters": 143,
"tokens": 138,
"footnotesCount": 1,
"filePath": "index_split_047.html"
},
{
"chapterNumber": 49,
"chapterTitle": "Index Split 048",
"characters": 149,
"tokens": 142,
"footnotesCount": 1,
"filePath": "index_split_048.html"
},
{
"chapterNumber": 50,
"chapterTitle": "Index Split 049",
"characters": 116,
"tokens": 116,
"footnotesCount": 1,
"filePath": "index_split_049.html"
},
{
"chapterNumber": 51,
"chapterTitle": "Index Split 050",
"characters": 137,
"tokens": 132,
"footnotesCount": 1,
"filePath": "index_split_050.html"
},
{
"chapterNumber": 52,
"chapterTitle": "Index Split 051",
"characters": 136,
"tokens": 132,
"footnotesCount": 1,
"filePath": "index_split_051.html"
},
{
"chapterNumber": 53,
"chapterTitle": "Index Split 052",
"characters": 118,
"tokens": 118,
"footnotesCount": 1,
"filePath": "index_split_052.html"
},
{
"chapterNumber": 54,
"chapterTitle": "Index Split 053",
"characters": 87,
"tokens": 92,
"footnotesCount": 1,
"filePath": "index_split_053.html"
},
{
"chapterNumber": 55,
"chapterTitle": "Index Split 054",
"characters": 78,
"tokens": 86,
"footnotesCount": 1,
"filePath": "index_split_054.html"
},
{
"chapterNumber": 56,
"chapterTitle": "Index Split 055",
"characters": 127,
"tokens": 124,
"footnotesCount": 1,
"filePath": "index_split_055.html"
},
{
"chapterNumber": 57,
"chapterTitle": "Index Split 056",
"characters": 189,
"tokens": 174,
"footnotesCount": 1,
"filePath": "index_split_056.html"
},
{
"chapterNumber": 58,
"chapterTitle": "Index Split 057",
"characters": 72,
"tokens": 80,
"footnotesCount": 1,
"filePath": "index_split_057.html"
},
{
"chapterNumber": 59,
"chapterTitle": "Index Split 058",
"characters": 415,
"tokens": 356,
"footnotesCount": 1,
"filePath": "index_split_058.html"
},
{
"chapterNumber": 60,
"chapterTitle": "Index Split 059",
"characters": 182,
"tokens": 168,
"footnotesCount": 1,
"filePath": "index_split_059.html"
},
{
"chapterNumber": 61,
"chapterTitle": "Index Split 060",
"characters": 195,
"tokens": 180,
"footnotesCount": 1,
"filePath": "index_split_060.html"
},
{
"chapterNumber": 62,
"chapterTitle": "Index Split 061",
"characters": 264,
"tokens": 234,
"footnotesCount": 1,
"filePath": "index_split_061.html"
},
{
"chapterNumber": 63,
"chapterTitle": "Index Split 062",
"characters": 207,
"tokens": 188,
"footnotesCount": 1,
"filePath": "index_split_062.html"
},
{
"chapterNumber": 64,
"chapterTitle": "Index Split 063",
"characters": 235,
"tokens": 212,
"footnotesCount": 1,
"filePath": "index_split_063.html"
},
{
"chapterNumber": 65,
"chapterTitle": "Index Split 064",
"characters": 266,
"tokens": 236,
"footnotesCount": 1,
"filePath": "index_split_064.html"
},
{
"chapterNumber": 66,
"chapterTitle": "Index Split 065",
"characters": 80,
"tokens": 88,
"footnotesCount": 1,
"filePath": "index_split_065.html"
},
{
"chapterNumber": 67,
"chapterTitle": "Index Split 066",
"characters": 137,
"tokens": 132,
"footnotesCount": 1,
"filePath": "index_split_066.html"
},
{
"chapterNumber": 68,
"chapterTitle": "Index Split 067",
"characters": 103,
"tokens": 106,
"footnotesCount": 1,
"filePath": "index_split_067.html"
},
{
"chapterNumber": 69,
"chapterTitle": "Index Split 068",
"characters": 91,
"tokens": 96,
"footnotesCount": 1,
"filePath": "index_split_068.html"
},
{
"chapterNumber": 70,
"chapterTitle": "Index Split 069",
"characters": 168,
"tokens": 158,
"footnotesCount": 1,
"filePath": "index_split_069.html"
},
{
"chapterNumber": 71,
"chapterTitle": "Index Split 070",
"characters": 155,
"tokens": 148,
"footnotesCount": 1,
"filePath": "index_split_070.html"
}
]
}

View File

@@ -0,0 +1,547 @@
{
"book": {
"title": "Шесть гениев команды",
"author": "Патрик Ленсиони",
"totalChapters": 67,
"totalCharacters": 211676,
"totalTokens": 86019
},
"chapters": [
{
"chapterNumber": 1,
"chapterTitle": "A BETTER WAY TO UNDERSTAND YOUR GIFTS, YOUR FRUSTRATIONS, AND YOUR TEAM",
"characters": 60,
"tokens": 66,
"footnotesCount": 0,
"filePath": "t1.xhtml"
},
{
"chapterNumber": 2,
"chapterTitle": "КАК СПОСОБНОСТИ КАЖДОГО УСИЛИВАЮТ ОБЩИЙ РЕЗУЛЬТАТ",
"characters": 37,
"tokens": 47,
"footnotesCount": 0,
"filePath": "t2.xhtml"
},
{
"chapterNumber": 3,
"chapterTitle": "Информацияот издательства",
"characters": 1250,
"tokens": 525,
"footnotesCount": 0,
"filePath": "inf.xhtml"
},
{
"chapterNumber": 4,
"chapterTitle": "Posv",
"characters": 115,
"tokens": 63,
"footnotesCount": 0,
"filePath": "posv.xhtml"
},
{
"chapterNumber": 5,
"chapterTitle": "ВВЕДЕНИЕ",
"characters": 2935,
"tokens": 1191,
"footnotesCount": 0,
"filePath": "vv.xhtml"
},
{
"chapterNumber": 6,
"chapterTitle": "ПРИТЧА",
"characters": 0,
"tokens": 16,
"footnotesCount": 0,
"filePath": "C1.xhtml"
},
{
"chapterNumber": 7,
"chapterTitle": "J. O. B.",
"characters": 1179,
"tokens": 488,
"footnotesCount": 0,
"filePath": "g1.xhtml"
},
{
"chapterNumber": 8,
"chapterTitle": "РАБОТА",
"characters": 1411,
"tokens": 580,
"footnotesCount": 0,
"filePath": "g2.xhtml"
},
{
"chapterNumber": 9,
"chapterTitle": "ГАЗОНОКОСИЛЬЩИК",
"characters": 1272,
"tokens": 528,
"footnotesCount": 0,
"filePath": "g3.xhtml"
},
{
"chapterNumber": 10,
"chapterTitle": "G4",
"characters": 2683,
"tokens": 1087,
"footnotesCount": 0,
"filePath": "g4.xhtml"
},
{
"chapterNumber": 11,
"chapterTitle": "НЕОПРЕДЕЛЕННОСТЬ",
"characters": 2164,
"tokens": 885,
"footnotesCount": 0,
"filePath": "g5.xhtml"
},
{
"chapterNumber": 12,
"chapterTitle": "НОВЫЙ ФАЛЬСТАРТ",
"characters": 1124,
"tokens": 469,
"footnotesCount": 0,
"filePath": "g6.xhtml"
},
{
"chapterNumber": 13,
"chapterTitle": "ВОСКРЕСНАЯ ТОСКА",
"characters": 979,
"tokens": 411,
"footnotesCount": 0,
"filePath": "g7.xhtml"
},
{
"chapterNumber": 14,
"chapterTitle": "ОТЧАЯНИЕ",
"characters": 2123,
"tokens": 866,
"footnotesCount": 0,
"filePath": "g8.xhtml"
},
{
"chapterNumber": 15,
"chapterTitle": "БЛАЖЕННОЕ НЕВЕДЕНИЕ",
"characters": 2080,
"tokens": 853,
"footnotesCount": 0,
"filePath": "g9.xhtml"
},
{
"chapterNumber": 16,
"chapterTitle": "МОНТАЖ",
"characters": 770,
"tokens": 325,
"footnotesCount": 1,
"filePath": "g10.xhtml"
},
{
"chapterNumber": 17,
"chapterTitle": "ПОЗДРАВЛЯЕМ, У ВАС ВСЕ ПЛОХО",
"characters": 5390,
"tokens": 2182,
"footnotesCount": 0,
"filePath": "g11.xhtml"
},
{
"chapterNumber": 18,
"chapterTitle": "РЕКРУТЕР",
"characters": 1212,
"tokens": 502,
"footnotesCount": 0,
"filePath": "g12.xhtml"
},
{
"chapterNumber": 19,
"chapterTitle": "МОНТАЖ-2",
"characters": 1125,
"tokens": 468,
"footnotesCount": 0,
"filePath": "g13.xhtml"
},
{
"chapterNumber": 20,
"chapterTitle": "СЛИЯНИЕ",
"characters": 2243,
"tokens": 914,
"footnotesCount": 0,
"filePath": "g14.xhtml"
},
{
"chapterNumber": 21,
"chapterTitle": "ПРИЗНАНИЕ",
"characters": 3666,
"tokens": 1484,
"footnotesCount": 0,
"filePath": "g15.xhtml"
},
{
"chapterNumber": 22,
"chapterTitle": "ПЕРЕДЫШКА",
"characters": 4276,
"tokens": 1728,
"footnotesCount": 0,
"filePath": "g16.xhtml"
},
{
"chapterNumber": 23,
"chapterTitle": "СВАРЛИВОСТЬ",
"characters": 1678,
"tokens": 690,
"footnotesCount": 0,
"filePath": "g17.xhtml"
},
{
"chapterNumber": 24,
"chapterTitle": "ВОПРОС",
"characters": 3722,
"tokens": 1505,
"footnotesCount": 0,
"filePath": "g18.xhtml"
},
{
"chapterNumber": 25,
"chapterTitle": "В ТУМАНЕ",
"characters": 3012,
"tokens": 1222,
"footnotesCount": 0,
"filePath": "g19.xhtml"
},
{
"chapterNumber": 26,
"chapterTitle": "ДОПРОС С ПРИСТРАСТИЕМ",
"characters": 1718,
"tokens": 710,
"footnotesCount": 0,
"filePath": "g20.xhtml"
},
{
"chapterNumber": 27,
"chapterTitle": "ФРАГМЕНТАРНО",
"characters": 3117,
"tokens": 1265,
"footnotesCount": 0,
"filePath": "g21.xhtml"
},
{
"chapterNumber": 28,
"chapterTitle": "ВЕСЬ АССОРТИМЕНТ",
"characters": 4278,
"tokens": 1732,
"footnotesCount": 0,
"filePath": "g22.xhtml"
},
{
"chapterNumber": 29,
"chapterTitle": "УТОЧНЕНИЕ",
"characters": 2313,
"tokens": 943,
"footnotesCount": 0,
"filePath": "g23.xhtml"
},
{
"chapterNumber": 30,
"chapterTitle": "ПРОРЫВ",
"characters": 3125,
"tokens": 1267,
"footnotesCount": 0,
"filePath": "g24.xhtml"
},
{
"chapterNumber": 31,
"chapterTitle": "ТРИГГЕР",
"characters": 2243,
"tokens": 914,
"footnotesCount": 0,
"filePath": "g25.xhtml"
},
{
"chapterNumber": 32,
"chapterTitle": "ПОДГОНЯЛЬЩИК",
"characters": 2231,
"tokens": 911,
"footnotesCount": 0,
"filePath": "g26.xhtml"
},
{
"chapterNumber": 33,
"chapterTitle": "СПЕЦИФИКА",
"characters": 1759,
"tokens": 721,
"footnotesCount": 0,
"filePath": "g27.xhtml"
},
{
"chapterNumber": 34,
"chapterTitle": "ПОРЯДОК ВЕЩЕЙ",
"characters": 9282,
"tokens": 3732,
"footnotesCount": 0,
"filePath": "g28.xhtml"
},
{
"chapterNumber": 35,
"chapterTitle": "ПОДВОДИМ ИТОГИ",
"characters": 2178,
"tokens": 891,
"footnotesCount": 0,
"filePath": "g29.xhtml"
},
{
"chapterNumber": 36,
"chapterTitle": "ВЫСТУПЛЕНИЕ НА БИС",
"characters": 4278,
"tokens": 1733,
"footnotesCount": 0,
"filePath": "g30.xhtml"
},
{
"chapterNumber": 37,
"chapterTitle": "НА УСКОРЕННОЙ ПЕРЕМОТКЕ",
"characters": 6982,
"tokens": 2816,
"footnotesCount": 0,
"filePath": "g31.xhtml"
},
{
"chapterNumber": 38,
"chapterTitle": "КОНТЕКСТ",
"characters": 5648,
"tokens": 2277,
"footnotesCount": 0,
"filePath": "g32.xhtml"
},
{
"chapterNumber": 39,
"chapterTitle": "ИСТИНА ГДЕ-ТО РЯДОМ",
"characters": 5244,
"tokens": 2119,
"footnotesCount": 0,
"filePath": "g33.xhtml"
},
{
"chapterNumber": 40,
"chapterTitle": "ВНЕДРЕНИЕ В ЖИЗНЬ",
"characters": 4438,
"tokens": 1796,
"footnotesCount": 0,
"filePath": "g34.xhtml"
},
{
"chapterNumber": 41,
"chapterTitle": "КОМИТЕТ",
"characters": 5893,
"tokens": 2374,
"footnotesCount": 0,
"filePath": "g35.xhtml"
},
{
"chapterNumber": 42,
"chapterTitle": "ЦЕРКОВНЫЕ ГЕНИИ",
"characters": 4898,
"tokens": 1980,
"footnotesCount": 0,
"filePath": "g36.xhtml"
},
{
"chapterNumber": 43,
"chapterTitle": "РЕАЛЬНОСТЬ",
"characters": 3544,
"tokens": 1436,
"footnotesCount": 0,
"filePath": "g37.xhtml"
},
{
"chapterNumber": 44,
"chapterTitle": "ДОПРОС",
"characters": 1775,
"tokens": 727,
"footnotesCount": 0,
"filePath": "g38.xhtml"
},
{
"chapterNumber": 45,
"chapterTitle": "ВИРУСНЫЙ ОХВАТ",
"characters": 1574,
"tokens": 649,
"footnotesCount": 0,
"filePath": "g39.xhtml"
},
{
"chapterNumber": 46,
"chapterTitle": "СПАСЕНИЕ",
"characters": 5584,
"tokens": 2251,
"footnotesCount": 0,
"filePath": "g40.xhtml"
},
{
"chapterNumber": 47,
"chapterTitle": "ДИАГНОЗ",
"characters": 5379,
"tokens": 2168,
"footnotesCount": 0,
"filePath": "g41.xhtml"
},
{
"chapterNumber": 48,
"chapterTitle": "ПРОВЕРКА НА ДЕЛЕ",
"characters": 1641,
"tokens": 677,
"footnotesCount": 0,
"filePath": "g42.xhtml"
},
{
"chapterNumber": 49,
"chapterTitle": "ВСТРЕЧА С КЛИЕНТАМИ",
"characters": 7038,
"tokens": 2837,
"footnotesCount": 0,
"filePath": "g43.xhtml"
},
{
"chapterNumber": 50,
"chapterTitle": "ЭНТУЗИАЗМ",
"characters": 2730,
"tokens": 1110,
"footnotesCount": 0,
"filePath": "g44.xhtml"
},
{
"chapterNumber": 51,
"chapterTitle": "ВСТРЕЧА С КОЛЛЕКТИВОМ",
"characters": 6412,
"tokens": 2587,
"footnotesCount": 0,
"filePath": "g45.xhtml"
},
{
"chapterNumber": 52,
"chapterTitle": "СКАЧОК ВПЕРЕД",
"characters": 2436,
"tokens": 994,
"footnotesCount": 0,
"filePath": "g46.xhtml"
},
{
"chapterNumber": 53,
"chapterTitle": "ЭПИЛОГ",
"characters": 1900,
"tokens": 777,
"footnotesCount": 0,
"filePath": "g47.xhtml"
},
{
"chapterNumber": 54,
"chapterTitle": "СХЕМА В ДЕЙСТВИИ",
"characters": 0,
"tokens": 20,
"footnotesCount": 0,
"filePath": "C2.xhtml"
},
{
"chapterNumber": 55,
"chapterTitle": "ЧТО ТАКОЕ РАБОТА?",
"characters": 3891,
"tokens": 1577,
"footnotesCount": 0,
"filePath": "g48.xhtml"
},
{
"chapterNumber": 56,
"chapterTitle": "МОДЕЛЬ И ТИПИРОВАНИЕ",
"characters": 13271,
"tokens": 5331,
"footnotesCount": 0,
"filePath": "g49.xhtml"
},
{
"chapterNumber": 57,
"chapterTitle": "КАРТА КОМАНДНОЙ РАБОТЫ",
"characters": 23493,
"tokens": 9420,
"footnotesCount": 0,
"filePath": "g50.xhtml"
},
{
"chapterNumber": 58,
"chapterTitle": "ТИПЫ ТАЛАНТОВ И ЗДОРОВЬЕ ОРГАНИЗАЦИИ",
"characters": 2927,
"tokens": 1199,
"footnotesCount": 0,
"filePath": "g51.xhtml"
},
{
"chapterNumber": 59,
"chapterTitle": "МОИ НАДЕЖДЫ НА БУДУЩЕЕ",
"characters": 6765,
"tokens": 2729,
"footnotesCount": 0,
"filePath": "g52.xhtml"
},
{
"chapterNumber": 60,
"chapterTitle": "БЛАГОДАРНОСТИ",
"characters": 1364,
"tokens": 564,
"footnotesCount": 0,
"filePath": "th.xhtml"
},
{
"chapterNumber": 61,
"chapterTitle": "ОБ АВТОРЕ",
"characters": 1499,
"tokens": 619,
"footnotesCount": 0,
"filePath": "about.xhtml"
},
{
"chapterNumber": 62,
"chapterTitle": "ПРИМЕЧАНИЯ",
"characters": 49,
"tokens": 59,
"footnotesCount": 2,
"filePath": "links.xhtml"
},
{
"chapterNumber": 63,
"chapterTitle": "Пять пороков команды",
"characters": 536,
"tokens": 236,
"footnotesCount": 0,
"filePath": "r1.xhtml"
},
{
"chapterNumber": 64,
"chapterTitle": "Пять пороков команды",
"characters": 653,
"tokens": 283,
"footnotesCount": 0,
"filePath": "r2.xhtml"
},
{
"chapterNumber": 65,
"chapterTitle": "Сердце компании",
"characters": 579,
"tokens": 251,
"footnotesCount": 0,
"filePath": "r3.xhtml"
},
{
"chapterNumber": 66,
"chapterTitle": "МИФ Бизнес",
"characters": 161,
"tokens": 83,
"footnotesCount": 0,
"filePath": "biz.xhtml"
},
{
"chapterNumber": 67,
"chapterTitle": "НАД КНИГОЙ РАБОТАЛИ",
"characters": 344,
"tokens": 159,
"footnotesCount": 0,
"filePath": "end.xhtml"
}
]
}

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More