|
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) |
|
|