-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcourse_recommender.py
120 lines (91 loc) · 4 KB
/
course_recommender.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from flask import Flask, request, jsonify
from bson import ObjectId
import pymongo
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import json
import datetime
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
PASS = os.getenv('PASS')
USER = os.getenv('USER')
app = Flask(__name__)
#connection to the mongo client
client = pymongo.MongoClient(f"mongodb+srv://{USER}:{PASS}@cluster0.jrov4ez.mongodb.net/?retryWrites=true&w=majority")
db = client.test
collection = db['students']
Courses = db.courses
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
elif isinstance(o, datetime):
return o.isoformat()
return super().default(o)
@app.route('/recommendations', methods=["GET"])
def generate_rec_and_learning_path():
user_email = request.args.get('user_email')
user = collection.find_one({"email": user_email})
if not user or "interests" not in user:
return jsonify({"error": "User interests not found"}), 404
user_interests = user["interests"]
# Retrieve courses from the DB
courses = list(Courses.find())
all_texts = [user_interests] + [f"{course['title']} {course['description']}" for course in courses]
all_texts_flattened = [item if isinstance(item, str) else ' '.join(item) for item in all_texts]
all_texts_flattened = [str(item) for item in all_texts_flattened]
# Vectorize user interests and courses using a single TfidfVectorizer
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(all_texts_flattened)
# Calculate cosine similarities
user_vector = vectors[0]
course_vectors = vectors[1:]
cosine_similarities = cosine_similarity(user_vector, course_vectors).flatten()
# print("User Interests:", ' '.join(user_interests))
# Print courses with their descriptions and cosine similarities
# debug statements
# for course, similarity in zip(courses, cosine_similarities):
# print(f"\nCourse: {course['title']}")
# print(f"Description: {course['description']}")
# print(f"Cosine Similarity: {similarity}")
top_indices = cosine_similarities.argsort()[-5:][::-1]
top_indices = [int(index) for index in top_indices]
# Check if courses list is long enough
if max(top_indices) >= len(courses):
return jsonify({"error": "Not enough courses available"}), 500
similarity_threshold = 0.2
# Get top courses with similarity above the threshold
top_courses = [dict(course) for course, similarity in zip(courses, cosine_similarities) if similarity > similarity_threshold]
# Convert ObjectId to string for JSON serialization
for course in top_courses:
course['_id'] = str(course['_id'])
course['createdAt'] = course['createdAt'].isoformat()
course['updatedAt'] = course['updatedAt'].isoformat()
# Return recommended courses in JSON format
return JSONEncoder().encode({"recommendedCourses": top_courses})
# @app.route('/learning_path',methods=["POST"])
# def generate_learning_path():
# user_query = request.json.get('user_query')
# if not user_query:
# return jsonify({'error':'Query is not given'}),404
# # prompt = f"You are a helpful assistant. Create a flowchart for the user's learning path: {', '.join(user_query)}"
# client1 = OpenAI()
# # client1.api_key = ""
# # response = client1.chat.completions.create(
# # model="gpt-3.5-turbo",
# # messages=[
# # {"role": "system", "content": prompt},
# # # {"role": "user", "content": user_query},
# # ]
# # )
# # Make a request to the Chat API
# response = client1.Completion.create(
# engine="text-davinci-002",
# prompt=f"Create a flowchart for the user's learning path: {user_query}",
# max_tokens=150
# )
# return jsonify({response['choices'][0]['text']})
if __name__ == '__main__':
app.run(debug=True)