## NOAI2025 组合词分割问题

### 求解本题的参考用时：1小时以内

### 一. 题目概述

组合词（Compounds）指的是由多个短词组成新词，这在德语里尤为常见。例如，"Fußball" 是由 "Fuß" 和 "Ball" 组合而成，分别表示 "脚" 和 "球"；"Autobahnanschlussstelle"（高速交叉路口）是由 "Autobahn"、"Anschluss" 和 "Stelle" 组合而成，分别表示 "高速公路"、"连接" 和 "地点"。

在本题中，我们需要将一个德语句子中的组合词分割成由空格分隔的短词。例如，"Fußballspieler" 应该被分割成 "Fuß"、"ball" 和 "spieler"。

### 二. 数据集

`data/train.json` 包含了超过 90,000 个德语组合词，每个组合词都被分割成了短词。每个数据包含组合词和分割标签两个字段。

验证集 (`val.json`) 和测试集 (`test.json`) 分别包含超过 10,000 个德语组合词。具体数据规模如下：

- **训练集**：94,306 条，存储在"train.json"中；
- **验证集**：11,788 条，存储在"val.json"中；
- **测试集**：11,789 条，存储在"test.json"中；

其中训练集的数据可以直接访问和下载：[训练集数据](https://www.bohrium.com/competitions/2752257669?tab=datasets)。验证集和测试集数据不能直接访问和下载，需要通过环境变量加密后访问，具体可以参考[baseline.ipynb]()。

训练集数据示例如下：

```json
{
    "Sprachbereich": [
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        1
    ],
    "Autobahnanschlussstelle": [
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1
    ],
    ...
}
```

数据使用json格式，key为组合词，value为0-1数组，数组每个位置对应着组合词的相应字母，其中 1表示一个词的结束， 0表示词的开始或者中间。

例如，第一组数据表示 "Sprachbereich" 被分割成了 "Sprach" 和 "bereich"，所以在value的第5个位置（位置编号从0开始计数）以及最后一个位置取值为1，其他位置取值为0。

验证集和测试集的value的0-1数组为空。

### 三. 任务

请实现一个组合词分割器，填入验证集和测试集的value。具体要求如下：

1. 使用GPU的训练时间+测试时间不能超过10分钟，连接时间和排队时间不计入总时间；参考数值：离线测试时，如果选用模型正确，epoch数控制在8到32次之间，Tesla T4在10分钟内能够训练出来比较好的结果。

2. 提示：建议使用Embedding + 深度学习模型。

 

### 四. 提交

选手需要提交**模型训练和推理代码**，命名为"submission.ipynb"，其中**必须包含训练模型的训练过程和预测验证集和测试集的测试过程**，不能只提交训练好的模型。"submission,ipynb"的输出为打包好的zip，zip中包含"submissionval.json"和"submissiontest.json"两个文件，格式与训练集相同，内容为对val.json和test.json的预测。

在[baseline.ipynb](https://www.bohrium.com/en/notebooks/59712856135)中给了一个提交示例。




### 五. 评分

1. 最终分数是每个组合词分词的平均F1-score。其中val.json的评分结果在比赛过程中在A榜中可以查询；其中test.json的评分结果在比赛中无法查询，比赛结束后显示，将作为最后的评分结果；

2. F1-score的具体计算过程如下，**提示：可以不用细看，可以直观理解为预测位置越准确，评分越高。**

对于每个组合词的分词结果，我们首先将其还原为“分词边界集合”。设：

- $G$ 为真实分词集合
- $P$ 为预测分词集合

其中，每个分词用一个区间 $(start, end)$ 表示，表示字符在 $(start, end)$ 内属于同一分词，注意：根据计算机语言的一贯表述，包含$start$但是不包含$end$。

**（1）真正例(TP)**

只有当某个预测分词和真实分词在起始和结束位置完全一致时，才认为它是正确的。
$$
TP = \left| G \cap P \right|
$$

**（2）精确度 (Precision) 与召回率 (Recall)**

精确度计算公式为
$$
Precision = \frac{TP}{|P|}
$$
其中 $|P|$ 是预测分词的总数。如果 $|P| = 0$ 定义精确率为 0。

召回率计算公式为
$$
Recall = \frac{TP}{|G|}
$$
其中 $|G|$ 是真实分词的总数。如果 $|G| = 0$ 则定义召回率为 0。

**（2） F1-score计算公式**

利用精确率与召回率，F1 得分公式为：
$$
F1 = \frac{2 \times Precision \times Recall}{Precision + Recall}
$$
当 $Precision + Recall = 0$ 时，定义 $F1 = 0$。

**（3）总平均 F1 -score**

假设总共有 $N$ 个样本，对第 $i$ 个样本其 F1 得分记作 $F1_i$，则总体 F1 均值为：
$$
F1_{avg} = \frac{1}{N} \sum_{i=1}^{N} F1_i
$$

#### 示例：对两个组合词进行计算

下面给出两个示例，分别为单词 **"Sprachbereich"** 和 **"Autobahnanschlussstelle"**。

**示例 1： "Sprachbereich"**

**真实标签与分词边界**

假设真实标签序列为：

```
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]
```

遍历该序列：

- 当到达索引 5 时，标签为 1，对应分词边界为 $(0, 6)$
- 从索引 6 开始，到索引 12 标签为 1，得到分词边界为 $(6, 13)$

所以真实分词集合为：
$$
G = \{ (0,6), (6,13) \}
$$
**预测标签与分词边界**

假设预测标签序列和真实完全一致，则：
$$
P = \{ (0,6), (6,13) \}
$$
**指标计算**

- 交集：
  $$
  G \cap P = \{ (0,6), (6,13) \}
  $$
  所以 $TP = 2$。

- 精确率：
  $$
  Precision = \frac{TP}{|P|} = \frac{2}{2} = 1
  $$

- 召回率：
  $$
  Recall = \frac{TP}{|G|} = \frac{2}{2} = 1
  $$

- F1 得分：
  $$
  F1 = \frac{2 \times 1 \times 1}{1 + 1} = 1
  $$

**示例 2： "Autobahnanschlussstelle"**:

**真实标签与分词边界**

假设真实标签序列为：

```
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
```

遍历此序列（字符索引从 0 开始）：

- 索引 3 标签为 1：分词边界为 $(0,4)$
- 索引 7 标签为 1：分词边界为 $(4,8)$
- 索引 22 标签为 1：分词边界为 $(8,23)$

所以真实分词集合为：
$$
G = \{ (0,4), (4,8), (8,23) \}
$$
**预测标签与分词边界**

假设预测标签序列使得还原后的预测分词集合为：
$$
P = \{ (0,4), (4,10), (10,23) \}
$$
**指标计算**

- 交集：
  $$
  G \cap P = \{ (0,4) \}
  $$
  因此 $TP = 1$。

- 精确率：
  $$
  Precision = \frac{1}{|P|} = \frac{1}{3} \approx 0.3333
  $$

- 召回率：
  $$
  Recall = \frac{1}{|G|} = \frac{1}{3} \approx 0.3333
  $$

- F1 得分：
  $$
  F1 = \frac{2 \times 0.3333 \times 0.3333}{0.3333 + 0.3333} \approx 0.3333
  $$

**总平均 F1 得分计算**

假设两个样本的 F1 得分分别为：

- 对 "Sprachbereich": $F1_1 = 1$
- 对 "Autobahnanschlussstelle": $F1_2 \approx 0.3333$

则总体平均 F1 得分为：
$$
F1_{avg} = \frac{F1_1 + F1_2}{2} = \frac{1 + 0.3333}{2} \approx 0.6667
$$