diff --git a/config.py b/config.py index 97220a6..c14b1ab 100644 --- a/config.py +++ b/config.py @@ -1,4 +1,4 @@ -import os # Add for environment variable reading +import os ES_CONFIG = { diff --git a/offline_tasks/scripts/i2i_item_behavior.py b/offline_tasks/scripts/i2i_item_behavior.py index 07ae174..f1b0b2c 100644 --- a/offline_tasks/scripts/i2i_item_behavior.py +++ b/offline_tasks/scripts/i2i_item_behavior.py @@ -7,6 +7,41 @@ from db_service import create_db_connection import argparse from datetime import datetime from scripts.debug_utils import save_readable_index +import logging + +def setup_logger(): + """设置logger配置""" + # 创建logs目录 + logs_dir = 'logs' + os.makedirs(logs_dir, exist_ok=True) + + # 创建logger + logger = logging.getLogger('i2i_item_behavior') + logger.setLevel(logging.INFO) + + # 避免重复添加handler + if logger.handlers: + return logger + + # 创建文件handler + log_file = os.path.join(logs_dir, f'i2i_item_behavior_{datetime.now().strftime("%Y%m%d")}.log') + file_handler = logging.FileHandler(log_file, encoding='utf-8') + file_handler.setLevel(logging.INFO) + + # 创建控制台handler + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + + # 创建formatter + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler.setFormatter(formatter) + console_handler.setFormatter(formatter) + + # 添加handler到logger + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger def clean_text_field(text): if pd.isna(text): diff --git a/offline_tasks/scripts/tag_category_similar.py b/offline_tasks/scripts/tag_category_similar.py index 58bbe93..9013b69 100644 --- a/offline_tasks/scripts/tag_category_similar.py +++ b/offline_tasks/scripts/tag_category_similar.py @@ -7,6 +7,41 @@ from db_service import create_db_connection import argparse from datetime import datetime import json +import logging + +def setup_logger(): + """设置logger配置""" + # 创建logs目录 + logs_dir = 'logs' + os.makedirs(logs_dir, exist_ok=True) + + # 创建logger + logger = logging.getLogger('tag_category_similar') + logger.setLevel(logging.INFO) + + # 避免重复添加handler + if logger.handlers: + return logger + + # 创建文件handler + log_file = os.path.join(logs_dir, f'tag_category_similar_{datetime.now().strftime("%Y%m%d")}.log') + file_handler = logging.FileHandler(log_file, encoding='utf-8') + file_handler.setLevel(logging.INFO) + + # 创建控制台handler + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + + # 创建formatter + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler.setFormatter(formatter) + console_handler.setFormatter(formatter) + + # 添加handler到logger + logger.addHandler(file_handler) + logger.addHandler(console_handler) + + return logger def clean_text_field(text): if pd.isna(text): @@ -21,6 +56,9 @@ parser.add_argument('--top_n', type=int, default=50, help='每个分类保留的 parser.add_argument('--debug', action='store_true', help='开启debug模式') args = parser.parse_args() +# 初始化logger +logger = setup_logger() + bpms_host = '120.76.244.158' bpms_port = '3325' bpms_database = 'bpms' @@ -52,9 +90,14 @@ WHERE spi.quantity > 0 GROUP BY sp.code, psm.name, bb.code; """ +logger.info("="*80) +logger.info("Tag分类相似度计算开始") +logger.info("="*80) +logger.info(f"参数配置: lookback_days={args.lookback_days}, top_n={args.top_n}") + if args.debug: - print(f"[DEBUG] 参数配置: lookback_days={args.lookback_days}, top_n={args.top_n}") - print(f"[DEBUG] 开始查询数据库...") + logger.debug(f"[DEBUG] 参数配置: lookback_days={args.lookback_days}, top_n={args.top_n}") + logger.debug(f"[DEBUG] 开始查询数据库...") # 执行 SQL 查询并将结果加载到 pandas DataFrame df = pd.read_sql(sql_query, engine) @@ -78,8 +121,10 @@ stats = { 'file_stats': {} } +logger.info(f"数据库查询完成,共 {len(df)} 条订单记录") + if args.debug: - print(f"[DEBUG] 查询完成,共 {len(df)} 条订单记录") + logger.debug(f"[DEBUG] 查询完成,共 {len(df)} 条订单记录") # 处理商品信息,分割并去重 # 构建ID到名称的映射 @@ -115,8 +160,10 @@ for _, row in df.iterrows(): stats['total_categories'] = len(freq) # 计算余弦相似度 +logger.info("开始计算分类相似度...") + if args.debug: - print(f"[DEBUG] 开始计算分类相似度...") + logger.debug(f"[DEBUG] 开始计算分类相似度...") result = {} total_similarity_pairs = 0 @@ -138,13 +185,15 @@ stats['categories_with_similarities'] = len(result) stats['total_similarity_pairs'] = total_similarity_pairs stats['avg_similarities_per_category'] = total_similarity_pairs / len(result) if result else 0 +logger.info(f"相似度计算完成,共 {len(result)} 个分类有相似推荐") + if args.debug: - print(f"[DEBUG] 相似度计算完成,共 {len(result)} 个分类有相似推荐") + logger.debug(f"[DEBUG] 相似度计算完成,共 {len(result)} 个分类有相似推荐") unique_cats = set() for cats in result.values(): for cat, _ in cats: unique_cats.add(cat) - print(f"[DEBUG] 唯一分类数: {len(unique_cats)}") + logger.debug(f"[DEBUG] 唯一分类数: {len(unique_cats)}") # 准备输出 date_str = datetime.now().strftime('%Y%m%d') @@ -156,8 +205,10 @@ output_file = os.path.join(output_dir, f'tag_category_similar_{date_str}.txt') debug_file = os.path.join(debug_dir, f'tag_category_similar_{date_str}_readable.txt') # 输出相似分类到文件(ID格式) +logger.info(f"开始写入输出文件: {output_file}") + if args.debug: - print(f"[DEBUG] 开始写入文件: {output_file}") + logger.debug(f"[DEBUG] 开始写入文件: {output_file}") with open(output_file, 'w', encoding='utf-8') as f: for cat_id, sims in sorted(result.items()): @@ -165,6 +216,8 @@ with open(output_file, 'w', encoding='utf-8') as f: sim_str = ','.join([f'{sim_id}:{score:.4f}' for sim_id, score in sims]) f.write(f'{cat_id}\t{sim_str}\n') +logger.info(f"输出文件写入完成: {output_file}") + # 获取文件统计信息 if os.path.exists(output_file): file_size = os.path.getsize(output_file) @@ -175,8 +228,10 @@ if os.path.exists(output_file): } # 输出可读版本到debug目录(ID+名称格式) +logger.info(f"开始写入可读文件: {debug_file}") + if args.debug: - print(f"[DEBUG] 开始写入可读文件: {debug_file}") + logger.debug(f"[DEBUG] 开始写入可读文件: {debug_file}") with open(debug_file, 'w', encoding='utf-8') as f: # 写入文件头信息 @@ -199,6 +254,8 @@ with open(debug_file, 'w', encoding='utf-8') as f: sim_str = ','.join(sim_parts) f.write(f'{cat_id}:{cat_clean}\t{sim_str}\n') +logger.info(f"可读文件写入完成: {debug_file}") + # 获取debug文件统计信息 if os.path.exists(debug_file): file_size = os.path.getsize(debug_file) @@ -213,29 +270,29 @@ stats['end_time'] = datetime.now() stats['processing_time_seconds'] = (stats['end_time'] - stats['start_time']).total_seconds() # 输出统计信息 -print("\n" + "="*80) -print("Tag分类相似度计算 - 关键统计信息") -print("="*80) -print(f"📊 数据概览:") -print(f" - 总订单数: {stats['total_orders']:,}") -print(f" - 唯一区域数: {stats['unique_regions']:,}") -print(f" - 唯一客户数: {stats['unique_customers']:,}") -print(f" - 总分类数: {stats['total_categories']:,}") -print(f" - 有相似度的分类数: {stats['categories_with_similarities']:,}") -print(f" - 总相似度对数量: {stats['total_similarity_pairs']:,}") -print(f" - 平均每分类相似数: {stats['avg_similarities_per_category']:.1f}") - -print(f"\n📁 输出文件:") +logger.info("="*80) +logger.info("Tag分类相似度计算 - 关键统计信息") +logger.info("="*80) +logger.info(f"📊 数据概览:") +logger.info(f" - 总订单数: {stats['total_orders']:,}") +logger.info(f" - 唯一区域数: {stats['unique_regions']:,}") +logger.info(f" - 唯一客户数: {stats['unique_customers']:,}") +logger.info(f" - 总分类数: {stats['total_categories']:,}") +logger.info(f" - 有相似度的分类数: {stats['categories_with_similarities']:,}") +logger.info(f" - 总相似度对数量: {stats['total_similarity_pairs']:,}") +logger.info(f" - 平均每分类相似数: {stats['avg_similarities_per_category']:.1f}") + +logger.info(f"📁 输出文件:") for file_type, file_info in stats['file_stats'].items(): - print(f" - {file_type}: {file_info['path']}") - print(f" 大小: {file_info['size_mb']} MB ({file_info['size_bytes']:,} bytes)") - -print(f"\n⏱️ 处理时间:") -print(f" - 开始时间: {stats['start_time'].strftime('%Y-%m-%d %H:%M:%S')}") -print(f" - 结束时间: {stats['end_time'].strftime('%Y-%m-%d %H:%M:%S')}") -print(f" - 总耗时: {stats['processing_time_seconds']:.2f} 秒") - -print(f"\n✅ Tag相似度计算完成") -print(f" - 输出文件: {output_file}") -print(f" - 可读文件: {debug_file}") -print("="*80) + logger.info(f" - {file_type}: {file_info['path']}") + logger.info(f" 大小: {file_info['size_mb']} MB ({file_info['size_bytes']:,} bytes)") + +logger.info(f"⏱️ 处理时间:") +logger.info(f" - 开始时间: {stats['start_time'].strftime('%Y-%m-%d %H:%M:%S')}") +logger.info(f" - 结束时间: {stats['end_time'].strftime('%Y-%m-%d %H:%M:%S')}") +logger.info(f" - 总耗时: {stats['processing_time_seconds']:.2f} 秒") + +logger.info(f"✅ Tag相似度计算完成") +logger.info(f" - 输出文件: {output_file}") +logger.info(f" - 可读文件: {debug_file}") +logger.info("="*80) diff --git a/requirements.txt b/requirements.txt index 005971f..9a76323 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,9 @@ -# 推荐系统离线任务依赖包 - -# 数据处理 pandas>=1.3.0 numpy>=1.21.0 -# 数据库连接 sqlalchemy>=1.4.0 pymysql>=1.0.0 -# 机器学习和向量训练 gensim>=4.0.0 scikit-learn>=1.0.0 -- libgit2 0.21.2