README.md
热门书籍索引生成项目
项目简介
本项目旨在根据机构的阅读行为数据(reading_time埋点数据)生成热门书籍索引,通过多种方法统计不同维度下的用户访问(UV)数据。项目支持基于机构(tenant)、机构所属行业(tenant_type)及书籍标签(tag)(包括category1和category2,当成tag同等处理)等不同维度进行统计和排名,从而生成热门书籍清单。并带有自动更新的软链接以方便外部访问。
文件结构
index_generation.py:主程序代码,包含数据加载、UV处理、书单生成和输出等主要功能。logs/:日志文件存放目录。output/:程序生成的书单输出目录。
输入数据
1. 书籍属性数据 (all_books.json)
- 路径:
CONFIG['books_path'] - 内容:每行包含一个书籍的 JSON 数据,主要字段为:
id:书籍ID。merged_tags:书籍相关的标签列表,用逗号分隔。
2. 机构所属行业数据 (tenants.json)
- 路径:
CONFIG['tenants_path'] - 内容:每行包含一个机构的 JSON 数据,主要字段为:
id:机构ID。tenant_type:机构所属行业类型。
3. 阅读行为数据 (reading_time.json)
- 路径:
CONFIG['base_dir']下的文件夹,文件名格式为reading_time.json.YYYYMMDD。 - 内容:每行包含一个阅读行为的 JSON 数据,主要字段为:
user_id:用户ID。book_id:书籍ID。tenant_id:机构ID。
输出数据
输出数据为生成的热门书籍列表,每个文件包含按指定维度统计的前 N 个书籍的排名结果:
- 文件输出路径:
CONFIG['output_dir'] - 文件名格式:
<prefix>_<current_date>.txt,并生成软链接至<prefix>.txt。 - 输出内容示例:
tenant_id book_id1:uv_count1,book_id2:uv_count2,...
输出文件类型
tenant_booklist.txt:按机构(tenant)统计的热门书籍列表。tenant_type_booklist.txt:按机构所属行业(tenant_type)统计的热门书籍列表。tag_booklist.txt:按标签(tag)统计的热门书籍列表。
配置参数
CONFIG 说明
base_dir:阅读数据文件的目录。books_path:书籍属性数据文件路径。tenants_path:机构所属行业数据文件路径。output_dir:输出目录路径。days:用于选择最近days天内的数据文件。top_n:生成前N个热门书籍。tenant_type_ratio:用于在机构数据不足时融合所属行业数据的权重比例。use_simple_uv_processing:True:累加每天的 UV。False:以数据周期内总 UV 统计为准。
计算逻辑
数据加载
- 使用
load_books_data()和load_tenants_data()分别加载书籍和机构的基本信息,确保各个 ID 均为字符串。 - 使用
get_recent_files()获取最近days天的阅读数据文件列表。
- 使用
UV 数据处理
process_reading_data():简单 UV 统计,每条记录中的用户访问量直接累加。process_reading_data_by_uv():用户 UV 去重统计,计算某书籍在一天内的 UV 数量。CONFIG['use_simple_uv_processing']用于决定是否使用简单的累加逻辑。
数据融合
- 使用
merge_tenant_uv_with_type_uv()将机构的 UV 数据与其所属行业的 UV 数据按比例进行融合,减小数据量较小的机构所带来的统计偏差。
- 使用
生成书单
generate_top_booklist()根据 UV 统计数据生成指定维度的前N本热门书籍列表。- 生成的书单文件分别保存机构、机构所属行业、标签维度的热门书籍排名。
输出与软链接
- 使用
write_output()将生成的书单写入指定文件,并更新软链接到最新文件。
- 使用
日志
程序的所有日志信息输出至 logs/index_generation.log,主要记录数据加载、文件处理、UV 统计、文件写入等步骤的成功与错误信息,以便跟踪和排查问题。
运行方法
在终端中执行以下命令来运行主程序:
python main.py
# 或者
sh run.sh