You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
11 KiB

5 months ago
import json
from flask import Flask
from flask_cors import CORS
from flask import request
# from shixun_recommend_online import shixun_recommend_online
from shixun_recommend_offline import shixun_recommend_offline
from shixun_partner_recommend import shixun_partner_recommend
from relevant_shixun_recommend import relevant_shixun_recommend
# from subject_recommend_online import subject_recommend_online
from subject_recommend_offline import subject_recommend_offline
from subject_partner_recommend import subject_partner_recommend
from relevant_subject_recommend import relevant_subject_recommend
app = Flask(__name__)
CORS(app, resources = r'/*')
@app.route('/shixun_recommend', methods=["POST"])
def get_shixun():
'''
以RESTful的方式获取实训推荐模型结果
传入参数为: user_id, topk, rank_method, disciplines
:param user_id: 用户ID
:param topk: 需要返回的实训数量
:param rank_method: 使用的深度学习排序模型
0: xDeepFM 1: BST 2: DIFM
:param disciplines: 兴趣标签ID多个以英文逗号分隔
:return 以json格式返回推荐的topk个实训
'''
result = {}
user_id = request.form.get('user_id', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
rank_method = request.form.get('rank_method', type=str, default='2')
disciplines = request.form.get('disciplines', type=str, default='')
if rank_method.strip() == '':
rank_method = '2'
if user_id.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少user_id')
}
return json.dumps(result, ensure_ascii=False)
if rank_method.strip() not in ['0', '1', '2']:
result = {
"status_code": str('False'),
"error_msg": str('参数错误: rank_method参数不合法')
}
return json.dumps(result, ensure_ascii=False)
# 以逗号分隔兴趣标签为列表
disciplines = str(disciplines).strip().split(',')
# 没传值时的处理
if len(disciplines) == 1 and disciplines[0] == '':
disciplines.clear()
if (len(disciplines) > 0):
disciplines = [int(i) for i in disciplines]
if (topk == '') or (topk < 10):
topk = 10
# 最多返回320个也就是20页
if (topk > 320):
topk = 320
recommend_results = shixun_recommend_offline(int(user_id),
list(disciplines),
int(topk),
str(rank_method))
result = {
"status_code": str('True'),
"user_id": str(user_id),
"recommend_count": str(len(dict(recommend_results))),
"recommend_results": dict(recommend_results),
}
return json.dumps(result, ensure_ascii=False)
@app.route('/shixun_partner_recommend', methods=["POST"])
def get_shixun_partner():
'''
以RESTful的方式获取实训学习伙伴推荐模型结果
:param user_id: 用户ID
:param topk: 需要返回的用户数量
:param method: 返回数据的方式 0返回用户及选择的实训列表 1只返回用户列
:return 以json格式返回topk个实训学习伙伴
'''
result = {}
user_id = request.form.get('user_id', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
method = request.form.get('method', type=str, default='1')
if user_id.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少user_id')
}
return json.dumps(result, ensure_ascii=False)
if method.strip() == '':
method = '1'
if (topk == '') or (topk < 10):
topk = 10
if (topk > 100):
topk = 100
recommend_results = shixun_partner_recommend(int(user_id), int(topk), str(method))
result = {
"status_code": str('True'),
"user_id": str(user_id),
"recommend_count": str(len(recommend_results)),
"recommend_results": recommend_results,
}
return json.dumps(result, ensure_ascii=False)
@app.route('/relevant_shixun_recommend', methods=["POST"])
def get_relevant_shixun():
'''
以RESTful的方式获取实训相关实训推荐模型结果
:param shixun_id: 实训ID
:param shixun_name: 实训名称
:param topk: 需要返回的实训数量
:return 以json格式返回topk个相关实训
'''
result = {}
shixun_id = request.form.get('shixun_id', type=str, default='')
shixun_name = request.form.get('shixun_name', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
if (shixun_id.strip() == '') or (shixun_name.strip() == ''):
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少shixun_id')
}
return json.dumps(result, ensure_ascii=False)
if shixun_name.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少shixun_name')
}
return json.dumps(result, ensure_ascii=False)
if (topk == '') or (topk < 10):
topk = 10
if (topk > 100):
topk = 100
recommend_results = relevant_shixun_recommend(int(shixun_id),
str(shixun_name),
int(topk))
result = {
"status_code": str('True'),
"shixun_id": str(shixun_id),
"shixun_name": str(shixun_name),
"recommend_count": str(len(dict(recommend_results))),
"recommend_results": dict(recommend_results),
}
return json.dumps(result, ensure_ascii=False)
@app.route('/subject_recommend', methods=["POST"])
def get_subject():
'''
以RESTful的方式获取课程推荐模型结果
传入参数为: user_id, topk, rank_method, disciplines
:param user_id: 用户ID
:param topk: 需要返回的课程数量
:param rank_method: 使用的深度学习排序模型
0: xDeepFM 1: BST 2: DIFM
:param disciplines: 兴趣标签ID多个以英文逗号分隔
:return 以json格式返回推荐的topk个课程
'''
result = {}
user_id = request.form.get('user_id', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
rank_method = request.form.get('rank_method', type=str, default='2')
disciplines = request.form.get('disciplines', type=str, default='')
if rank_method.strip() == '':
rank_method = '2'
if user_id.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少user_id')
}
return json.dumps(result, ensure_ascii=False)
if rank_method.strip() not in ['0', '1', '2', '3']:
result = {
"status_code": str('False'),
"error_msg": str('参数错误: rank_method参数不合法')
}
return json.dumps(result, ensure_ascii=False)
# 以逗号分隔兴趣标签为列表
disciplines = str(disciplines).strip().split(',')
# 没传值时的处理
if len(disciplines) == 1 and disciplines[0] == '':
disciplines.clear()
if (len(disciplines) > 0):
disciplines = [int(i) for i in disciplines]
if (topk == '') or (topk < 10):
topk = 10
# 最多返回320个也就是20页
if (topk > 320):
topk = 320
recommend_results = subject_recommend_offline(int(user_id),
list(disciplines),
int(topk),
str(rank_method))
result = {
"status_code": str('True'),
"user_id": str(user_id),
"recommend_count": str(len(dict(recommend_results))),
"recommend_results": dict(recommend_results),
}
return json.dumps(result, ensure_ascii=False)
@app.route('/subject_partner_recommend', methods=["POST"])
def get_subject_partner():
'''
以RESTful的方式获取课程学习伙伴推荐模型结果
:param user_id: 用户ID
:param topk: 需要返回的用户数量
:param method: 返回数据的方式 0返回用户及选择的课程列表 1只返回用户列表
:return 以json格式返回topk个课程学习伙伴
'''
result = {}
user_id = request.form.get('user_id', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
method = request.form.get('method', type=str, default='1')
if user_id.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少user_id')
}
return json.dumps(result, ensure_ascii=False)
if method.strip() == '':
method = '1'
if (topk == '') or (topk < 10):
topk = 10
if (topk > 100):
topk = 100
recommend_results = subject_partner_recommend(int(user_id), int(topk), str(method))
result = {
"status_code": str('True'),
"user_id": str(user_id),
"recommend_count": str(len(recommend_results)),
"recommend_results": recommend_results,
}
return json.dumps(result, ensure_ascii=False)
@app.route('/relevant_subject_recommend', methods=["POST"])
def get_relevant_subject():
'''
以RESTful的方式获取实训相关课程推荐模型结果
:param subject_id: 课程ID
:param subject_name: 课程名称
:param topk: 需要返回的课程数量
:return 以json格式返回topk个相关课程
'''
result = {}
subject_id = request.form.get('subject_id', type=str, default='')
subject_name = request.form.get('subject_name', type=str, default='')
topk = request.form.get('topk', type=int, default=20)
if (subject_id.strip() == '') or (subject_name.strip() == ''):
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少subject_id')
}
return json.dumps(result, ensure_ascii=False)
if subject_name.strip() == '':
result = {
"status_code": str('False'),
"error_msg": str('参数错误: 缺少subject_name')
}
return json.dumps(result, ensure_ascii=False)
if (topk == '') or (topk < 10):
topk = 10
if (topk > 100):
topk = 100
recommend_results = relevant_subject_recommend(int(subject_id),
str(subject_name),
int(topk))
result = {
"status_code": str('True'),
"subject_id": str(subject_id),
"subject_name": str(subject_name),
"recommend_count": str(len(dict(recommend_results))),
"recommend_results": dict(recommend_results),
}
return json.dumps(result, ensure_ascii=False)
# python -m flask run
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8087, debug=True, use_reloader=False)