<!--
用途: 模拟考试实操题（2026-06-23）
说明: 这是模拟考试，所有代码提交到这个仓库
-->

# 模拟考试（实操题）

**考试时间**：90 分钟（2 课时）
**考试形式**：开卷
**总分**：70 分

---

## ⚠️ 重要说明

- 本题所有代码、标注结果、图片都要上传到 **本仓库** 下
- **文件夹必须按下面要求** 的结构创建，否则不得分
- 数据爬取代码 **必须** 在一次爬取中获取到所有需要数据（数据刷新会变）

---

## 第Ⅱ部分 实操题

### 一、数据爬取（25 分）

**本题中涉及的爬虫代码必须包含检测头，同时由于网页刷新后数据会变化，必须在一次爬取中获取到所有需要数据，否则不得分。**

#### 第 1 题（10 分）

用 python 代码访问网址 `https://exam.detr.top/exam-b/movies`，抓取网页的数据编号和其中全部 10 部电影的信息，并分别保存为两个文件：

- `movies.json`（存放数据编号和电影信息，电影中包含的键为 `id, title, director, year, rating, duration, genre, actors_count`）
- `movies.html`（保存原始网页源码）

#### 第 2 题（15 分）

根据 `movies.json` 中的数据：

1. ① 找出评分最高和最低的电影，打印电影名 + 评分。
2. ② 统计各类型的电影数量，用字典格式输出。
3. ③ 统计各导演的电影数量，用字典格式输出。
4. ④ 统计 2020 年（含）以后上映的电影数量。

---

### 二、数据标注（20 分）

**本章中所有标注结果都需要导出文件，并上传到本仓库的 `q3` 文件夹下。每个小题单独放一个子文件夹。未按要求上传文件不得分。**

#### 第 1 小题（8 分）— 图像目标检测标注

在 Label Studio 中打开图片 `data/images/标注练习1.jpg`（图片中含 1 只猫、1 只狗、1 辆车，背景为街道），使用 Rectangle Labels 工具标出 3 个目标物。要求：

1. （1）边界框必须紧贴目标物轮廓
2. （2）标签必须为 `cat`、`dog`、`car`（**必须小写英文**，不能写成"猫/狗/车"或"Cat/Dog/Car"）
3. （3）导出为 YOLO 格式压缩包
4. （4）将压缩包命名为 `q3_1_image_labels.zip` 并上传到 `q3/q3_1/` 文件夹
5. （5）压缩包解压后必须包含 `classes.txt` 和 `labels/` 目录

#### 第 2 小题（7 分）— 文本情感分类标注

现有 5 条外卖评论文本 `data/reviews.json`，用 Label Studio 完成情感分类标注（标签：正面/负面），导出为 JSON 格式。要求：

1. （1）标注必须包含每条评论的 `id` 和 `text` 字段
2. （2）每个标注必须有一个 `sentiment` 字段，值为 `"正面"` 或 `"负面"`
3. （3）5 条评论必须全部标注
4. （4）将导出文件命名为 `q3_2_takeout_reviews.json` 并上传到 `q3/q3_2/` 文件夹

#### 第 3 小题（5 分）— 标注质量自评

在 `q3` 文件夹下新建 `q3_3_质量自评.md` 文件，写一份 200 字左右的标注质量自评报告，内容包括：

1. （1）标注前准备 —— 你制定了什么标注规范？看了几张示例图片？（2 分）
2. （2）标注过程 —— 遇到什么困难？如何解决？中途不确定的标注如何处理？（2 分）
3. （3）标注后检查 —— 做了哪些检查？是否导入了多份相同数据互相对比？（1 分）

---

### 三、数据可视化（25 分）

**本章所有图表都要用 matplotlib 绘制，PNG 文件必须用 `plt.savefig` 保存。所有 Python 代码和 PNG 文件都需要上传到本仓库的 `q4` 文件夹下，每个小题单独一个子文件夹。**

#### 第 1 小题（8 分）— 柱状图

从 `movies.json`（本卷第 II 部分保存的 `movies.json`）读取数据，用 matplotlib 绘制**各类型的电影数量柱状图**。要求：

1. （1）使用 `plt.bar` 函数绘制柱状图
2. （2）X 轴为类型名称
3. （3）Y 轴为电影数量
4. （4）标题设置为"类型电影数量分布"（用 `plt.title`）
5. （5）保存为 `q4_1_bar.png`（用 `plt.savefig`，`dpi=150`）
6. （6）Python 代码保存为 `q4_1.py`

#### 第 2 小题（7 分）— 散点图

从 `movies.json` 读取数据，用 matplotlib 绘制**评分 vs 时长散点图**。要求：

1. （1）使用 `plt.scatter` 函数绘制散点图
2. （2）X 轴为时长（分钟），Y 轴为评分
3. （3）标题设置为"时长与评分关系散点图"（用 `plt.title`）
4. （4）使用 `plt.xlabel` 和 `plt.ylabel` 设置轴标签
5. （5）点的颜色设为红色，`alpha=0.6`（半透明）
6. （6）保存为 `q4_2_scatter.png`（用 `plt.savefig`，`dpi=150`）
7. （7）Python 代码保存为 `q4_2.py`

#### 第 3 小题（10 分）— 直方图

从 `movies.json` 读取数据，绘制**两张独立的直方图**：

- **（A）评分直方图（5 分）**：使用 `plt.hist` 函数绘制 10 部电影评分字段的分布直方图，`bins=5`，颜色蓝色，标题"评分分布"（用 `plt.title`），X 轴标签"评分"（用 `plt.xlabel`），保存为 `q4_3a_hist.png`（`dpi=150`），代码保存为 `q4_3a.py`
- **（B）时长直方图（5 分）**：使用 `plt.hist` 函数绘制 10 部电影时长字段的分布直方图，`bins=5`，颜色绿色，标题"时长分布"，X 轴标签"时长（分钟）"，保存为 `q4_3b_hist.png`（`dpi=150`），代码保存为 `q4_3b.py`

---

## 📁 仓库文件夹结构（必须按这个提交）

```
simulated-examination/
├── data/                          # 模拟考数据（已上传）
│   ├── images/
│   │   └── 标注练习1.jpg
│   └── reviews.json
├── q2_1_crawler/
│   ├── q2_1.py                    # 数据爬取第 1 题代码
│   ├── q2_2.py                    # 数据爬取第 2 题代码
│   ├── movies.json                # 爬取结果（由 q2_1.py 生成）
│   └── movies.html                # 原始网页（由 q2_1.py 生成）
├── q3/
│   ├── q3_1/
│   │   └── q3_1_image_labels.zip  # 图像标注 YOLO 导出
│   ├── q3_2/
│   │   └── q3_2_takeout_reviews.json  # 文本标注 JSON 导出
│   └── q3_3_质量自评.md
├── q4/
│   ├── q4_1/
│   │   ├── q4_1.py                # 柱状图代码
│   │   └── q4_1_bar.png           # 柱状图结果
│   ├── q4_2/
│   │   ├── q4_2.py                # 散点图代码
│   │   └── q4_2_scatter.png       # 散点图结果
│   ├── q4_3a/
│   │   ├── q4_3a.py               # 评分直方图代码
│   │   └── q4_3a_hist.png         # 评分直方图结果
│   ├── q4_3b/
│   │   ├── q4_3b.py               # 时长直方图代码
│   │   └── q4_3b_hist.png         # 时长直方图结果
```

---

## 提交方式

1. 在本仓库下**按上面的文件夹结构**创建目录
2. 依次完成 3 大题的所有小题
3. 每完成一题就 `git add` + `git commit` + `git push` 到本仓库
4. 考试结束时**最后一次 commit 时间**视为交卷时间
