|
|
@@ -6,6 +6,9 @@ from models.rank.data.config import CustConfig, ProductConfig
|
|
|
from models.rank.data.utils import sample_data_clear
|
|
|
from models.rank import GbdtLrModel, generate_feats_map
|
|
|
import pandas as pd
|
|
|
+from core import get_logger
|
|
|
+
|
|
|
+logger = get_logger("models.recommend")
|
|
|
|
|
|
|
|
|
class Recommend:
|
|
|
@@ -21,6 +24,7 @@ class Recommend:
|
|
|
gbdtlr_model_path = os.path.join("./models/rank/weights", city_uuid, "gbdtlr_model.pkl")
|
|
|
self._gbdtlr_model = GbdtLrModel(gbdtlr_model_path)
|
|
|
self._item2vec_model = Item2VecModel(city_uuid)
|
|
|
+ logger.info(f"Models loaded for city_uuid={city_uuid}")
|
|
|
|
|
|
def _get_itemcf_recall(self, product_id):
|
|
|
"""协同召回"""
|
|
|
@@ -46,11 +50,13 @@ class Recommend:
|
|
|
additional_items = [item for item in hot_recall_list if item in hot_recall_set]
|
|
|
needed = recall_count - len(result)
|
|
|
result.extend(additional_items[:needed])
|
|
|
-
|
|
|
+
|
|
|
+ logger.info(f"Recall completed: {len(result)} customers for product {product_id}")
|
|
|
return result[:recall_count]
|
|
|
|
|
|
def get_recommend_list_by_gbdtlr(self, product_id, recall_count=500):
|
|
|
"""根据gbdt_lr获取商户推荐列表"""
|
|
|
+ logger.info(f"GBDT-LR recommend started for product {product_id}")
|
|
|
# 获取召回的商户列表
|
|
|
recall_cust_list = self.get_recal_cust(product_id, recall_count)
|
|
|
# 获取卷烟数据
|
|
|
@@ -77,15 +83,18 @@ class Recommend:
|
|
|
feats_map = generate_feats_map(product_data, cust_data)
|
|
|
recommend_list = self._gbdtlr_model.get_recommend_list(feats_map, ordered_recall_list)
|
|
|
# recommend_list = self.filter_recommend_list(recommend_list)
|
|
|
+ logger.info(f"GBDT-LR recommend completed: {len(recommend_list)} results")
|
|
|
return recommend_list
|
|
|
|
|
|
def get_recommend_list_by_item2vec(self, product_id, recall_count=500):
|
|
|
"""根据item2vec获取商户推荐列表"""
|
|
|
+ logger.info(f"Item2Vec recommend started for product {product_id}")
|
|
|
recommend_list = self._item2vec_model.get_recommend_cust_list(product_id, top=recall_count)
|
|
|
recommend_list = recommend_list.drop(columns=["sale_qty"])
|
|
|
recommend_list = recommend_list.to_dict(orient='records')
|
|
|
recommend_list = recommend_list[:recall_count]
|
|
|
# recommend_list = self.filter_recommend_list(recommend_list)
|
|
|
+ logger.info(f"Item2Vec recommend completed: {len(recommend_list)} results")
|
|
|
return recommend_list
|
|
|
|
|
|
def filter_recommend_list(self, recommend_list):
|
|
|
@@ -120,6 +129,7 @@ class Recommend:
|
|
|
recommend_data = recommend_data.sort_values(["recommend_score", "cust_code"], ascending=[False, True])
|
|
|
|
|
|
recommend_data = recommend_data.to_dict(orient='records')
|
|
|
+ logger.info(f"Delivery allocation completed for {len(recommend_data)} customers, total={delivery_count}")
|
|
|
return recommend_data
|
|
|
|
|
|
|