| import json |
| import os |
| from parser import get_fallback_courses |
|
|
| def load_courses(): |
| """Загружает курсы из JSON файла или возвращает fallback""" |
| try: |
| courses_file = 'data/processed/courses.json' |
| if os.path.exists(courses_file): |
| with open(courses_file, 'r', encoding='utf-8') as f: |
| courses = json.load(f) |
| return courses |
| else: |
| |
| return get_fallback_courses() |
| except Exception as e: |
| print(f'Ошибка загрузки курсов: {e}') |
| return get_fallback_courses() |
|
|
| def filter_courses(query, program_id=None, semester=None): |
| """Фильтрация курсов по запросу и параметрам""" |
| courses = load_courses() |
| query_lower = query.lower() |
| |
| filtered = [] |
| |
| for course in courses: |
| |
| if program_id and course.get('program_id') != program_id: |
| continue |
| |
| |
| if semester and course.get('semester') != semester: |
| continue |
| |
| |
| course_text = f"{course.get('name', '')} {course.get('short_desc', '')} {' '.join(course.get('tags', []))}".lower() |
| |
| if any(word in course_text for word in query_lower.split()): |
| filtered.append(course) |
| |
| return filtered[:8] |
|
|
| def recommend_courses(profile): |
| """Рекомендации курсов на основе профиля студента""" |
| courses = load_courses() |
| |
| programming_exp = profile.get('programming_experience', 2) |
| math_level = profile.get('math_level', 2) |
| interests = profile.get('interests', []) |
| semester = profile.get('semester') |
| |
| |
| if semester: |
| courses = [c for c in courses if c.get('semester') == semester] |
| |
| |
| scored_courses = [] |
| |
| for course in courses: |
| score = 0 |
| |
| |
| if programming_exp <= 2 and 'python' in course.get('tags', []): |
| score += 2 |
| elif 2 <= programming_exp <= 4 and 'ml' in course.get('tags', []): |
| score += 2 |
| elif programming_exp >= 4 and 'dl' in course.get('tags', []): |
| score += 2 |
| |
| |
| if math_level >= 2 and 'math' in course.get('tags', []): |
| score += 2 |
| if math_level >= 3 and 'stats' in course.get('tags', []): |
| score += 1 |
| |
| |
| matching_tags = [tag for tag in interests if tag in course.get('tags', [])] |
| score += len(matching_tags) * 3 |
| |
| |
| if 'product' in interests or 'business' in interests: |
| if course.get('program_id') == 'ai_product': |
| score += 2 |
| |
| if score > 0: |
| scored_courses.append((course, score)) |
| |
| |
| scored_courses.sort(key=lambda x: x[1], reverse=True) |
| return [course for course, score in scored_courses[:7]] |
|
|
| def is_relevant(message): |
| """Проверяет релевантность вопроса""" |
| itmo_keywords = [ |
| 'итмо', 'магистратура', 'учебный план', 'дисциплина', 'курс', |
| 'ии', 'ai', 'ai product', 'институт ии', 'программа', |
| 'машинное обучение', 'глубокое обучение', 'nlp', 'компьютерное зрение', |
| 'продукт', 'аналитика', 'управление', 'обучение', 'учеба' |
| ] |
| |
| message_lower = message.lower() |
| |
| |
| if any(keyword in message_lower for keyword in itmo_keywords): |
| return True |
| |
| |
| courses = load_courses() |
| for course in courses: |
| if course.get('name', '').lower() in message_lower: |
| return True |
| |
| return False |
|
|
| def get_program_info(program_id): |
| """Получает информацию о программе""" |
| programs = { |
| 'ai': { |
| 'name': 'Искусственный интеллект', |
| 'description': 'Программа готовит специалистов в области машинного обучения, глубокого обучения, обработки естественного языка и компьютерного зрения.', |
| 'duration': '2 года (4 семестра)', |
| 'credits_total': 120, |
| 'career': 'ML Engineer, Data Scientist, Research Scientist, AI Developer' |
| }, |
| 'ai_product': { |
| 'name': 'AI Product Management', |
| 'description': 'Программа готовит продуктовых менеджеров, способных создавать и развивать ИИ-продукты.', |
| 'duration': '2 года (4 семестра)', |
| 'credits_total': 120, |
| 'career': 'Product Manager, AI Product Manager, Business Analyst, Product Owner' |
| } |
| } |
| |
| return programs.get(program_id) |
|
|