refactor(stage-2): extract hardcoded curriculum datasets into data/seeds/*.json (-3100 lines)
This commit is contained in:
+26
-1836
File diff suppressed because it is too large
Load Diff
+24
-912
@@ -17,923 +17,35 @@ import random
|
||||
from typing import Dict, Any, List, Optional
|
||||
from datetime import datetime
|
||||
|
||||
# Curated High-Yield Murphy Units (15 Units covering A1-B2 core grammar)
|
||||
CURATED_MURPHY_UNITS: List[Dict[str, Any]] = [
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 1: Present Continuous (I am doing)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 1,
|
||||
"level": "A1-A2",
|
||||
"category": "Present Tenses",
|
||||
"title": "Present Continuous (I am doing)",
|
||||
"subtitle": "Действие в процессе прямо сейчас или временная ситуация",
|
||||
"golden_formula": "S + am / is / are + V-ing\n(I am working / He is sleeping / They are playing)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Действие происходит в момент речи (Now / at the moment)",
|
||||
"example_a": "Please be quiet. I am trying to concentrate.",
|
||||
"trans_a": "Пожалуйста, потише. Я пытаюсь сосредоточиться (прямо сейчас).",
|
||||
"situation_b": "Временная ситуация в текущий период жизни (Around now / temporarily)",
|
||||
"example_b": "She is studying computer science at university this year.",
|
||||
"trans_b": "В этом году она изучает информатику в университете (временный процесс).",
|
||||
"key_difference": "Present Continuous всегда показывает незавершённое действие — мы находимся внутри процесса."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь золотую формулу маркером. Напишите от руки 2-3 предложения о том, что происходит прямо сейчас вокруг вас или какой временный проект вы делаете на этой неделе (например: 'I am reading an English book right now').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Listen to those birds! They ___ so beautifully.",
|
||||
"target": "are singing",
|
||||
"clue": "поют (прямо сейчас)",
|
||||
"options": ["are singing", "sing", "is singing", "sang"],
|
||||
"explanation": "Слово-маркер 'Listen!' указывает, что действие происходит прямо сейчас, подлежащее 'They' требует форму 'are singing'."
|
||||
},
|
||||
{
|
||||
"sentence": "Why ___ you wearing a heavy coat in July?",
|
||||
"target": "are",
|
||||
"clue": "почему ты одет (в этот момент)",
|
||||
"options": ["are", "do", "have", "did"],
|
||||
"explanation": "Перед формой глагола с окончанием -ing ('wearing') в вопросе Present Continuous ставится вспомогательный глагол 'are'."
|
||||
},
|
||||
{
|
||||
"sentence": "The water is boiling, so please ___ the stove.",
|
||||
"target": "turn off",
|
||||
"clue": "выключи (действие-команда)",
|
||||
"options": ["turn off", "turning off", "is turning", "turned"],
|
||||
"explanation": "Вода кипит прямо сейчас (is boiling), поэтому обращение-просьба к собеседнику строится в повелительном наклонении: 'turn off'."
|
||||
},
|
||||
{
|
||||
"sentence": "Look! The bus is coming, we ___ run to catch it.",
|
||||
"target": "must",
|
||||
"clue": "должны (нужно поторопиться)",
|
||||
"options": ["must", "are", "do", "have"],
|
||||
"explanation": "'The bus is coming' — автобус подъезжает прямо сейчас, модальный глагол 'must' выражает необходимость действовать немедленно."
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ for a software company while my friend looks for a job.",
|
||||
"target": "am currently working",
|
||||
"clue": "в настоящее время работаю (временная ситуация)",
|
||||
"options": ["am currently working", "works", "have worked", "worked"],
|
||||
"explanation": "Для временного текущего периода занятости используется форма Present Continuous: 'am currently working'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 2: Present Simple (I do)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 2,
|
||||
"level": "A1-A2",
|
||||
"category": "Present Tenses",
|
||||
"title": "Present Simple (I do)",
|
||||
"subtitle": "Регулярные привычки, факты, законы природы и расписания",
|
||||
"golden_formula": "S + V1 (he/she/it + V-s/es)\n(I work / She works / Do you work? / He does not work)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Регулярное повторяющееся действие или привычка (Habit / Routine)",
|
||||
"example_a": "I drink a cup of black coffee every morning at 8:00.",
|
||||
"trans_a": "Я пью чашку чёрного кофе каждое утро в 8:00.",
|
||||
"situation_b": "Непреложный факт или закон природы (General truth / Fact)",
|
||||
"example_b": "The Earth moves around the Sun.",
|
||||
"trans_b": "Земля вращается вокруг Солнца (постоянный факт).",
|
||||
"key_difference": "Present Simple говорит о том, что верно вообще, регулярно или по расписанию, а не только в данную секунду."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь формулу с окончанием -s для he/she/it. Напишите от руки 2-3 ваших реальных привычки с маркерами частоты: always, usually, every day (например: 'I usually drink green tea after lunch').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "My brother ___ in a bank in the city center.",
|
||||
"target": "works",
|
||||
"clue": "работает (постоянно, факт)",
|
||||
"options": ["works", "work", "is working", "working"],
|
||||
"explanation": "Подлежащее 'My brother' (он) требует глагола с окончанием -s в Present Simple: 'works'."
|
||||
},
|
||||
{
|
||||
"sentence": "How often ___ you go to the gym during the week?",
|
||||
"target": "do",
|
||||
"clue": "вспомогательный глагол вопроса",
|
||||
"options": ["do", "does", "are", "have"],
|
||||
"explanation": "С местоимением 'you' вопрос в Present Simple образуется с помощью вспомогательного глагола 'do'."
|
||||
},
|
||||
{
|
||||
"sentence": "Water ___ at zero degrees Celsius.",
|
||||
"target": "freezes",
|
||||
"clue": "замерзает (закон природы)",
|
||||
"options": ["freezes", "freeze", "is freezing", "froze"],
|
||||
"explanation": "Физические факты и свойства веществ выражаются в Present Simple: неисчисляемое 'Water' требует 'freezes'."
|
||||
},
|
||||
{
|
||||
"sentence": "She ___ meat because she is a strict vegetarian.",
|
||||
"target": "does not eat",
|
||||
"clue": "не ест (постоянная привычка)",
|
||||
"options": ["does not eat", "do not eat", "is not eating", "not eats"],
|
||||
"explanation": "Отрицание для третьего лица единственного числа (she) образуется через 'does not' + начальная форма глагола 'eat'."
|
||||
},
|
||||
{
|
||||
"sentence": "The train to London ___ at 9:30 every morning.",
|
||||
"target": "departs",
|
||||
"clue": "отправляется (по расписанию)",
|
||||
"options": ["departs", "departing", "is departing", "depart"],
|
||||
"explanation": "Общественный транспорт и расписания в английском языке всегда передаются через Present Simple: 'departs'."
|
||||
}
|
||||
]
|
||||
},
|
||||
from pathlib import Path
|
||||
from app import config
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 3: Present Continuous vs Present Simple (I am doing vs I do)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 3,
|
||||
"level": "A1-A2",
|
||||
"category": "Present Tenses",
|
||||
"title": "Present Continuous vs Present Simple (I am doing vs I do)",
|
||||
"subtitle": "Главный контраст: процесс сейчас vs факт вообще + глаголы состояния (Stative Verbs)",
|
||||
"golden_formula": "NOW: am/is/are + V-ing | ALWAYS/HABIT: V1(s)\nStative Verbs (NO -ing): know, like, want, understand, remember, believe",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "I am doing (Прямо сейчас / процесс в развитии)",
|
||||
"example_a": "Listen! What language are those tourists speaking?",
|
||||
"trans_a": "Послушай! На каком языке говорят эти туристы (сейчас)?",
|
||||
"situation_b": "I do (Вообще / способность / факт)",
|
||||
"example_b": "My colleague speaks three foreign languages fluently.",
|
||||
"trans_b": "Мой коллега свободно говорит на трёх иностранных языках (вообще).",
|
||||
"key_difference": "Глаголы чувств и мыслей (know, understand, want, believe, like) практически никогда не используются в форме -ing!"
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь список глаголов состояния (Stative Verbs), которые нельзя ставить в -ing. Составьте от руки 2 контрастных предложения о себе (например: 'I live in Moscow, but this month I am staying with my parents').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "I ___ what you mean, could you explain it again?",
|
||||
"target": "do not understand",
|
||||
"clue": "не понимаю (глагол состояния understand)",
|
||||
"options": ["do not understand", "am not understanding", "not understand", "did not understood"],
|
||||
"explanation": "Глагол 'understand' является глаголом ментального состояния (stative verb) и не употребляется во времени Continuous."
|
||||
},
|
||||
{
|
||||
"sentence": "Look outside! It ___ heavily, take an umbrella.",
|
||||
"target": "is raining",
|
||||
"clue": "идёт дождь (прямо сейчас)",
|
||||
"options": ["is raining", "rains", "rained", "rain"],
|
||||
"explanation": "Призыв 'Look outside!' сигнализирует о действии, разворачивающемся на глазах прямо сейчас: 'is raining'."
|
||||
},
|
||||
{
|
||||
"sentence": "It seldom ___ in this dry desert region.",
|
||||
"target": "rains",
|
||||
"clue": "идёт дождь (редко, постоянное свойство)",
|
||||
"options": ["rains", "is raining", "was raining", "rain"],
|
||||
"explanation": "Наречие частотности 'seldom' (редко) описывает общее климатическое свойство местности $\rightarrow$ Present Simple: 'rains'."
|
||||
},
|
||||
{
|
||||
"sentence": "Do you ___ this beautiful song?",
|
||||
"target": "know",
|
||||
"clue": "знаешь (глагол состояния know)",
|
||||
"options": ["know", "knowing", "are knowing", "knew"],
|
||||
"explanation": "Глагол 'know' — стативный глагол, вопрос строится в Present Simple: 'Do you know?'"
|
||||
},
|
||||
{
|
||||
"sentence": "Normally I drink tea, but today I ___ coffee.",
|
||||
"target": "am drinking",
|
||||
"clue": "пью (сегодня, исключение из привычки)",
|
||||
"options": ["am drinking", "drink", "drinks", "drank"],
|
||||
"explanation": "Контраст: 'Normally I drink' (привычка в Simple), но 'today I am drinking' (временное отклонение от нормы в Continuous)."
|
||||
}
|
||||
]
|
||||
},
|
||||
_CURATED_MURPHY_UNITS_CACHE = None
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 4: Past Simple (I did)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 4,
|
||||
"level": "A1-A2",
|
||||
"category": "Past Tenses",
|
||||
"title": "Past Simple (I did)",
|
||||
"subtitle": "Завершённое действие в прошлом с точной привязкой ко времени",
|
||||
"golden_formula": "S + V2 / V-ed | Did + S + V1? | S + did not + V1\n(yesterday, last night, two years ago, in 2021, when I was a child)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Действие полностью завершилось в прошлом (Finished past time)",
|
||||
"example_a": "We arrived in London yesterday afternoon.",
|
||||
"trans_a": "Мы прибыли в Лондон вчера днём (период 'вчера' завершён).",
|
||||
"situation_b": "Последовательность действий в прошлом (Story sequence)",
|
||||
"example_b": "He woke up, brushed his teeth, and left the house.",
|
||||
"trans_b": "Он проснулся, почистил зубы и вышел из дома (цепочка фактов).",
|
||||
"key_difference": "Past Simple отвечает на вопрос 'Когда это произошло?' и разрывает связь с настоящим моментом."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Нарисуйте в тетради линию времени со стрелкой в прошлое. Напишите от руки 3 реальных вещи, которые вы сделали вчера с точным временем или маркерами (например: 'Yesterday I finished my work at 7 PM and cooked dinner').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Mozart ___ more than six hundred pieces of music.",
|
||||
"target": "wrote",
|
||||
"clue": "написал (исторический факт в прошлом)",
|
||||
"options": ["wrote", "has written", "writes", "was writing"],
|
||||
"explanation": "Моцарт жил в прошлом, период его жизни завершён $\rightarrow$ употребляется Past Simple: 'wrote'."
|
||||
},
|
||||
{
|
||||
"sentence": "Where ___ you go on your last summer vacation?",
|
||||
"target": "did",
|
||||
"clue": "вспомогательный глагол для прошедшего времени",
|
||||
"options": ["did", "do", "were", "have"],
|
||||
"explanation": "Вопрос о завершённом периоде в прошлом ('last summer') строится с помощью вспомогательного глагола 'did'."
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ buy the phone because it was ridiculously expensive.",
|
||||
"target": "did not",
|
||||
"clue": "не (отрицание в прошедшем времени)",
|
||||
"options": ["did not", "do not", "was not", "have not"],
|
||||
"explanation": "Отрицание смыслового глагола 'buy' в Past Simple требует вспомогательного 'did not' ('didn't')."
|
||||
},
|
||||
{
|
||||
"sentence": "She ___ her keys in the office two days ago.",
|
||||
"target": "lost",
|
||||
"clue": "потеряла (неправильный глагол lose $\rightarrow$ lost)",
|
||||
"options": ["lost", "losing", "has lost", "loses"],
|
||||
"explanation": "Маркер завершённого времени 'two days ago' строго требует формы Past Simple: 'lost'."
|
||||
},
|
||||
{
|
||||
"sentence": "When the meeting ___, everyone went to have lunch.",
|
||||
"target": "ended",
|
||||
"clue": "закончилась (последовательность событий)",
|
||||
"options": ["ended", "ends", "has ended", "is ending"],
|
||||
"explanation": "Последовательность завершённых действий в прошлом передаётся в Past Simple: 'ended ... went'."
|
||||
}
|
||||
]
|
||||
},
|
||||
def get_curated_murphy_units():
|
||||
global _CURATED_MURPHY_UNITS_CACHE
|
||||
if _CURATED_MURPHY_UNITS_CACHE is None:
|
||||
seeds_file = config.BASE_DIR / 'data' / 'seeds' / 'grammar_units.json'
|
||||
if seeds_file.is_file():
|
||||
try:
|
||||
with open(seeds_file, 'r', encoding='utf-8') as f:
|
||||
_CURATED_MURPHY_UNITS_CACHE = json.load(f)
|
||||
except Exception:
|
||||
_CURATED_MURPHY_UNITS_CACHE = []
|
||||
else:
|
||||
_CURATED_MURPHY_UNITS_CACHE = []
|
||||
return _CURATED_MURPHY_UNITS_CACHE
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 5: Past Continuous (I was doing)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 5,
|
||||
"level": "A1-A2",
|
||||
"category": "Past Tenses",
|
||||
"title": "Past Continuous (I was doing)",
|
||||
"subtitle": "Процесс в конкретный момент в прошлом или фоновое действие",
|
||||
"golden_formula": "S + was / were + V-ing\n(At 4 PM yesterday I was driving home / They were sleeping)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Действие в процессе в конкретный момент времени в прошлом",
|
||||
"example_a": "At 10:30 last night, I was watching a documentary.",
|
||||
"trans_a": "В 10:30 вчера вечером я смотрел документальный фильм (был в процессе).",
|
||||
"situation_b": "Фоновое действие, во время которого произошло короткое событие",
|
||||
"example_b": "It was raining when we stepped outside.",
|
||||
"trans_b": "Шёл дождь (фон в процессе), когда мы вышли на улицу (короткий факт).",
|
||||
"key_difference": "Past Continuous показывает длительность и незавершённость действия в определённый момент прошлого."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь: 'was' для I/he/she/it, 'were' для you/we/they. Напишите от руки 2 предложения о том, чем именно вы занимались в 8 часов вечера вчера (например: 'At 8 PM yesterday I was walking my dog in the park').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "This time yesterday, we ___ over the Atlantic ocean.",
|
||||
"target": "were flying",
|
||||
"clue": "летели (были в процессе в этот момент)",
|
||||
"options": ["were flying", "flew", "are flying", "have flown"],
|
||||
"explanation": "'This time yesterday' указывает на точный момент в прошлом, когда действие находилось в развитии: 'were flying'."
|
||||
},
|
||||
{
|
||||
"sentence": "What ___ you doing when the fire alarm sounded?",
|
||||
"target": "were",
|
||||
"clue": "вспомогательный глагол для you в Past Continuous",
|
||||
"options": ["were", "was", "did", "are"],
|
||||
"explanation": "Для местоимения 'you' во времени Past Continuous используется вспомогательный глагол 'were'."
|
||||
},
|
||||
{
|
||||
"sentence": "He burned his hand while he ___ cooking dinner.",
|
||||
"target": "was",
|
||||
"clue": "был в процессе готовки",
|
||||
"options": ["was", "is", "did", "were"],
|
||||
"explanation": "Придаточное предложение времени с союзом 'while' описывает длительный процесс: 'while he was cooking'."
|
||||
},
|
||||
{
|
||||
"sentence": "The sun ___ brightly when I woke up this morning.",
|
||||
"target": "was shining",
|
||||
"clue": "светило (фон на момент пробуждения)",
|
||||
"options": ["was shining", "shone", "has shone", "shines"],
|
||||
"explanation": "Солнце уже светило (длительный фон), когда произошло единичное пробуждение: 'was shining'."
|
||||
},
|
||||
{
|
||||
"sentence": "They didn't hear the doorbell because they ___ to loud music.",
|
||||
"target": "were listening",
|
||||
"clue": "слушали (процесс, объясняющий причину)",
|
||||
"options": ["were listening", "listened", "are listening", "listen"],
|
||||
"explanation": "Они не услышали звонок, потому что в этот самый момент находились в процессе прослушивания: 'were listening'."
|
||||
}
|
||||
]
|
||||
},
|
||||
class _LazyUnitsList(list):
|
||||
def __iter__(self):
|
||||
return iter(get_curated_murphy_units())
|
||||
def __len__(self):
|
||||
return len(get_curated_murphy_units())
|
||||
def __getitem__(self, idx):
|
||||
return get_curated_murphy_units()[idx]
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 6: Past Simple vs Past Continuous (I did vs I was doing)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 6,
|
||||
"level": "A1-A2",
|
||||
"category": "Past Tenses",
|
||||
"title": "Past Simple vs Past Continuous (I did vs I was doing)",
|
||||
"subtitle": "Короткий факт vs Длительный фон: пересечение двух событий",
|
||||
"golden_formula": "Background (Long): was/were + V-ing\nInterruption (Short): V2 / V-ed\n(While I was walking, I met my friend)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Длительное фоновое действие прерывается коротким фактом",
|
||||
"example_a": "I was taking a shower when the courier knocked on the door.",
|
||||
"trans_a": "Я принимал душ (фон), когда курьер постучал в дверь (факт).",
|
||||
"situation_b": "Два завершённых последовательных действия (Одно за другим)",
|
||||
"example_b": "I heard the knock and opened the door immediately.",
|
||||
"trans_b": "Я услышал стук и сразу открыл дверь (действие за действием).",
|
||||
"key_difference": "Was doing = действие уже шло. Did = действие произошло, началось или закончилось."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь формулу: 'While + Past Continuous, Past Simple'. Напишите 2 ситуации из вашей жизни, когда одно прервало другое (например: 'While I was writing code, my laptop ran out of battery').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "While I was walking in the park, I ___ a rare bird.",
|
||||
"target": "saw",
|
||||
"clue": "увидел (короткое событие во время прогулки)",
|
||||
"options": ["saw", "was seeing", "have seen", "see"],
|
||||
"explanation": "Прогулка была длительным фоном (was walking), а наблюдение птицы — мгновенным событием в Past Simple: 'saw'."
|
||||
},
|
||||
{
|
||||
"sentence": "She ___ her leg while she was skiing in the Alps.",
|
||||
"target": "broke",
|
||||
"clue": "сломала (краткое прерывающее событие)",
|
||||
"options": ["broke", "was breaking", "breaks", "has broken"],
|
||||
"explanation": "Травма произошла одномоментно внутри процесса катания на лыжах: 'broke'."
|
||||
},
|
||||
{
|
||||
"sentence": "When I arrived at the cafe, my colleagues ___ for me.",
|
||||
"target": "were waiting",
|
||||
"clue": "ждали (уже находились в процессе ожидания)",
|
||||
"options": ["were waiting", "waited", "have waited", "are waiting"],
|
||||
"explanation": "В момент моего прихода коллеги уже сидели и ждали: фоновый процесс требует 'were waiting'."
|
||||
},
|
||||
{
|
||||
"sentence": "We ___ television when suddenly the power went out.",
|
||||
"target": "were watching",
|
||||
"clue": "смотрели (процесс перед отключением света)",
|
||||
"options": ["were watching", "watched", "have watched", "watch"],
|
||||
"explanation": "Смотрели телевизор (длительное действие), которое было прервано внезапным отключением: 'were watching'."
|
||||
},
|
||||
{
|
||||
"sentence": "He picked up the phone, ___ the number, and waited.",
|
||||
"target": "dialed",
|
||||
"clue": "набрал (цепочка последовательных действий)",
|
||||
"options": ["dialed", "was dialing", "has dialed", "dials"],
|
||||
"explanation": "Цепочка последовательных действий в прошлом передаётся через Past Simple: 'picked up, dialed, and waited'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 7: Present Perfect (I have done)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 7,
|
||||
"level": "B1-B2",
|
||||
"category": "Present Perfect",
|
||||
"title": "Present Perfect (I have done)",
|
||||
"subtitle": "Связь прошлого с настоящим: результат налицо, жизненный опыт и маркеры just / already / yet",
|
||||
"golden_formula": "S + have / has + V3 (Past Participle)\nResult NOW / Life experience / just, already, yet, ever, never",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Результат действия имеет прямое значение прямо сейчас (Result NOW)",
|
||||
"example_a": "I have lost my key. (I don't have it now and can't get in)",
|
||||
"trans_a": "Я потерял ключ (результат сейчас: ключа нет, не могу войти).",
|
||||
"situation_b": "Жизненный опыт к настоящему моменту (Life experience: ever/never)",
|
||||
"example_b": "Have you ever visited Japan?",
|
||||
"trans_b": "Ты когда-нибудь в своей жизни бывал в Японии?",
|
||||
"key_difference": "Present Perfect — это форма НАСТОЯЩЕГО времени о результатах прошлого. Если время названо (yesterday) — Present Perfect запрещён!"
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь маркеры: just (только что), already (уже), yet (ещё нет в отрицаниях и вопросах). Напишите 2 вещи, которые вы УЖЕ сделали сегодня, и 1 вещь, которую ЕЩЁ НЕ сделали (например: 'I have already drunk coffee, but I have not had lunch yet').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Would you like something to eat? — No thanks, I ___ lunch.",
|
||||
"target": "have just had",
|
||||
"clue": "только что пообедал (сыт прямо сейчас)",
|
||||
"options": ["have just had", "just had", "had just", "am having just"],
|
||||
"explanation": "Маркер 'just' (только что) указывает на свежий результат в настоящем: 'have just had'."
|
||||
},
|
||||
{
|
||||
"sentence": "Don't forget to pay the electric bill. — I have ___ paid it online.",
|
||||
"target": "already",
|
||||
"clue": "уже (действие сделано раньше ожидаемого)",
|
||||
"options": ["already", "yet", "still", "ever"],
|
||||
"explanation": "В утвердительных предложениях для значения 'уже сделано' ставится маркер 'already'."
|
||||
},
|
||||
{
|
||||
"sentence": "Has the postman delivered the morning letters ___?",
|
||||
"target": "yet",
|
||||
"clue": "уже / к этому моменту (в вопросах в конце)",
|
||||
"options": ["yet", "already", "just", "never"],
|
||||
"explanation": "В вопросительных предложениях для проверки свершения действия к данному моменту на конце ставится 'yet'."
|
||||
},
|
||||
{
|
||||
"sentence": "She has ___ tried sushi in her entire life.",
|
||||
"target": "never",
|
||||
"clue": "никогда (жизненный опыт)",
|
||||
"options": ["never", "ever", "yet", "already"],
|
||||
"explanation": "Для выражения отсутствия жизненного опыта в утвердительной грамматической конструкции используется 'never'."
|
||||
},
|
||||
{
|
||||
"sentence": "Look! Somebody ___ the window, cold air is coming in.",
|
||||
"target": "has broken",
|
||||
"clue": "разбил (результат виден прямо сейчас)",
|
||||
"options": ["has broken", "broke", "was breaking", "breaks"],
|
||||
"explanation": "Результат виден прямо сейчас (идёт холодный воздух), важно последствие, а не когда именно разбили $\rightarrow$ 'has broken'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 8: Present Perfect vs Past Simple (I have done vs I did)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 8,
|
||||
"level": "B1-B2",
|
||||
"category": "Present Perfect",
|
||||
"title": "Present Perfect vs Past Simple (I have done vs I did)",
|
||||
"subtitle": "Главная дилемма: результат в настоящем vs факт в завершённом времени",
|
||||
"golden_formula": "PRESENT PERFECT: No exact finished time | Connection to NOW\nPAST SIMPLE: Exact finished time (yesterday, in 2018, when, at 5 PM)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Present Perfect (Период времени ещё НЕ закончился: today, this week)",
|
||||
"example_a": "I have drunk two cups of tea this morning. (It is still morning)",
|
||||
"trans_a": "Я выпил две чашки чая этим утром (утро ещё продолжается).",
|
||||
"situation_b": "Past Simple (Период времени полностью завершён: yesterday, this morning - said at night)",
|
||||
"example_b": "I drank two cups of tea this morning. (Said in the afternoon/evening)",
|
||||
"trans_b": "Я выпил две чашки чая этим утром (сказано днём или вечером, утро прошло).",
|
||||
"key_difference": "Если есть слова yesterday, last year, ago, in 1999, when I was... — ВСЕГДА используем Past Simple!"
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Разделите страницу тетради на две колонки: 'Present Perfect' и 'Past Simple'. Запишите контрастную пару: 1) факт из прошлого с точным годом, 2) факт с результатом на сейчас (например: 'I visited Italy in 2019' vs 'I have visited Italy twice').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Did you know that Shakespeare ___ in 1616?",
|
||||
"target": "died",
|
||||
"clue": "умер (точная дата в завершённом прошлом)",
|
||||
"options": ["died", "has died", "had died", "dies"],
|
||||
"explanation": "Точная дата в прошлом ('in 1616') строго запрещает Present Perfect и требует Past Simple: 'died'."
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ my phone! Can you call my number to find it?",
|
||||
"target": "have lost",
|
||||
"clue": "потерял (результат актуален сейчас: ищу телефон)",
|
||||
"options": ["have lost", "lost", "was losing", "lose"],
|
||||
"explanation": "Актуальный результат в настоящем: телефон нужен прямо сейчас, связь с моментом речи $\rightarrow$ 'have lost'."
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ my phone yesterday, but fortunately found it in my bag.",
|
||||
"target": "lost",
|
||||
"clue": "потерял (вчера, период завершён)",
|
||||
"options": ["lost", "have lost", "was lost", "losing"],
|
||||
"explanation": "Слово-маркер 'yesterday' отсекает связь с настоящим и требует Past Simple: 'lost'."
|
||||
},
|
||||
{
|
||||
"sentence": "___ you ever eaten fresh oysters?",
|
||||
"target": "Have",
|
||||
"clue": "вопрос о жизненном опыте к текущему моменту",
|
||||
"options": ["Have", "Did", "Were", "Do"],
|
||||
"explanation": "Вопрос о жизненном опыте к настоящему моменту ('ever') строится в Present Perfect: 'Have you ever eaten...?'"
|
||||
},
|
||||
{
|
||||
"sentence": "When ___ you buy that stylish leather jacket?",
|
||||
"target": "did",
|
||||
"clue": "вопрос со словом When всегда требует Past Simple",
|
||||
"options": ["did", "have", "do", "were"],
|
||||
"explanation": "Вопрос со словом 'When' всегда нацелен на конкретный момент в прошлом и строится ТОЛЬКО в Past Simple: 'When did you buy...?'"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 9: Used to (I used to do)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 9,
|
||||
"level": "A1-A2",
|
||||
"category": "Past Tenses",
|
||||
"title": "Used to (I used to do)",
|
||||
"subtitle": "Раньше делал регулярно, но сейчас больше так не делаю",
|
||||
"golden_formula": "S + used to + V1\nNegative: did not use to + V1 | Question: Did you use to + V1?\n(I used to play tennis a lot, but now I prefer swimming)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Регулярная привычка в прошлом, которой больше нет (Past habit that stopped)",
|
||||
"example_a": "I used to smoke twenty cigarettes a day, but I quit five years ago.",
|
||||
"trans_a": "Я раньше выкуривал по 20 сигарет в день, но бросил 5 лет назад.",
|
||||
"situation_b": "Состояние или факт в прошлом, изменившийся сейчас (Past state that changed)",
|
||||
"example_b": "There used to be a movie theater here, but it closed down.",
|
||||
"trans_b": "Здесь раньше был кинотеатр, но он закрылся.",
|
||||
"key_difference": "Used to существует ТОЛЬКО в прошедшем времени. Для настоящих привычек используется Present Simple с usually."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите формулу в тетрадь. Напишите 2 предложения о том, чем вы регулярно занимались в детстве или юности, но больше не занимаетесь (например: 'I used to play video games all night, but now I sleep early').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "She ___ long curly hair when she was a teenager.",
|
||||
"target": "used to have",
|
||||
"clue": "раньше имела (сейчас причёска другая)",
|
||||
"options": ["used to have", "uses to have", "is used to have", "use to have"],
|
||||
"explanation": "Конструкция 'used to have' выражает постоянное состояние в прошлом, которое изменилось в настоящем."
|
||||
},
|
||||
{
|
||||
"sentence": "We ___ live in a small village before moving to the capital.",
|
||||
"target": "used to",
|
||||
"clue": "раньше жили (прошлое состояние)",
|
||||
"options": ["used to", "use to", "are used to", "used"],
|
||||
"explanation": "Для описания прежнего места жительства, которое сменилось, используется 'used to'."
|
||||
},
|
||||
{
|
||||
"sentence": "Did you ___ play the piano when you were younger?",
|
||||
"target": "use to",
|
||||
"clue": "форма инфинитива после вспомогательного did",
|
||||
"options": ["use to", "used to", "using to", "used"],
|
||||
"explanation": "После вспомогательного глагола 'Did' в вопросительном предложении пишется форма без окончания -d: 'Did you use to...?'"
|
||||
},
|
||||
{
|
||||
"sentence": "I didn't ___ like spicy Indian food, but now I love it.",
|
||||
"target": "use to",
|
||||
"clue": "раньше не любил (отрицание после didn't)",
|
||||
"options": ["use to", "used to", "uses to", "using"],
|
||||
"explanation": "После 'didn't' используется начальная форма 'use to': 'didn't use to like'."
|
||||
},
|
||||
{
|
||||
"sentence": "He ___ play football every Sunday, but now he is too busy.",
|
||||
"target": "used to",
|
||||
"clue": "раньше играл (привычка прекратилась)",
|
||||
"options": ["used to", "uses to", "was used to", "is used to"],
|
||||
"explanation": "Регулярная прошлая привычка, уступившая место занятости в настоящем $\rightarrow$ 'used to'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 10: Future Forms (Will vs Going to vs Present Continuous)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 10,
|
||||
"level": "B1-B2",
|
||||
"category": "Future",
|
||||
"title": "Future: Will vs Going to vs Present Continuous",
|
||||
"subtitle": "Спонтанное решение (Will) vs Намерение (Going to) vs 100% договоренность (Present Continuous)",
|
||||
"golden_formula": "WILL: Spontaneous decision NOW ('I'll help you')\nGOING TO: Prior intention / Evidence ('I am going to buy a car')\nPRESENT CONT: Fixed arrangement with date/people ('I am flying to Rome on Friday')",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Will (Спонтанное решение в момент речи / обещание / прогноз)",
|
||||
"example_a": "The phone is ringing. — I'll answer it!",
|
||||
"trans_a": "Телефон звонит. — Я отвечу (решил сию секунду)!",
|
||||
"situation_b": "Going to (Заранее обдуманное намерение / очевидность по фактам)",
|
||||
"example_b": "Look at those black clouds! It is going to rain.",
|
||||
"trans_b": "Посмотри на эти чёрные тучи! Сейчас пойдёт дождь (налицо очевидные признаки).",
|
||||
"key_difference": "Present Continuous для будущего требует подтверждённой договорённости: куплены билеты, назначена встреча в календаре."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Нарисуйте 3 колонки: Will (спонтанно), Going to (намерение), Pres. Cont. (куплены билеты/запланировано). Напишите по 1 предложению в каждую колонку о своих реальных планах.",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Have you decided what to drink? — Yes, I ___ a glass of orange juice, please.",
|
||||
"target": "will have",
|
||||
"clue": "возьму (спонтанное решение в момент заказа)",
|
||||
"options": ["will have", "am having", "am going to have", "have"],
|
||||
"explanation": "Заказ в кафе или спонтанное решение в момент речи выражается через 'will': 'I'll have...'."
|
||||
},
|
||||
{
|
||||
"sentence": "Why are you turning on the television? — I ___ watch the evening news.",
|
||||
"target": "am going to",
|
||||
"clue": "собираюсь (намерение было сформировано заранее)",
|
||||
"options": ["am going to", "will", "am", "would"],
|
||||
"explanation": "Человек включил телевизор, потому что уже заранее намеревался посмотреть новости: 'am going to watch'."
|
||||
},
|
||||
{
|
||||
"sentence": "I can't meet you on Friday afternoon because I ___ to the dentist at 3 PM.",
|
||||
"target": "am going",
|
||||
"clue": "иду (записан на конкретное время в расписании)",
|
||||
"options": ["am going", "will go", "go", "shall go"],
|
||||
"explanation": "Договорённость с точным временем в расписании передаётся через Present Continuous: 'I am going to the dentist'."
|
||||
},
|
||||
{
|
||||
"sentence": "Watch out! That unstable stack of boxes ___ fall!",
|
||||
"target": "is going to",
|
||||
"clue": "сейчас упадёт (очевидные физические признаки)",
|
||||
"options": ["is going to", "will", "is falling", "shall"],
|
||||
"explanation": "Прогноз на основе видимых прямо сейчас признаков (коробки уже качаются) выражается через 'is going to'."
|
||||
},
|
||||
{
|
||||
"sentence": "Don't worry about carrying that heavy bag alone. I ___ help you.",
|
||||
"target": "will",
|
||||
"clue": "помогу (спонтанное предложение помощи)",
|
||||
"options": ["will", "am going to", "am helping", "help"],
|
||||
"explanation": "Предложение помощи в момент разговора выражается формой 'I will help you'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 11: Modals: Must, Have to, Should
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 11,
|
||||
"level": "B1-B2",
|
||||
"category": "Modals",
|
||||
"title": "Modal Verbs: Must, Have to, Should",
|
||||
"subtitle": "Внутреннее решение (Must) vs Внешнее правило (Have to) vs Совет (Should)",
|
||||
"golden_formula": "MUST: Speaker's personal feeling ('I must call my mom')\nHAVE TO: External law / rule / obligation ('I have to wear a helmet at work')\nSHOULD: Good idea / friendly advice ('You should sleep more')",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Must (Личное внутреннее убеждение говорящего)",
|
||||
"example_a": "I must get up earlier tomorrow; I want to do morning exercises.",
|
||||
"trans_a": "Я должен встать пораньше завтра; я сам этого хочу (моё решение).",
|
||||
"situation_b": "Have to (Внешнее правило, закон, обстоятельства)",
|
||||
"example_b": "In the UK, drivers have to drive on the left side of the road.",
|
||||
"trans_b": "В Великобритании водители обязаны ехать по левой стороне (закон государства).",
|
||||
"key_difference": "Mustn't = СТРОГО ЗАПРЕЩЕНО. Don't have to = НЕ ОБЯЗАТЕЛЬНО (но можно, если хочешь)."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь контраст: Mustn't (запрет) vs Don't have to (нет необходимости). Напишите 1 вещь, которую вы обязаны делать по работе (have to), и 1 совет самому себе (should).",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "You ___ touch that high-voltage electrical cable! It is lethal.",
|
||||
"target": "must not",
|
||||
"clue": "нельзя, строго запрещено",
|
||||
"options": ["must not", "do not have to", "should", "might not"],
|
||||
"explanation": "Категорический запрет опасного действия выражается модальным глаголом 'must not' ('mustn't')."
|
||||
},
|
||||
{
|
||||
"sentence": "Tomorrow is Sunday, so I ___ wake up early for work.",
|
||||
"target": "do not have to",
|
||||
"clue": "нет необходимости, не обязан",
|
||||
"options": ["do not have to", "must not", "should", "cannot"],
|
||||
"explanation": "Отсутствие необходимости ('не нужно вставать, но можно, если захочешь') передаётся через 'do not have to'."
|
||||
},
|
||||
{
|
||||
"sentence": "You have been coughing for a week; you ___ see a doctor.",
|
||||
"target": "should",
|
||||
"clue": "следует (дружеский совет)",
|
||||
"options": ["should", "have to", "must", "shall"],
|
||||
"explanation": "Рекомендация или разумный совет выражается через 'should'."
|
||||
},
|
||||
{
|
||||
"sentence": "All passengers ___ show a valid boarding pass before boarding.",
|
||||
"target": "have to",
|
||||
"clue": "обязаны (официальное правило авиакомпании)",
|
||||
"options": ["have to", "should", "might", "would"],
|
||||
"explanation": "Официальные правила, законы и инструкции третьей стороны передаются через 'have to'."
|
||||
},
|
||||
{
|
||||
"sentence": "I ___ remember to send birthday flowers to my grandmother.",
|
||||
"target": "must",
|
||||
"clue": "должен (личное внутреннее побуждение)",
|
||||
"options": ["must", "may", "can", "ought"],
|
||||
"explanation": "Внутренний моральный долг и личное решение говорящего выражаются через 'must'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 12: Conditionals: First vs Second (If I do vs If I did)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 12,
|
||||
"level": "B1-B2",
|
||||
"category": "Conditionals",
|
||||
"title": "First vs Second Conditional (If I do vs If I did)",
|
||||
"subtitle": "Реальное условие на будущее vs Воображаемая / маловероятная ситуация",
|
||||
"golden_formula": "1st COND (Real Future): If + Present Simple, will + V1\n(If it rains tomorrow, we will stay home)\n2nd COND (Unreal / Imaginary): If + Past Simple, would + V1\n(If I had a million dollars, I would travel the world)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "First Conditional (Вполне реальная ситуация в будущем)",
|
||||
"example_a": "If you study hard, you will pass the exam easily.",
|
||||
"trans_a": "Если ты будешь усердно учиться, ты легко сдашь экзамен (реальная вероятность).",
|
||||
"situation_b": "Second Conditional (Воображаемая или маловероятная ситуация в настоящем/будущем)",
|
||||
"example_b": "If I knew his phone number, I would call him right now.",
|
||||
"trans_b": "Если бы я знал его номер (но я не знаю!), я бы позвонил ему прямо сейчас.",
|
||||
"key_difference": "В части с IF никогда не ставится will или would! (Никаких 'If I will' или 'If I would')."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите формулы 1st и 2nd Conditionals цветными маркерами. Напишите 1 реальное условие на завтра (If...) и 1 мечту/воображаемую ситуацию (If I had / If I were...).",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "If the weather ___ sunny tomorrow, we will go for a picnic.",
|
||||
"target": "is",
|
||||
"clue": "будет (в части If ставится Present Simple)",
|
||||
"options": ["is", "will be", "was", "would be"],
|
||||
"explanation": "В 1st Conditional в придаточном с 'if' используется Present Simple ('is'), а не 'will be'."
|
||||
},
|
||||
{
|
||||
"sentence": "If I ___ more free time, I would learn how to play guitar.",
|
||||
"target": "had",
|
||||
"clue": "было бы (нереальное условие в настоящем)",
|
||||
"options": ["had", "have", "will have", "would have"],
|
||||
"explanation": "Во 2nd Conditional для воображаемой ситуации в части 'if' ставится Past Simple: 'had'."
|
||||
},
|
||||
{
|
||||
"sentence": "What ___ you do if you won the lottery tomorrow?",
|
||||
"target": "would",
|
||||
"clue": "сделал бы (гипотетический результат)",
|
||||
"options": ["would", "will", "did", "can"],
|
||||
"explanation": "Маловероятная гипотетическая ситуация (2nd Conditional: 'if you won') требует в главной части 'would you do'."
|
||||
},
|
||||
{
|
||||
"sentence": "If you don't leave now, you ___ miss your flight.",
|
||||
"target": "will",
|
||||
"clue": "опоздаешь (реальное последствие)",
|
||||
"options": ["will", "would", "did", "are"],
|
||||
"explanation": "Реальное предупреждение на ближайшее будущее (1st Conditional): 'If you don't leave ... you will miss'."
|
||||
},
|
||||
{
|
||||
"sentence": "If I ___ in your position, I would accept the job offer.",
|
||||
"target": "were",
|
||||
"clue": "был бы (традиционная сослагательная форма were)",
|
||||
"options": ["were", "am", "will be", "would be"],
|
||||
"explanation": "В условных предложениях 2-го типа для всех лиц часто используется форма 'were' ('If I were you...')."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 13: Passive Voice (Present & Past: It is done / It was done)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 13,
|
||||
"level": "B1-B2",
|
||||
"category": "Passive Voice",
|
||||
"title": "Passive Voice (It is done / It was done)",
|
||||
"subtitle": "Пассивный залог: фокус на объекте или результате, а не на исполнителе",
|
||||
"golden_formula": "Present Passive: am / is / are + V3 (Past Participle)\nPast Passive: was / were + V3\nBy + agent: used only when the doer is important ('painted by Da Vinci')",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Active Voice (Фокус на том, КТО совершает действие)",
|
||||
"example_a": "Alexander Bell invented the telephone in 1876.",
|
||||
"trans_a": "Александр Белл изобрёл телефон в 1876 году.",
|
||||
"situation_b": "Passive Voice (Фокус на том, ЧТО произошло с объектом)",
|
||||
"example_b": "The telephone was invented in 1876.",
|
||||
"trans_b": "Телефон был изобретён в 1876 году (важен телефон и дата, а не персона).",
|
||||
"key_difference": "Пассив используется, когда исполнитель неизвестен, очевиден или не имеет решающего значения."
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите формулу пассивного залога: be + V3. Напишите от руки 2 примера из сферы технологий (например: 'Python was created in 1991', 'My data is backed up daily').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "Millions of emails ___ sent around the globe every single minute.",
|
||||
"target": "are",
|
||||
"clue": "отправляются (Present Passive с множественным числом)",
|
||||
"options": ["are", "is", "were", "have"],
|
||||
"explanation": "Подлежащее 'Millions of emails' во множественном числе в настоящем времени требует: 'are sent'."
|
||||
},
|
||||
{
|
||||
"sentence": "This ancient castle ___ built in the fourteenth century.",
|
||||
"target": "was",
|
||||
"clue": "был построен (Past Passive в единственном числе)",
|
||||
"options": ["was", "is", "were", "has"],
|
||||
"explanation": "Замок один ('castle'), постройка завершена в XIV веке $\rightarrow$ 'was built'."
|
||||
},
|
||||
{
|
||||
"sentence": "The Mona Lisa was painted ___ Leonardo da Vinci.",
|
||||
"target": "by",
|
||||
"clue": "предлог исполнителя действия в пассиве",
|
||||
"options": ["by", "with", "from", "of"],
|
||||
"explanation": "Исполнитель действия в пассивном залоге вводится предлогом 'by'."
|
||||
},
|
||||
{
|
||||
"sentence": "The new operating system ___ tested by engineers right now.",
|
||||
"target": "is being",
|
||||
"clue": "тестируется прямо сейчас (Present Continuous Passive)",
|
||||
"options": ["is being", "is", "was", "has been"],
|
||||
"explanation": "Пассивное действие в процессе прямо в момент речи требует формы 'is being tested'."
|
||||
},
|
||||
{
|
||||
"sentence": "All rooms in the hotel ___ cleaned thoroughly every morning.",
|
||||
"target": "are",
|
||||
"clue": "убираются (регулярный Present Passive)",
|
||||
"options": ["are", "is", "were", "being"],
|
||||
"explanation": "Регулярное повторяющееся пассивное действие во множественном числе ('rooms') $\rightarrow$ 'are cleaned'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 14: Articles (A/An vs The vs Zero Article)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 14,
|
||||
"level": "A1-A2",
|
||||
"category": "Articles",
|
||||
"title": "Articles: A/An vs The vs Zero Article",
|
||||
"subtitle": "Один из многих (A/An) vs Конкретный / единственный (The) vs Обобщение (Zero)",
|
||||
"golden_formula": "A / AN: Any one non-specific item ('Can I have an apple?')\nTHE: Specific item known to listener / Unique ('Look at the Moon')\nZERO (No article): Plurals & Uncountable in general ('Cats love milk')",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "A/An (Первое упоминание / любой один представитель класса)",
|
||||
"example_a": "I bought a jacket yesterday.",
|
||||
"trans_a": "Я купил какую-то куртку вчера (собеседник слышит о ней впервые).",
|
||||
"situation_b": "The (Конкретный предмет, уже известный обоим собеседникам)",
|
||||
"example_b": "The jacket fits me perfectly.",
|
||||
"trans_b": "Эта (та самая) куртка сидит на мне идеально.",
|
||||
"key_difference": "Не используйте артикль со множественным числом или неисчисляемыми существительными, когда говорите о явлении вообще!"
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Нарисуйте в тетради 3 колонки: A/An, The, Ø (без артикля). Напишите цепочку из 2 предложений: первое с 'a', второе с 'the' (например: 'I adopted a cat. The cat is black').",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "She wants to buy ___ electric car next month.",
|
||||
"target": "an",
|
||||
"clue": "электромобиль (слово начинается с гласного звука)",
|
||||
"options": ["an", "a", "the", "—"],
|
||||
"explanation": "Перед исчисляемым существительным в единственном числе, начинающимся с гласного звука [e], ставится артикль 'an'."
|
||||
},
|
||||
{
|
||||
"sentence": "Could you please close ___ window? It is getting chilly.",
|
||||
"target": "the",
|
||||
"clue": "окно (конкретное окно в этой комнате)",
|
||||
"options": ["the", "a", "an", "—"],
|
||||
"explanation": "Собеседникам понятно, о каком именно окне в комнате идёт речь $\rightarrow$ определённый артикль 'the'."
|
||||
},
|
||||
{
|
||||
"sentence": "___ apples are good for your health.",
|
||||
"target": "—",
|
||||
"clue": "яблоки вообще (без артикля)",
|
||||
"options": ["—", "The", "An", "A"],
|
||||
"explanation": "Когда мы говорим о яблоках в целом как о классе продуктов во множественном числе, артикль отсутствует ('Zero Article')."
|
||||
},
|
||||
{
|
||||
"sentence": "___ Moon orbits around our planet.",
|
||||
"target": "The",
|
||||
"clue": "Луна (уникальный единственный в природе объект)",
|
||||
"options": ["The", "A", "An", "—"],
|
||||
"explanation": "Уникальные астрономические объекты, единственные в своём роде, всегда требуют артикля 'The': 'The Moon'."
|
||||
},
|
||||
{
|
||||
"sentence": "He ordered a soup and a salad; ___ soup was delicious.",
|
||||
"target": "the",
|
||||
"clue": "суп (второе упоминание того же самого супа)",
|
||||
"options": ["the", "a", "an", "—"],
|
||||
"explanation": "При повторном упоминании объекта ('a soup' $\rightarrow$ 'the soup') используется определённый артикль 'the'."
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Unit 15: Gerund vs Infinitive (doing vs to do)
|
||||
# -------------------------------------------------------------------------
|
||||
{
|
||||
"unit_num": 15,
|
||||
"level": "B1-B2",
|
||||
"category": "Gerund & Infinitive",
|
||||
"title": "Gerund vs Infinitive (doing vs to do)",
|
||||
"subtitle": "Герундий (-ing) vs Инфинитив (to do) после глаголов и предлогов",
|
||||
"golden_formula": "VERB + ING: enjoy, avoid, mind, finish, suggest, look forward to\nVERB + TO DO: decide, hope, promise, refuse, manage, want, afford\nAFTER PREPOSITIONS: ALWAYS -ING (good at coding, interested in learning)",
|
||||
"contrast_explanation": [
|
||||
{
|
||||
"situation_a": "Глаголы, требующие только герундия (-ing)",
|
||||
"example_a": "I really enjoy reading books in the evening.",
|
||||
"trans_a": "Мне очень нравится читать книги по вечерам (enjoy + V-ing).",
|
||||
"situation_b": "Глаголы, требующие только инфинитива (to do)",
|
||||
"example_b": "We decided to stay at home because of the storm.",
|
||||
"trans_b": "Мы решили остаться дома из-за шторма (decide + to do).",
|
||||
"key_difference": "После любых предлогов (in, at, about, without, before, after) ВСЕГДА используется форма -ing!"
|
||||
}
|
||||
],
|
||||
"journaling_prompt": "Запишите в тетрадь 2 списка: 1) Глаголы + -ing (enjoy, avoid), 2) Глаголы + to (decide, hope). Напишите 2 предложения: одно с тем, чем вы наслаждаетесь (enjoy doing), другое с тем, что решили сделать (decided to do).",
|
||||
"exercises": [
|
||||
{
|
||||
"sentence": "I am looking forward to ___ you at the conference.",
|
||||
"target": "meeting",
|
||||
"clue": "встретить (после предлога to в устойчивой связке look forward to)",
|
||||
"options": ["meeting", "meet", "to meet", "met"],
|
||||
"explanation": "В выражении 'look forward to' частица 'to' является предлогом, поэтому после неё обязательно используется герундий: 'meeting'."
|
||||
},
|
||||
{
|
||||
"sentence": "She decided ___ for the scholarship.",
|
||||
"target": "to apply",
|
||||
"clue": "подать заявку (после глагола decide)",
|
||||
"options": ["to apply", "applying", "apply", "applied"],
|
||||
"explanation": "Глагол 'decide' требует после себя инфинитива с частицей to: 'decided to apply'."
|
||||
},
|
||||
{
|
||||
"sentence": "You should avoid ___ heavily right before bedtime.",
|
||||
"target": "eating",
|
||||
"clue": "есть (после глагола avoid)",
|
||||
"options": ["eating", "to eat", "eat", "eaten"],
|
||||
"explanation": "Глагол 'avoid' (избегать) управляет исключительно формой герундия: 'avoid eating'."
|
||||
},
|
||||
{
|
||||
"sentence": "He is very good at ___ complex algorithmic problems.",
|
||||
"target": "solving",
|
||||
"clue": "решать (после предлога at)",
|
||||
"options": ["solving", "to solve", "solve", "solved"],
|
||||
"explanation": "После любых английских предлогов (здесь: предлог 'at') глагол принимает форму герундия: 'good at solving'."
|
||||
},
|
||||
{
|
||||
"sentence": "We can't afford ___ on a luxury cruise this summer.",
|
||||
"target": "to go",
|
||||
"clue": "поехать (после глагола afford)",
|
||||
"options": ["to go", "going", "go", "gone"],
|
||||
"explanation": "Глагол 'afford' (позволить себе финансово) требует инфинитива с частицей to: 'afford to go'."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
CURATED_MURPHY_UNITS = _LazyUnitsList()
|
||||
|
||||
|
||||
def seed_grammar_units(conn: sqlite3.Connection) -> int:
|
||||
|
||||
+30
-190
@@ -13,196 +13,36 @@ from datetime import datetime
|
||||
# -----------------------------------------------------------------------------
|
||||
# Curated High-Yield Bite-Sized Reading Articles & Facts
|
||||
# -----------------------------------------------------------------------------
|
||||
CURATED_ARTICLES: List[Dict[str, Any]] = [
|
||||
{
|
||||
"id": "art-01",
|
||||
"title": "The James Webb Space Telescope: Peering into the Cosmic Dawn",
|
||||
"title_ru": "Космический телескоп Джеймс Уэбб: взгляд в космический рассвет",
|
||||
"topic": "Science",
|
||||
"level": "B1",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"Operating in the cold vacuum of deep space, the James Webb Space Telescope observes the universe in high-resolution infrared light. Its massive gold-coated beryllium mirror captures faint photons emitted by the earliest galaxies over thirteen billion years ago.",
|
||||
"Unlike optical telescopes, infrared astronomy allows scientists to pierce through dense cosmic dust clouds where stars and planetary systems are born. Recently, the observatory discovered complex organic molecules in distant stellar nurseries, challenging previous models of early cosmic chemistry."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Работая в холодном вакууме глубокого космоса, космический телескоп «Джеймс Уэбб» наблюдает за Вселенной в инфракрасном диапазоне высокого разрешения. Его массивное бериллиевое зеркало с золотым покрытием улавливает слабые фотоны, испущенные самыми ранними галактиками более тринадцати миллиардов лет назад.",
|
||||
"В отличие от оптических телескопов, инфракрасная астрономия позволяет учёным проникать сквозь плотные облака космической пыли, где рождаются звёзды и планетные системы. Недавно обсерватория обнаружила сложные органические молекулы в далёких звёздных колыбелях, что поставило под сомнение прежние модели ранней космической химии."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "vacuum", "trans": "вакуум, пустота"},
|
||||
{"term": "beryllium", "trans": "бериллий"},
|
||||
{"term": "faint", "trans": "слабый, едва заметный"},
|
||||
{"term": "photons", "trans": "фотоны"},
|
||||
{"term": "stellar nurseries", "trans": "звёздные колыбели"},
|
||||
{"term": "pierce through", "trans": "проникать сквозь, протыкать"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-02",
|
||||
"title": "The Hidden Architecture of Neural Networks",
|
||||
"title_ru": "Скрытая архитектура нейронных сетей",
|
||||
"topic": "Technology",
|
||||
"level": "B2",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"Modern artificial neural networks are loosely inspired by the biological connections in the human cortex. Each artificial neuron computes a weighted sum of its inputs and applies a non-linear activation function before propagating the signal onward.",
|
||||
"During the backpropagation process, the network calculates gradient vectors to incrementally adjust billions of internal parameters. This iterative mathematical tuning enables language models to perceive subtle nuances of syntax, sentiment, and context without explicit hard-coded rules."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Современные искусственные нейронные сети отдалённо вдохновлены биологическими связями в коре головного мозга человека. Каждый искусственный нейрон вычисляет взвешенную сумму своих входов и применяет нелинейную функцию активации перед передачей сигнала дальше.",
|
||||
"В процессе обратного распространения ошибки сеть вычисляет векторы градиента, чтобы постепенно корректировать миллиарды внутренних параметров. Эта итеративная математическая настройка позволяет языковым моделям улавливать тонкие нюансы синтаксиса, тональности и контекста без явных жестко заданных правил."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "loosely inspired", "trans": "отдалённо вдохновлённый"},
|
||||
{"term": "cortex", "trans": "кора (головного мозга)"},
|
||||
{"term": "weighted sum", "trans": "взвешенная сумма"},
|
||||
{"term": "propagating", "trans": "распространяющий, передающий"},
|
||||
{"term": "gradient vectors", "trans": "векторы градиента"},
|
||||
{"term": "subtle nuances", "trans": "тонкие нюансы"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-03",
|
||||
"title": "The Remarkable Intelligence of Crows and Ravens",
|
||||
"title_ru": "Удивительный интеллект ворон и воронов",
|
||||
"topic": "Nature",
|
||||
"level": "B1",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"Corvids, the bird family that includes ravens and crows, display cognitive abilities rivaling those of primates. Laboratory experiments reveal that crows can fashion specialized hooks from wire to retrieve food containers placed out of beak reach.",
|
||||
"Furthermore, field observations demonstrate that wild crows remember specific human faces for several years and communicate warnings about hostile individuals to the rest of the flock across generations."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Врановые — семейство птиц, включающее воронов и ворон, демонстрируют когнитивные способности, соперничающие со способностями приматов. Лабораторные эксперименты показывают, что вороны могут изготавливать специальные крючки из проволоки, чтобы доставать контейнеры с едой, находящиеся вне досягаемости клюва.",
|
||||
"Более того, полевые наблюдения доказывают, что дикие вороны помнят конкретные человеческие лица в течение нескольких лет и передают предупреждения о недружелюбных особях остальной стае через поколения."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "corvids", "trans": "врановые (птицы)"},
|
||||
{"term": "cognitive abilities", "trans": "когнитивные способности"},
|
||||
{"term": "rivaling", "trans": "соперничающий с"},
|
||||
{"term": "fashion hooks", "trans": "изготавливать крючки"},
|
||||
{"term": "hostile individuals", "trans": "враждебные особи, недоброжелатели"},
|
||||
{"term": "flock", "trans": "стая"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-04",
|
||||
"title": "Why We Sleep: The Science of Memory Consolidation",
|
||||
"title_ru": "Зачем мы спим: наука о консолидации памяти",
|
||||
"topic": "Health",
|
||||
"level": "B1",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"While the body rests during deep sleep, the brain is engaged in vigorous maintenance work. The hippocampus transfers newly acquired information into the neocortex for long-term storage, effectively converting fragile short-term memories into enduring knowledge.",
|
||||
"Simultaneously, the glymphatic system flushes away metabolic waste and toxic proteins that accumulate between neurons during waking hours. Sleep deprivation severely impairs this cleaning cycle, making rapid vocabulary retention far more difficult."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Пока тело отдыхает во время глубокого сна, мозг занят активной работой по техобслуживанию. Гиппокамп переносит вновь полученную информацию в неокортекс для долговременного хранения, эффективно преобразуя хрупкие кратковременные воспоминания в прочные знания.",
|
||||
"Одновременно с этим глимфатическая система вымывает метаболические отходы и токсичные белки, которые накапливаются между нейронами в часы бодрствования. Недосыпание серьёзно нарушает этот цикл очистки, делая быстрое запоминание словарного запаса намного более трудным."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "vigorous maintenance", "trans": "активное техобслуживание / поддержка"},
|
||||
{"term": "fragile memories", "trans": "хрупкие воспоминания"},
|
||||
{"term": "enduring knowledge", "trans": "прочные, долговечные знания"},
|
||||
{"term": "flushes away", "trans": "смывает, вымывает"},
|
||||
{"term": "sleep deprivation", "trans": "депривация сна, недосыпание"},
|
||||
{"term": "vocabulary retention", "trans": "удержание словарного запаса"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-05",
|
||||
"title": "The Antikythera Mechanism: Ancient Greek Analog Computer",
|
||||
"title_ru": "Антикитерский механизм: древнегреческий аналоговый компьютер",
|
||||
"topic": "History",
|
||||
"level": "B2",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"Discovered by sponge divers inside a Roman shipwreck near the Greek island of Antikythera in 1901, this corroded bronze device bewildered historians for decades. Modern micro-computed tomography revealed an intricate clockwork mechanism consisting of over thirty precision gear wheels.",
|
||||
"Constructed around the second century BC, the mechanism accurately tracked the astronomical positions of the Sun, Moon, and five known planets. It could even predict solar and lunar eclipses years in advance, showcasing a technological sophistication unmatched until fourteenth-century mechanical clocks."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Обнаруженное ловцами губок внутри римского кораблекрушения возле греческого острова Антикитера в 1901 году, это корродированное бронзовое устройство приводило историков в замешательство на протяжении десятилетий. Современная микрокомпьютерная томография выявила сложнейший часовой механизм, состоящий из более чем тридцати прецизионных зубчатых колёс.",
|
||||
"Созданный около второго века до нашей эры, механизм точно отслеживал астрономические положения Солнца, Луны и пяти известных планет. Он мог даже предсказывать солнечные и лунные затмения на годы вперёд, демонстрируя технологическую сложность, которой не было равных вплоть до механических часов XIV века."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "sponge divers", "trans": "ловцы губок"},
|
||||
{"term": "corroded bronze", "trans": "подвергшаяся коррозии бронза"},
|
||||
{"term": "bewildered", "trans": "сбивал с толку, озадачивал"},
|
||||
{"term": "gear wheels", "trans": "зубчатые колёса, шестерни"},
|
||||
{"term": "lunar eclipses", "trans": "лунные затмения"},
|
||||
{"term": "sophistication", "trans": "утончённость, сложность конструкции"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-06",
|
||||
"title": "Underground Fungal Networks: The Wood Wide Web",
|
||||
"title_ru": "Подземные грибные сети: лесная паутина",
|
||||
"topic": "Nature",
|
||||
"level": "B1",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"Beneath the floor of an ancient forest lies an astonishing symbiotic network of mycorrhizal fungi. These microscopic fungal threads, known as mycelium, weave through tree roots to exchange mineral nutrients and water for sugars generated through photosynthesis.",
|
||||
"Remarkably, trees utilize this subterranean internet to transmit chemical distress signals when attacked by pests, allowing neighboring trees to synthesize defensive tannins before the infestation spreads."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"Под пологом древнего леса скрывается поразительная симбиотическая сеть микоризных грибов. Эти микроскопические грибные нити, известные как мицелий, оплетают корни деревьев, обменивая минеральные питательные вещества и воду на сахара, вырабатываемые в процессе фотосинтеза.",
|
||||
"Примечательно, что деревья используют этот подземный интернет для передачи химических сигналов бедствия при нападении вредителей, позволяя соседним деревьям синтезировать защитные танины до того, как заражение распространится."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "mycorrhizal fungi", "trans": "микоризные грибы"},
|
||||
{"term": "mycelium", "trans": "мицелий, грибница"},
|
||||
{"term": "subterranean", "trans": "подземный"},
|
||||
{"term": "distress signals", "trans": "сигналы бедствия"},
|
||||
{"term": "infestation", "trans": "заражение вредителями, нашествие"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-07",
|
||||
"title": "Quantum Superposition and the Threshold of Reality",
|
||||
"title_ru": "Квантовая суперпозиция и порог реальности",
|
||||
"topic": "Science",
|
||||
"level": "B2",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"In quantum mechanics, subatomic particles exist simultaneously in multiple probable states until an observation forces the wave function to collapse into a single definitive outcome. This fundamental counterintuitive principle is known as quantum superposition.",
|
||||
"Quantum computers harness this phenomenon by employing qubits instead of classical binary bits. While a traditional bit can only register as a zero or a one, a qubit exists in a superposition of both states, granting exponential computational scaling for cryptographic and molecular simulation algorithms."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"В квантовой механике субатомные частицы существуют одновременно во множестве вероятностных состояний до тех пор, пока наблюдение не заставляет волновую функцию коллапсировать в один определённый исход. Этот фундаментальный парадоксальный принцип известен как квантовая суперпозиция.",
|
||||
"Квантовые компьютеры используют этот феномен, применяя кубиты вместо классических двоичных битов. В то время как традиционный бит может принимать значение только ноль или единица, кубит существует в суперпозиции обоих состояний, обеспечивая экспоненциальное масштабирование вычислений для алгоритмов криптографии и моделирования молекул."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "subatomic particles", "trans": "субатомные частицы"},
|
||||
{"term": "counterintuitive", "trans": "парадоксальный, нелогичный на первый взгляд"},
|
||||
{"term": "harness", "trans": "укрощать, эффективно использовать"},
|
||||
{"term": "qubits", "trans": "кубиты"},
|
||||
{"term": "exponential scaling", "trans": "экспоненциальное масштабирование"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "art-08",
|
||||
"title": "The Evolution of Coffee Culture and the Age of Enlightenment",
|
||||
"title_ru": "Эволюция кофейной культуры и Эпоха Просвещения",
|
||||
"topic": "Culture",
|
||||
"level": "A2",
|
||||
"read_time_min": 2,
|
||||
"paragraphs": [
|
||||
"During the seventeenth century, European coffee houses emerged as lively hubs for intellectual debate, political discussion, and commercial trade. In London, these establishments were nicknamed 'penny universities' because for the price of a cup of coffee, any customer could participate in philosophical discourse.",
|
||||
"Scientists like Isaac Newton and economists like Adam Smith regularly met in coffee houses to draft treatises and debate ideas that laid the foundations of the scientific revolution and modern commerce."
|
||||
],
|
||||
"paragraphs_ru": [
|
||||
"В XVII веке европейские кофейни стали оживлёнными центрами интеллектуальных дебатов, политических дискуссий и коммерческой торговли. В Лондоне эти заведения называли «пенни-университетами», потому что по цене чашки кофе любой посетитель мог поучаствовать в философских рассуждениях.",
|
||||
"Учёные вроде Исаака Ньютона и экономисты вроде Адама Смита регулярно собирались в кофейнях, чтобы составлять трактаты и обсуждать идеи, заложившие основы научной революции и современной коммерции."
|
||||
],
|
||||
"vocabulary_highlights": [
|
||||
{"term": "lively hubs", "trans": "оживлённые центры"},
|
||||
{"term": "philosophical discourse", "trans": "философские рассуждения / дискуссии"},
|
||||
{"term": "draft treatises", "trans": "составлять трактаты"},
|
||||
{"term": "laid the foundations", "trans": "заложили основы"}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
from pathlib import Path
|
||||
from app import config
|
||||
|
||||
_CURATED_ARTICLES_CACHE = None
|
||||
|
||||
def get_curated_articles_list():
|
||||
global _CURATED_ARTICLES_CACHE
|
||||
if _CURATED_ARTICLES_CACHE is None:
|
||||
seeds_file = config.BASE_DIR / 'data' / 'seeds' / 'reading_articles.json'
|
||||
if seeds_file.is_file():
|
||||
try:
|
||||
with open(seeds_file, 'r', encoding='utf-8') as f:
|
||||
_CURATED_ARTICLES_CACHE = json.load(f)
|
||||
except Exception:
|
||||
_CURATED_ARTICLES_CACHE = []
|
||||
else:
|
||||
_CURATED_ARTICLES_CACHE = []
|
||||
return _CURATED_ARTICLES_CACHE
|
||||
|
||||
class _LazyArticlesList(list):
|
||||
def __iter__(self):
|
||||
return iter(get_curated_articles_list())
|
||||
def __len__(self):
|
||||
return len(get_curated_articles_list())
|
||||
def __getitem__(self, idx):
|
||||
return get_curated_articles_list()[idx]
|
||||
|
||||
CURATED_ARTICLES = _LazyArticlesList()
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Default Lesson Presets (Ready-to-use Configurations)
|
||||
|
||||
+23
-194
@@ -56,200 +56,29 @@ PHRASAL_PARTICLES = {
|
||||
"to", "together", "under", "up", "upon", "with"
|
||||
}
|
||||
|
||||
# Curated high-frequency English phrasal verbs (CEFR A2-B2) with clean translations
|
||||
CURATED_PHRASAL_VERBS: Dict[str, str] = {
|
||||
# take
|
||||
"take off": "взлетать; снимать (одежду); быстро уходить",
|
||||
"take up": "браться за (хобби/дело); занимать (место, время)",
|
||||
"take on": "брать на себя (ответственность); нанимать",
|
||||
"take over": "захватывать контроль; вступать во владение",
|
||||
"take in": "усваивать; приютить; обманывать",
|
||||
"take out": "вынимать; приглашать (в ресторан); устранять",
|
||||
"take back": "возвращать (вещь); брать свои слова назад",
|
||||
"take after": "быть похожим на (родителей)",
|
||||
"take apart": "разбирать на части",
|
||||
# give
|
||||
"give up": "сдаваться; бросать (привычку)",
|
||||
"give in": "уступать, сдаваться под натиском",
|
||||
"give away": "раздавать даром; выдавать (секрет)",
|
||||
"give out": "раздавать; иссякать, отказывать",
|
||||
"give back": "возвращать",
|
||||
# get
|
||||
"get along with": "ладить, быть в хороших отношениях с кем-то",
|
||||
"get along": "ладить; справляться",
|
||||
"get away": "убегать, уезжать в отпуск",
|
||||
"get away with": "выходить сухим из воды",
|
||||
"get back": "возвращаться",
|
||||
"get by": "сводить концы с концами, выживать",
|
||||
"get off": "выходить (из автобуса/поезда); отделываться",
|
||||
"get on": "садиться (на транспорт); ладить; продолжать",
|
||||
"get over": "преодолевать, оправляться (от болезни/потери)",
|
||||
"get rid of": "избавляться от",
|
||||
"get through": "справляться; дозваниваться",
|
||||
"get up": "вставать (с постели); подниматься",
|
||||
# go
|
||||
"go on": "продолжать; происходить",
|
||||
"go out": "выходить в свет; встречаться; гаснуть (об огне/свете)",
|
||||
"go through": "проходить через, испытывать (трудности); просматривать",
|
||||
"go back": "возвращаться",
|
||||
"go off": "звонить (о будильнике); взрываться; портиться (о еде)",
|
||||
"go over": "проверять, внимательно просматривать; повторять",
|
||||
"go ahead": "начинать, продолжать; давать добро",
|
||||
"go with": "сочетаться с, подходить к",
|
||||
"go down": "спускаться, снижаться; входить в историю",
|
||||
"go up": "подниматься, расти (о цене)",
|
||||
# come
|
||||
"come up with": "придумывать, предлагать (идею, решение)",
|
||||
"come across": "случайно натолкнуться на, производить впечатление",
|
||||
"come back": "возвращаться",
|
||||
"come in": "входить",
|
||||
"come out": "выходить (в свет); выясняться, обнаруживаться",
|
||||
"come over": "приходить в гости; охватывать",
|
||||
"come on": "давай!; появляться; начинаться",
|
||||
"come up": "возникать, всплывать (о вопросе); подходить",
|
||||
"come down to": "сводиться к",
|
||||
# look
|
||||
"look forward to": "ждать с нетерпением, предвкушать",
|
||||
"look for": "искать",
|
||||
"look after": "присматривать за, заботиться",
|
||||
"look into": "исследовать, изучать, разбираться",
|
||||
"look up": "искать (в словаре/справочнике); улучшаться",
|
||||
"look up to": "уважать, брать пример с",
|
||||
"look down on": "смотреть свысока, презирать",
|
||||
"look out": "остерегаться, быть начеку",
|
||||
"look around": "осматриваться",
|
||||
# turn
|
||||
"turn off": "выключать (прибор, свет, воду)",
|
||||
"turn on": "включать (прибор, свет, воду)",
|
||||
"turn up": "прибавлять громкость; неожиданно объявляться",
|
||||
"turn down": "убавлять громкость; отклонять, отвергать",
|
||||
"turn out": "оказываться; оборачиваться (результатом)",
|
||||
"turn into": "превращаться в",
|
||||
"turn back": "поворачивать назад, разворачиваться",
|
||||
"turn over": "переворачивать; передавать",
|
||||
# set
|
||||
"set up": "устанавливать, организовывать, подготавливать",
|
||||
"set off": "отправляться в путь; вызывать (реакцию)",
|
||||
"set out": "отправляться в путь; намереваться",
|
||||
# put
|
||||
"put on": "надевать (одежду); включать; прибавлять в весе",
|
||||
"put off": "откладывать (на потом); вызывать отвращение",
|
||||
"put out": "тушить (огонь); выпускать (продукцию)",
|
||||
"put up with": "мириться с, терпеть",
|
||||
"put away": "убирать на место",
|
||||
"put forward": "выдвигать (идею/предложение)",
|
||||
# run
|
||||
"run out of": "заканчиваться, исчерпать запасы",
|
||||
"run out": "иссякать, заканчиваться",
|
||||
"run into": "случайно встретить; сталкиваться",
|
||||
"run away": "убегать, сбегать",
|
||||
"run over": "переехать, сбить; повторить бегло",
|
||||
# bring
|
||||
"bring up": "воспитывать (детей); поднимать (тему в разговоре)",
|
||||
"bring about": "вызывать, приводить к",
|
||||
"bring back": "возвращать, вызывать воспоминания",
|
||||
"bring in": "привлекать, вводить (закон/доход)",
|
||||
# call
|
||||
"call off": "отменять (встречу/мероприятие)",
|
||||
"call back": "перезванивать; отзывать",
|
||||
"call on": "навещать; призывать к ответу",
|
||||
"call for": "требовать, предусматривать",
|
||||
# carry
|
||||
"carry out": "выполнять, приводить в исполнение (план/исследование)",
|
||||
"carry on": "продолжать (дело/разговор)",
|
||||
# break
|
||||
"break down": "ломаться (о технике); терять самообладание",
|
||||
"break up": "расставаться (об отношениях); распадаться",
|
||||
"break into": "вламываться, незаконно проникать",
|
||||
"break out": "разразиться (о войне/пожаре); сбегать (из тюрьмы)",
|
||||
# fall
|
||||
"fall apart": "разваливаться на куски, терпеть крах",
|
||||
"fall behind": "отставать (в графике/учёбе)",
|
||||
"fall for": "попасться на удочку; влюбиться по уши",
|
||||
"fall out": "ссориться; выпадать",
|
||||
# keep
|
||||
"keep up with": "поспевать за, держаться наравне с",
|
||||
"keep up": "поддерживать на том же уровне",
|
||||
"keep on": "упорно продолжать",
|
||||
"keep away": "держаться подальше, избегать",
|
||||
# hold
|
||||
"hold on": "подождать (на линии); крепко держаться",
|
||||
"hold up": "задерживать; грабить",
|
||||
"hold back": "сдерживать (эмоции/прогресс)",
|
||||
# point
|
||||
"point out": "указывать, обращать внимание на",
|
||||
# figure
|
||||
"figure out": "выяснить, понять, разобраться",
|
||||
# find
|
||||
"find out": "узнавать, выяснять (информацию)",
|
||||
# show
|
||||
"show up": "появляться, приходить (неожиданно)",
|
||||
"show off": "выпендриваться, хвастаться",
|
||||
# work
|
||||
"work out": "тренироваться; решать проблему; складываться успешно",
|
||||
# catch
|
||||
"catch up with": "догонять, нагонять (упущенное/кого-то)",
|
||||
"catch up": "догонять; наверстывать упущенное",
|
||||
# check
|
||||
"check in": "регистрироваться (в отеле/аэропорту)",
|
||||
"check out": "выселяться; проверять, заценить",
|
||||
# drop
|
||||
"drop in": "заглянуть в гости без предупреждения",
|
||||
"drop by": "зайти мимоходом",
|
||||
"drop off": "подвезти (на машине); заснуть",
|
||||
# end
|
||||
"end up": "оказаться в итоге (где-то или в каком-то состоянии)",
|
||||
# stand
|
||||
"stand out": "выделяться, бросаться в глаза",
|
||||
"stand for": "означать; выступать в защиту",
|
||||
# cut
|
||||
"cut down on": "сокращать потребление (сахара/расходов)",
|
||||
"cut down": "срубать; сокращать",
|
||||
"cut off": "отрезать, прерывать (связь)",
|
||||
# fill
|
||||
"fill in": "заполнять (пропуски/форму); вводить в курс дела",
|
||||
"fill out": "заполнять (анкету/бланк)",
|
||||
# hang
|
||||
"hang out": "проводить время, тусоваться",
|
||||
"hang up": "вешать телефонную трубку",
|
||||
# pass
|
||||
"pass away": "умирать, уходить из жизни",
|
||||
"pass out": "терять сознание, отключаться",
|
||||
# pick
|
||||
"pick up": "подбирать; заезжать за кем-то; учить на лету",
|
||||
# pull
|
||||
"pull through": "справляться, выкарабкиваться (из кризиса/болезни)",
|
||||
"pull over": "съехать на обочину, притормозить",
|
||||
# other essentials
|
||||
"back up": "поддерживать; создавать резервную копию",
|
||||
"clear up": "проясняться (о погоде); убирать, наводить порядок",
|
||||
"slow down": "замедляться",
|
||||
"speed up": "ускоряться",
|
||||
"switch on": "включать",
|
||||
"switch off": "выключать",
|
||||
"throw away": "выбрасывать (мусор)",
|
||||
"try on": "примерять (одежду)",
|
||||
"try out": "пробовать, испытывать",
|
||||
"watch out": "остерегаться, беречься",
|
||||
"write down": "записывать на бумаге",
|
||||
"calm down": "успокаиваться",
|
||||
"cheer up": "приободряться, поднимать настроение",
|
||||
"make up for": "компенсировать, заглаживать вину",
|
||||
"make up": "мириться; сочинять (историю); краситься",
|
||||
"settle down": "остепениться; успокоиться",
|
||||
"sort out": "улаживать, разбираться с проблемами",
|
||||
"blow up": "взрываться; выходить из себя",
|
||||
"burn down": "сгорать дотла",
|
||||
"tear down": "сносить (здание)",
|
||||
"wear out": "изнашиваться; утомлять",
|
||||
"stick to": "придерживаться (плана/правил)",
|
||||
"kick off": "начинать, давать старт",
|
||||
"lock up": "запирать на замок",
|
||||
"pay off": "окупаться; расплачиваться с долгами",
|
||||
"count on": "рассчитывать на кого-то",
|
||||
"stay up": "бодрствовать, не ложиться спать",
|
||||
"speak up": "говорить громче; высказываться смело",
|
||||
}
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
from app import config
|
||||
|
||||
_CURATED_PHRASAL_VERBS_CACHE: Optional[Dict[str, str]] = None
|
||||
|
||||
def get_curated_phrasal_verbs() -> Dict[str, str]:
|
||||
global _CURATED_PHRASAL_VERBS_CACHE
|
||||
if _CURATED_PHRASAL_VERBS_CACHE is None:
|
||||
seeds_file = config.BASE_DIR / "data" / "seeds" / "phrasal_verbs.json"
|
||||
if seeds_file.is_file():
|
||||
try:
|
||||
with open(seeds_file, "r", encoding="utf-8") as f:
|
||||
_CURATED_PHRASAL_VERBS_CACHE = json.load(f)
|
||||
except Exception:
|
||||
_CURATED_PHRASAL_VERBS_CACHE = {}
|
||||
else:
|
||||
_CURATED_PHRASAL_VERBS_CACHE = {}
|
||||
return _CURATED_PHRASAL_VERBS_CACHE
|
||||
|
||||
CURATED_PHRASAL_VERBS: Dict[str, str] = get_curated_phrasal_verbs()
|
||||
|
||||
|
||||
|
||||
def lemmatize_word(w: str) -> List[str]:
|
||||
|
||||
Reference in New Issue
Block a user