5ab1c29c
tangwang
first commit
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
# 热门书籍索引生成项目
## 项目简介
本项目旨在根据机构的阅读行为数据(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,...`
### 输出文件类型
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
```
|