dream
113 строк · 3.4 Кб
1import logging2import time3import os4import pickle5
6import numpy as np7from flask import Flask, request, jsonify8import sentry_sdk9
10sentry_sdk.init(os.getenv("SENTRY_DSN"))11
12
13logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)14logger = logging.getLogger(__name__)15
16app = Flask(__name__)17
18DATABASE_PATH = os.getenv("DATABASE_PATH")19
20TOP_V = 321TOP_K = 322
23scenario_skills = [24"dff_animals_skill",25"news_api_skill",26"dff_food_skill",27"dff_travel_skill",28"dff_sport_skill",29"dff_science_skill",30"dff_music_skill",31"game_cooperative_skill",32"dff_book_skill",33"dff_movie_skill",34"dff_gossip_skill",35]
36
37topic2skill = {38"Movies_TV": "dff_movie_skill",39"Music": "dff_music_skill",40"SciTech": "dff_science_skill",41"Literature": "dff_book_skill",42"Travel_Geo": "dff_travel_skill",43"Celebrities": "dff_gossip_skill",44"Games": "game_cooperative_skill",45"Pets_Animals": "dff_animals_skill",46"Sports": "dff_sport_skill",47"Food_Drink": "dff_food_skill",48"News": "news_api_skill",49}
50
51
52with open(DATABASE_PATH, "rb") as f:53database = pickle.load(f)54
55
56def get_candidate_topics(embedding):57scores = np.array(embedding).dot(np.array(database).T)58top_indices = np.argsort(scores)[::-1]59similarity_vector = np.sum(np.array([database[top_idx] for top_idx in top_indices[:TOP_V]]), 0)60candidate_topics_idx = np.argsort(similarity_vector)[::-1][:TOP_K]61candidate_topics = [scenario_skills[idx] for idx in candidate_topics_idx]62return candidate_topics63
64
65def handler(requested_data):66st_time = time.time()67logger.warning(requested_data)68
69active_skills_batch = requested_data["active_skills"]70cobot_topics_batch = requested_data["cobot_topics"]71
72candidate_topics_batch = []73
74for active_skills, cobot_topics in zip(active_skills_batch, cobot_topics_batch):75try:76skills_dict = {skill: 0 for skill in scenario_skills}77
78for skill in active_skills:79if skill in scenario_skills:80skills_dict[skill] += 181
82for topic in cobot_topics:83if topic in topic2skill.keys():84skill = topic2skill[topic]85skills_dict[skill] += 186
87total_skill = sum(skills_dict.values())88embedding = [skills_dict[skill] / total_skill if total_skill > 0 else 0 for skill in scenario_skills]89used_topics = [skill for skill in scenario_skills if skills_dict[skill] > 0]90candidate_topics = get_candidate_topics(embedding)91candidate_topics = [skill for skill in candidate_topics if skill not in used_topics]92if "game_cooperative_skill" in candidate_topics:93candidate_topics += ["dff_gaming_skill"]94candidate_topics_batch.append(candidate_topics)95except Exception as exc:96logger.exception(exc)97sentry_sdk.capture_exception(exc)98candidate_topics_batch.append([])99
100total_time = time.time() - st_time101logger.info(f"topic_recommendation exec time: {total_time:.3f}s")102logger.warning(candidate_topics_batch)103return candidate_topics_batch104
105
106@app.route("/respond", methods=["POST"])107def respond():108response = handler(request.json)109return jsonify(response)110
111
112if __name__ == "__main__":113app.run(debug=False, host="0.0.0.0", port=3000)114