test5 / data_layer.py
vydrking's picture
Update data_layer.py
4cc1fd7 verified
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:
# Если файла нет, возвращаем fallback
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] # Ограничиваем до 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
# Бонус за product/business интересы для AI Product программы
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))
# Сортируем по score и возвращаем топ-7
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)