init commit
This commit is contained in:
1
src/services/__init__.py
Normal file
1
src/services/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# Services package
|
||||
967
src/services/csv_service.py
Normal file
967
src/services/csv_service.py
Normal file
@@ -0,0 +1,967 @@
|
||||
import pandas as pd
|
||||
import os
|
||||
import logging
|
||||
from typing import List, Dict
|
||||
import aiofiles
|
||||
import csv
|
||||
|
||||
|
||||
class CSVQuizLoader:
|
||||
"""Класс для загрузки викторин из CSV файлов"""
|
||||
|
||||
def __init__(self, csv_data_path: str):
|
||||
self.csv_data_path = csv_data_path
|
||||
|
||||
async def load_questions_from_csv(self, filename: str) -> List[Dict]:
|
||||
"""
|
||||
Загрузка вопросов из CSV файла
|
||||
Формат: Вопрос, Ответ1, Ответ2, Ответ3, Ответ4, Правильный_ответ
|
||||
"""
|
||||
filepath = os.path.join(self.csv_data_path, filename)
|
||||
questions = []
|
||||
|
||||
try:
|
||||
async with aiofiles.open(filepath, mode='r', encoding='utf-8') as file:
|
||||
content = await file.read()
|
||||
|
||||
# Парсим CSV построчно с более надежным парсером
|
||||
lines = content.strip().split('\n')
|
||||
|
||||
# Пропускаем заголовок
|
||||
if lines:
|
||||
lines = lines[1:]
|
||||
|
||||
for line_num, line in enumerate(lines, 2):
|
||||
try:
|
||||
# Используем csv.reader для одной строки
|
||||
reader = csv.reader([line], quotechar='"', delimiter=',', skipinitialspace=True)
|
||||
row = next(reader)
|
||||
|
||||
if len(row) >= 6:
|
||||
# Проверяем, что последний элемент - число
|
||||
correct_answer_str = row[5].strip()
|
||||
try:
|
||||
correct_answer = int(correct_answer_str)
|
||||
except ValueError:
|
||||
logging.error(f"Invalid correct_answer '{correct_answer_str}' in {filename} line {line_num}")
|
||||
continue
|
||||
|
||||
if correct_answer not in [1, 2, 3, 4]:
|
||||
logging.error(f"Correct answer must be 1-4, got {correct_answer} in {filename} line {line_num}")
|
||||
continue
|
||||
|
||||
question_data = {
|
||||
'question': row[0].strip(),
|
||||
'option1': row[1].strip(),
|
||||
'option2': row[2].strip(),
|
||||
'option3': row[3].strip(),
|
||||
'option4': row[4].strip(),
|
||||
'correct_answer': correct_answer
|
||||
}
|
||||
questions.append(question_data)
|
||||
else:
|
||||
logging.warning(f"Not enough columns in {filename} line {line_num}: {len(row)} columns")
|
||||
|
||||
except Exception as row_error:
|
||||
logging.error(f"Error parsing row {line_num} in {filename}: {row_error}")
|
||||
continue
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Error loading CSV {filename}: {e}")
|
||||
return []
|
||||
|
||||
return questions
|
||||
|
||||
async def validate_csv_format(self, filename: str) -> bool:
|
||||
"""Проверка формата CSV файла"""
|
||||
try:
|
||||
questions = await self.load_questions_from_csv(filename)
|
||||
if not questions:
|
||||
return False
|
||||
|
||||
# Проверяем каждый вопрос
|
||||
for q in questions:
|
||||
if (not q['question'] or
|
||||
not all([q['option1'], q['option2'], q['option3'], q['option4']]) or
|
||||
q['correct_answer'] not in [1, 2, 3, 4]):
|
||||
return False
|
||||
|
||||
return True
|
||||
except Exception as e:
|
||||
logging.error(f"CSV validation error: {e}")
|
||||
return False
|
||||
|
||||
def get_available_csv_files(self) -> List[str]:
|
||||
"""Получение списка доступных CSV файлов"""
|
||||
try:
|
||||
files = []
|
||||
for filename in os.listdir(self.csv_data_path):
|
||||
if filename.endswith('.csv'):
|
||||
files.append(filename)
|
||||
return files
|
||||
except Exception as e:
|
||||
logging.error(f"Error getting CSV files: {e}")
|
||||
return []
|
||||
|
||||
|
||||
class QuizGenerator:
|
||||
"""Генератор тестовых данных для викторин"""
|
||||
|
||||
@staticmethod
|
||||
def generate_korean_level_1() -> List[Dict]:
|
||||
"""Генерация вопросов корейского языка уровень 1"""
|
||||
return [
|
||||
{
|
||||
'question': 'Как сказать "привет" на корейском?',
|
||||
'option1': '안녕하세요',
|
||||
'option2': '감사합니다',
|
||||
'option3': '죄송합니다',
|
||||
'option4': '안녕히 가세요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "감사합니다"?',
|
||||
'option1': 'До свидания',
|
||||
'option2': 'Спасибо',
|
||||
'option3': 'Извините',
|
||||
'option4': 'Пожалуйста',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "да" по-корейски?',
|
||||
'option1': '아니요',
|
||||
'option2': '네',
|
||||
'option3': '모르겠어요',
|
||||
'option4': '괜찮아요',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "이름"?',
|
||||
'option1': 'Возраст',
|
||||
'option2': 'Имя',
|
||||
'option3': 'Адрес',
|
||||
'option4': 'Работа',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Как дела?" на корейском?',
|
||||
'option1': '어떻게 지내세요?',
|
||||
'option2': '몇 살이에요?',
|
||||
'option3': '어디에 살아요?',
|
||||
'option4': '뭘 해요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "물"?',
|
||||
'option1': 'Огонь',
|
||||
'option2': 'Вода',
|
||||
'option3': 'Земля',
|
||||
'option4': 'Воздух',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "нет" по-корейски?',
|
||||
'option1': '네',
|
||||
'option2': '아니요',
|
||||
'option3': '좋아요',
|
||||
'option4': '싫어요',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "학생"?',
|
||||
'option1': 'Учитель',
|
||||
'option2': 'Студент',
|
||||
'option3': 'Врач',
|
||||
'option4': 'Повар',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "один" по-корейски?',
|
||||
'option1': '하나',
|
||||
'option2': '둘',
|
||||
'option3': '셋',
|
||||
'option4': '넷',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "집"?',
|
||||
'option1': 'Школа',
|
||||
'option2': 'Дом',
|
||||
'option3': 'Больница',
|
||||
'option4': 'Магазин',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Сколько это стоит?"',
|
||||
'option1': '얼마예요?',
|
||||
'option2': '뭐예요?',
|
||||
'option3': '어디예요?',
|
||||
'option4': '언제예요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "먹다"?',
|
||||
'option1': 'Пить',
|
||||
'option2': 'Есть',
|
||||
'option3': 'Спать',
|
||||
'option4': 'Идти',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "красивый" по-корейски?',
|
||||
'option1': '예쁘다',
|
||||
'option2': '큰다',
|
||||
'option3': '작다',
|
||||
'option4': '좋다',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "시간"?',
|
||||
'option1': 'День',
|
||||
'option2': 'Время',
|
||||
'option3': 'Год',
|
||||
'option4': 'Месяц',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "семья" по-корейски?',
|
||||
'option1': '친구',
|
||||
'option2': '가족',
|
||||
'option3': '선생님',
|
||||
'option4': '동생',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "좋아하다"?',
|
||||
'option1': 'Ненавидеть',
|
||||
'option2': 'Любить/нравиться',
|
||||
'option3': 'Знать',
|
||||
'option4': 'Понимать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "книга" по-корейски?',
|
||||
'option1': '펜',
|
||||
'option2': '책',
|
||||
'option3': '종이',
|
||||
'option4': '연필',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "오다"?',
|
||||
'option1': 'Уходить',
|
||||
'option2': 'Приходить',
|
||||
'option3': 'Стоять',
|
||||
'option4': 'Сидеть',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Где туалет?"',
|
||||
'option1': '화장실이 어디예요?',
|
||||
'option2': '학교가 어디예요?',
|
||||
'option3': '집이 어디예요?',
|
||||
'option4': '병원이 어디예요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "친구"?',
|
||||
'option1': 'Враг',
|
||||
'option2': 'Друг',
|
||||
'option3': 'Учитель',
|
||||
'option4': 'Родитель',
|
||||
'correct_answer': 2
|
||||
}
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
def generate_korean_level_2() -> List[Dict]:
|
||||
"""Генерация вопросов корейского языка уровень 2"""
|
||||
return [
|
||||
{
|
||||
'question': 'Как сказать "Я изучаю корейский язык"?',
|
||||
'option1': '저는 한국어를 배워요',
|
||||
'option2': '저는 영어를 배워요',
|
||||
'option3': '저는 일본어를 배워요',
|
||||
'option4': '저는 중국어를 배워요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "날씨"?',
|
||||
'option1': 'Время',
|
||||
'option2': 'Погода',
|
||||
'option3': 'Место',
|
||||
'option4': 'Люди',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Вчера я ходил в магазин"?',
|
||||
'option1': '어제 가게에 갔어요',
|
||||
'option2': '오늘 가게에 갔어요',
|
||||
'option3': '내일 가게에 갈 거예요',
|
||||
'option4': '지금 가게에 가요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "음식"?',
|
||||
'option1': 'Напиток',
|
||||
'option2': 'Еда',
|
||||
'option3': 'Одежда',
|
||||
'option4': 'Деньги',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Во сколько открывается магазин?"',
|
||||
'option1': '가게가 몇 시에 열어요?',
|
||||
'option2': '가게가 어디에 있어요?',
|
||||
'option3': '가게에서 뭘 팔아요?',
|
||||
'option4': '가게가 언제 문을 닫아요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "여행"?',
|
||||
'option1': 'Работа',
|
||||
'option2': 'Путешествие',
|
||||
'option3': 'Учеба',
|
||||
'option4': 'Отдых',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Мне нужно купить билет"?',
|
||||
'option1': '표를 사야 해요',
|
||||
'option2': '표를 팔아야 해요',
|
||||
'option3': '표를 잃어버렸어요',
|
||||
'option4': '표가 없어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "건강"?',
|
||||
'option1': 'Болезнь',
|
||||
'option2': 'Здоровье',
|
||||
'option3': 'Лекарство',
|
||||
'option4': 'Больница',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Сегодня очень жарко"?',
|
||||
'option1': '오늘 너무 더워요',
|
||||
'option2': '오늘 너무 추워요',
|
||||
'option3': '오늘 비가 와요',
|
||||
'option4': '오늘 눈이 와요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "약속"?',
|
||||
'option1': 'Встреча',
|
||||
'option2': 'Обещание/назначенная встреча',
|
||||
'option3': 'Работа',
|
||||
'option4': 'Дом',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Можно ли здесь курить?"',
|
||||
'option1': '여기서 담배를 피워도 돼요?',
|
||||
'option2': '여기서 음식을 먹어도 돼요?',
|
||||
'option3': '여기서 사진을 찍어도 돼요?',
|
||||
'option4': '여기서 전화해도 돼요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "교통"?',
|
||||
'option1': 'Дорога',
|
||||
'option2': 'Транспорт',
|
||||
'option3': 'Машина',
|
||||
'option4': 'Автобус',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Я опаздываю на работу"?',
|
||||
'option1': '회사에 늦어요',
|
||||
'option2': '회사에 일찍 가요',
|
||||
'option3': '회사에서 쉬어요',
|
||||
'option4': '회사에 안 가요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "문화"?',
|
||||
'option1': 'История',
|
||||
'option2': 'Культура',
|
||||
'option3': 'Искусство',
|
||||
'option4': 'Музыка',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Сколько времени займет дорога?"',
|
||||
'option1': '얼마나 걸려요?',
|
||||
'option2': '얼마예요?',
|
||||
'option3': '몇 개예요?',
|
||||
'option4': '언제예요?',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "경험"?',
|
||||
'option1': 'Знания',
|
||||
'option2': 'Опыт',
|
||||
'option3': 'Умения',
|
||||
'option4': 'Образование',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Я хочу изучать корейскую культуру"?',
|
||||
'option1': '한국 문화를 공부하고 싶어요',
|
||||
'option2': '한국 음식을 먹고 싶어요',
|
||||
'option3': '한국에 가고 싶어요',
|
||||
'option4': '한국 친구를 만나고 싶어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "예약"?',
|
||||
'option1': 'Отмена',
|
||||
'option2': 'Бронирование',
|
||||
'option3': 'Покупка',
|
||||
'option4': 'Продажа',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Извините, я не понимаю"?',
|
||||
'option1': '죄송해요, 이해 못 해요',
|
||||
'option2': '죄송해요, 모르겠어요',
|
||||
'option3': '죄송해요, 못 들었어요',
|
||||
'option4': '죄송해요, 바빠요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "관심"?',
|
||||
'option1': 'Скука',
|
||||
'option2': 'Интерес',
|
||||
'option3': 'Усталость',
|
||||
'option4': 'Радость',
|
||||
'correct_answer': 2
|
||||
}
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
def generate_korean_level_3() -> List[Dict]:
|
||||
"""Генерация вопросов корейского языка уровень 3"""
|
||||
return [
|
||||
{
|
||||
'question': 'Как правильно сказать "Я должен был прийти вчера"?',
|
||||
'option1': '어제 와야 했어요',
|
||||
'option2': '어제 왔어요',
|
||||
'option3': '어제 올 거예요',
|
||||
'option4': '어제 오고 싶었어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "끝나다"?',
|
||||
'option1': 'Начинаться',
|
||||
'option2': 'Заканчиваться',
|
||||
'option3': 'Продолжаться',
|
||||
'option4': 'Останавливаться',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Хотя дождь идет, я все равно пойду"?',
|
||||
'option1': '비가 와도 갈 거예요',
|
||||
'option2': '비가 와서 안 갈 거예요',
|
||||
'option3': '비가 오면 갈 거예요',
|
||||
'option4': '비가 오니까 갈 거예요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "준비하다"?',
|
||||
'option1': 'Убирать',
|
||||
'option2': 'Готовить(ся)',
|
||||
'option3': 'Заканчивать',
|
||||
'option4': 'Начинать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как спросить "Не могли бы вы мне помочь?"',
|
||||
'option1': '도와주실 수 있어요?',
|
||||
'option2': '도와주세요',
|
||||
'option3': '도와줘야 해요',
|
||||
'option4': '도와주고 싶어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "복잡하다"?',
|
||||
'option1': 'Простой',
|
||||
'option2': 'Сложный',
|
||||
'option3': 'Легкий',
|
||||
'option4': 'Понятный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Чем больше изучаю, тем интереснее становится"?',
|
||||
'option1': '공부할수록 재미있어져요',
|
||||
'option2': '공부하면 재미있어요',
|
||||
'option3': '공부해서 재미있어요',
|
||||
'option4': '공부하니까 재미있어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "발표하다"?',
|
||||
'option1': 'Слушать',
|
||||
'option2': 'Презентовать',
|
||||
'option3': 'Записывать',
|
||||
'option4': 'Читать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Я привык к корейской еде"?',
|
||||
'option1': '한국 음식에 익숙해졌어요',
|
||||
'option2': '한국 음식을 좋아해요',
|
||||
'option3': '한국 음식을 먹어요',
|
||||
'option4': '한국 음식이 맛있어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "놀라다"?',
|
||||
'option1': 'Радоваться',
|
||||
'option2': 'Удивляться',
|
||||
'option3': 'Грустить',
|
||||
'option4': 'Злиться',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Если бы я знал корейский лучше..."?',
|
||||
'option1': '한국어를 더 잘 알았다면...',
|
||||
'option2': '한국어를 더 잘 알아요',
|
||||
'option3': '한국어를 더 잘 알고 싶어요',
|
||||
'option4': '한국어를 더 잘 배워요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "실수하다"?',
|
||||
'option1': 'Успешно делать',
|
||||
'option2': 'Ошибаться',
|
||||
'option3': 'Исправлять',
|
||||
'option4': 'Проверять',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "По-видимому, он не придет"?',
|
||||
'option1': '아마 안 올 것 같아요',
|
||||
'option2': '분명히 안 와요',
|
||||
'option3': '꼭 안 와요',
|
||||
'option4': '절대 안 와요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "통역하다"?',
|
||||
'option1': 'Изучать',
|
||||
'option2': 'Переводить (устно)',
|
||||
'option3': 'Говорить',
|
||||
'option4': 'Слушать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Я так и думал"?',
|
||||
'option1': '그럴 줄 알았어요',
|
||||
'option2': '그렇게 생각해요',
|
||||
'option3': '그런 것 같아요',
|
||||
'option4': '그러면 좋겠어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "주의하다"?',
|
||||
'option1': 'Игнорировать',
|
||||
'option2': 'Быть внимательным',
|
||||
'option3': 'Забывать',
|
||||
'option4': 'Расслабляться',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Мне стало лучше после отдыха"?',
|
||||
'option1': '쉬고 나서 나아졌어요',
|
||||
'option2': '쉬어서 좋아요',
|
||||
'option3': '쉬고 싶어요',
|
||||
'option4': '쉬면서 좋아요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "전달하다"?',
|
||||
'option1': 'Получать',
|
||||
'option2': 'Передавать',
|
||||
'option3': 'Хранить',
|
||||
'option4': 'Терять',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Несмотря на трудности, продолжу"?',
|
||||
'option1': '어려워도 계속할 거예요',
|
||||
'option2': '어려우면 그만할 거예요',
|
||||
'option3': '어려우니까 못 해요',
|
||||
'option4': '어려워서 포기해요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "기대하다"?',
|
||||
'option1': 'Бояться',
|
||||
'option2': 'Ожидать',
|
||||
'option3': 'Избегать',
|
||||
'option4': 'Отказываться',
|
||||
'correct_answer': 2
|
||||
}
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
def generate_korean_level_4() -> List[Dict]:
|
||||
"""Генерация вопросов корейского языка уровень 4"""
|
||||
return [
|
||||
{
|
||||
'question': 'Как правильно выразить "Говорят, что он очень умный"?',
|
||||
'option1': '그가 아주 똑똑하다고 해요',
|
||||
'option2': '그는 아주 똑똑해요',
|
||||
'option3': '그가 아주 똑똑할 거예요',
|
||||
'option4': '그는 아주 똑똑하고 싶어해요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "억지로"?',
|
||||
'option1': 'Добровольно',
|
||||
'option2': 'Принудительно',
|
||||
'option3': 'Естественно',
|
||||
'option4': 'Случайно',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Было бы хорошо, если бы ты пришел"?',
|
||||
'option1': '네가 왔으면 좋겠어요',
|
||||
'option2': '네가 와서 좋아요',
|
||||
'option3': '네가 올 거예요',
|
||||
'option4': '네가 오면 돼요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "상당히"?',
|
||||
'option1': 'Немного',
|
||||
'option2': 'Довольно, значительно',
|
||||
'option3': 'Совсем нет',
|
||||
'option4': 'Только',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Не только..., но и..."?',
|
||||
'option1': '뿐만 아니라',
|
||||
'option2': '그리고',
|
||||
'option3': '하지만',
|
||||
'option4': '그래서',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "겸손하다"?',
|
||||
'option1': 'Гордиться',
|
||||
'option2': 'Быть скромным',
|
||||
'option3': 'Хвастаться',
|
||||
'option4': 'Завидовать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "По сравнению с прошлым годом"?',
|
||||
'option1': '작년에 비해서',
|
||||
'option2': '작년부터',
|
||||
'option3': '작년처럼',
|
||||
'option4': '작년까지',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "숙제하다"?',
|
||||
'option1': 'Отдыхать',
|
||||
'option2': 'Делать домашнее задание',
|
||||
'option3': 'Играть',
|
||||
'option4': 'Работать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Чем дальше, тем труднее становится"?',
|
||||
'option1': '갈수록 어려워져요',
|
||||
'option2': '가면 어려워요',
|
||||
'option3': '가서 어려워요',
|
||||
'option4': '가니까 어려워요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "포기하다"?',
|
||||
'option1': 'Продолжать',
|
||||
'option2': 'Сдаваться',
|
||||
'option3': 'Начинать',
|
||||
'option4': 'Повторять',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Я делаю вид, что не знаю"?',
|
||||
'option1': '모르는 척해요',
|
||||
'option2': '정말 몰라요',
|
||||
'option3': '알고 싶지 않아요',
|
||||
'option4': '알려주지 않아요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "극복하다"?',
|
||||
'option1': 'Избегать',
|
||||
'option2': 'Преодолевать',
|
||||
'option3': 'Создавать',
|
||||
'option4': 'Ухудшать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "В зависимости от обстоятельств"?',
|
||||
'option1': '상황에 따라서',
|
||||
'option2': '상황을 위해서',
|
||||
'option3': '상황과 같이',
|
||||
'option4': '상황을 통해서',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "절약하다"?',
|
||||
'option1': 'Тратить',
|
||||
'option2': 'Экономить',
|
||||
'option3': 'Зарабатывать',
|
||||
'option4': 'Терять',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Стоит попробовать"?',
|
||||
'option1': '해 볼 만해요',
|
||||
'option2': '하고 싶어요',
|
||||
'option3': '해야 돼요',
|
||||
'option4': '할 수 있어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "원래"?',
|
||||
'option1': 'Сейчас',
|
||||
'option2': 'Изначально',
|
||||
'option3': 'Потом',
|
||||
'option4': 'Никогда',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Я думаю о том, чтобы поехать в Корею"?',
|
||||
'option1': '한국에 갈까 생각하고 있어요',
|
||||
'option2': '한국에 가고 싶어요',
|
||||
'option3': '한국에 갈 거예요',
|
||||
'option4': '한국에 가야 해요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "신경 쓰다"?',
|
||||
'option1': 'Игнорировать',
|
||||
'option2': 'Беспокоиться о чем-то',
|
||||
'option3': 'Забывать',
|
||||
'option4': 'Отдыхать',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Кажется, что будет дождь"?',
|
||||
'option1': '비가 올 것 같아요',
|
||||
'option2': '비가 와요',
|
||||
'option3': '비가 왔어요',
|
||||
'option4': '비가 오면 좋겠어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "감동하다"?',
|
||||
'option1': 'Скучать',
|
||||
'option2': 'Быть тронутым',
|
||||
'option3': 'Злиться',
|
||||
'option4': 'Волноваться',
|
||||
'correct_answer': 2
|
||||
}
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
def generate_korean_level_5() -> List[Dict]:
|
||||
"""Генерация вопросов корейского языка уровень 5"""
|
||||
return [
|
||||
{
|
||||
'question': 'Как правильно выразить "Если бы я не опоздал, я бы встретил его"?',
|
||||
'option1': '늦지 않았더라면 그를 만났을 텐데요',
|
||||
'option2': '늦지 않으면 그를 만날 거예요',
|
||||
'option3': '늦지 않아서 그를 만났어요',
|
||||
'option4': '늦지 않았으니까 그를 만나요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "간접적으로"?',
|
||||
'option1': 'Прямо',
|
||||
'option2': 'Косвенно',
|
||||
'option3': 'Быстро',
|
||||
'option4': 'Медленно',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Хоть я и не эксперт, но думаю..."?',
|
||||
'option1': '전문가는 아니지만 제 생각에는...',
|
||||
'option2': '전문가라서 제 생각에는...',
|
||||
'option3': '전문가가 되고 싶어서...',
|
||||
'option4': '전문가처럼 생각해요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "의존하다"?',
|
||||
'option1': 'Быть независимым',
|
||||
'option2': 'Зависеть от чего-то',
|
||||
'option3': 'Помогать',
|
||||
'option4': 'Противостоять',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "По мере того как время идет"?',
|
||||
'option1': '시간이 흘러가면서',
|
||||
'option2': '시간이 있으면서',
|
||||
'option3': '시간을 보내면서',
|
||||
'option4': '시간이 부족해서',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "추상적이다"?',
|
||||
'option1': 'Конкретный',
|
||||
'option2': 'Абстрактный',
|
||||
'option3': 'Простой',
|
||||
'option4': 'Реальный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Не то чтобы я не хотел, просто у меня нет времени"?',
|
||||
'option1': '하기 싫은 건 아니고 시간이 없을 뿐이에요',
|
||||
'option2': '하기 싫어서 시간이 없어요',
|
||||
'option3': '시간이 없어서 하기 싫어요',
|
||||
'option4': '하고 싶지만 시간이 없어요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "편견"?',
|
||||
'option1': 'Объективность',
|
||||
'option2': 'Предрассудок',
|
||||
'option3': 'Понимание',
|
||||
'option4': 'Знание',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Чем больше думаю об этом, тем страннее кажется"?',
|
||||
'option1': '생각하면 할수록 이상해요',
|
||||
'option2': '생각해서 이상해요',
|
||||
'option3': '생각하니까 이상해요',
|
||||
'option4': '생각하면 이상할 거예요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "현실적이다"?',
|
||||
'option1': 'Нереалистичный',
|
||||
'option2': 'Реалистичный',
|
||||
'option3': 'Фантастичный',
|
||||
'option4': 'Идеалистичный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Даже если бы я попытался объяснить..."?',
|
||||
'option1': '아무리 설명하려고 해도...',
|
||||
'option2': '설명해서...',
|
||||
'option3': '설명하니까...',
|
||||
'option4': '설명하면...',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "적극적으로"?',
|
||||
'option1': 'Пассивно',
|
||||
'option2': 'Активно',
|
||||
'option3': 'Медленно',
|
||||
'option4': 'Осторожно',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "В том случае, если случится проблема"?',
|
||||
'option1': '문제가 생길 경우에는',
|
||||
'option2': '문제가 생겨서',
|
||||
'option3': '문제가 생기니까',
|
||||
'option4': '문제가 생기면서',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "객관적이다"?',
|
||||
'option1': 'Субъективный',
|
||||
'option2': 'Объективный',
|
||||
'option3': 'Личный',
|
||||
'option4': 'Эмоциональный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "Я склонен думать, что..."?',
|
||||
'option1': '...라고 생각하는 편이에요',
|
||||
'option2': '...라고 생각해요',
|
||||
'option3': '...라고 알아요',
|
||||
'option4': '...라고 느껴요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "혁신적이다"?',
|
||||
'option1': 'Традиционный',
|
||||
'option2': 'Инновационный',
|
||||
'option3': 'Старомодный',
|
||||
'option4': 'Обычный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как сказать "Несмотря на то что я много работал, результат не очень хороший"?',
|
||||
'option1': '많이 노력했는데도 불구하고 결과가 좋지 않아요',
|
||||
'option2': '많이 노력해서 결과가 좋아요',
|
||||
'option3': '많이 노력하면 결과가 좋을 거예요',
|
||||
'option4': '많이 노력하니까 결과가 좋아요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "효율적이다"?',
|
||||
'option1': 'Неэффективный',
|
||||
'option2': 'Эффективный',
|
||||
'option3': 'Медленный',
|
||||
'option4': 'Бесполезный',
|
||||
'correct_answer': 2
|
||||
},
|
||||
{
|
||||
'question': 'Как выразить "По-видимому, это не так просто, как казалось"?',
|
||||
'option1': '생각보다 간단하지 않은 것 같아요',
|
||||
'option2': '생각해서 간단하지 않아요',
|
||||
'option3': '생각하니까 간단해요',
|
||||
'option4': '생각하면 간단할 거예요',
|
||||
'correct_answer': 1
|
||||
},
|
||||
{
|
||||
'question': 'Что означает "체계적으로"?',
|
||||
'option1': 'Хаотично',
|
||||
'option2': 'Систематично',
|
||||
'option3': 'Случайно',
|
||||
'option4': 'Быстро',
|
||||
'correct_answer': 2
|
||||
}
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
async def create_all_korean_csv_files(data_path: str):
|
||||
"""Создание всех CSV файлов с корейскими тестами"""
|
||||
levels_data = {
|
||||
1: QuizGenerator.generate_korean_level_1(),
|
||||
2: QuizGenerator.generate_korean_level_2(),
|
||||
3: QuizGenerator.generate_korean_level_3(),
|
||||
4: QuizGenerator.generate_korean_level_4(),
|
||||
5: QuizGenerator.generate_korean_level_5(),
|
||||
}
|
||||
|
||||
for level, questions in levels_data.items():
|
||||
filename = f"korean_level_{level}.csv"
|
||||
filepath = os.path.join(data_path, filename)
|
||||
|
||||
# Создаем CSV файл
|
||||
async with aiofiles.open(filepath, mode='w', encoding='utf-8', newline='') as file:
|
||||
await file.write("Вопрос,Ответ1,Ответ2,Ответ3,Ответ4,Правильный_ответ\n")
|
||||
for q in questions:
|
||||
# Экранируем кавычки в текстах
|
||||
question = q["question"].replace('"', '""')
|
||||
option1 = q["option1"].replace('"', '""')
|
||||
option2 = q["option2"].replace('"', '""')
|
||||
option3 = q["option3"].replace('"', '""')
|
||||
option4 = q["option4"].replace('"', '""')
|
||||
|
||||
line = f'"{question}","{option1}","{option2}","{option3}","{option4}",{q["correct_answer"]}\n'
|
||||
await file.write(line)
|
||||
Reference in New Issue
Block a user