# 热门书籍索引生成项目 ## 项目简介 本项目旨在根据机构的阅读行为数据(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']` - 文件名格式:`_.txt`,并生成软链接至 `.txt`。 - 输出内容示例:`tenant_id book_id1:uv_count1,book_id2:uv_count2,...` ### 输出文件类型 1. `tenant_booklist.txt`:按机构(tenant)统计的热门书籍列表。 2. `tenant_type_booklist.txt`:按机构所属行业(tenant_type)统计的热门书籍列表。 3. `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 统计为准。 ## 计算逻辑 1. **数据加载** - 使用 `load_books_data()` 和 `load_tenants_data()` 分别加载书籍和机构的基本信息,确保各个 ID 均为字符串。 - 使用 `get_recent_files()` 获取最近 `days` 天的阅读数据文件列表。 2. **UV 数据处理** - `process_reading_data()`:简单 UV 统计,每条记录中的用户访问量直接累加。 - `process_reading_data_by_uv()`:用户 UV 去重统计,计算某书籍在一天内的 UV 数量。 - `CONFIG['use_simple_uv_processing']` 用于决定是否使用简单的累加逻辑。 3. **数据融合** - 使用 `merge_tenant_uv_with_type_uv()` 将机构的 UV 数据与其所属行业的 UV 数据按比例进行融合,减小数据量较小的机构所带来的统计偏差。 4. **生成书单** - `generate_top_booklist()` 根据 UV 统计数据生成指定维度的前 `N` 本热门书籍列表。 - 生成的书单文件分别保存机构、机构所属行业、标签维度的热门书籍排名。 5. **输出与软链接** - 使用 `write_output()` 将生成的书单写入指定文件,并更新软链接到最新文件。 ## 日志 程序的所有日志信息输出至 `logs/index_generation.log`,主要记录数据加载、文件处理、UV 统计、文件写入等步骤的成功与错误信息,以便跟踪和排查问题。 ## 运行方法 在终端中执行以下命令来运行主程序: ```bash python main.py # 或者 sh run.sh ```