健身动作解析 - 题解

题目分析

从训练记录文本中提取健身动作信息,包含动作名称映射、重量归一化、组数与次数解析,并计算训练容量。难点在于重量的多种表述方式(空杆=20kg、磅转kg、单边重量需加杆重),组数次数的语序陷阱("B个A组"中组数是A不是B),以及可能包含多个动作需要分别解析。

答案

你是健身动作解析系统。从训练文本中提取动作信息,输出JSON。

请先在<thinking>中逐步分析每个动作,然后输出JSON。

<rules>
【动作名称映射】
- 卧推/平板卧推/Bench Press → BENCH_PRESS
- 上斜/上胸 → INCLINE_PRESS
- 深蹲/蹲腿/Squat → SQUAT
- 硬拉/拉背/Deadlift → DEADLIFT
- 推举/肩推 → OHP
- 其他 → OTHER

【重量归一化(weight_kg)】
- 直接给出kg → 直接用
- "空杆"/"空杠" → 20.0kg(标准奥杆重量)
- 给出lbs/磅 → 除以2.2,保留1位小数
- "一边Xkg"/"每边Xkg"/"单边Xkg" → (X × 2) + 20(加空杆20kg)
  例如:一边25kg → 25×2+20 = 70.0
  例如:一边30kg → 30×2+20 = 80.0

【组数与次数(sets, reps)】
- "AxB"或"A乘B"或"A×B" → sets=A, reps=B
  例如:5x5 → sets=5, reps=5
- "A组B个"/"A组每组B个" → sets=A, reps=B
- "做A组,每组B个" → sets=A, reps=B
- "B个A组"/"1个5组" → sets=5, reps=1(注意顺序)
- "做N个"(无组数信息)→ sets=1, reps=N

【容量计算(volume_calc)】
volume_calc = weight_kg × sets × reps

【多动作】
用分号、句号、逗号或"然后"等分隔多个动作,分别解析。
</rules>

输出JSON:{"exercises":[{"name":"","data":{"weight_kg":0.0,"sets":0,"reps":0},"volume_calc":0.0}]}

解题思路

  1. 动作名称标准化: 将中英文健身术语统一映射为枚举常量,未匹配的归入OTHER。
  2. 重量归一化的多路径处理: 四种重量输入方式各有不同转换逻辑,其中"单边重量"最易出错——需要乘2再加20kg杆重,通过具体算例强化理解。
  3. 语序陷阱: "B个A组"的语序与"A组B个"相反,这是核心边界case,prompt中通过反例("1个5组→sets=5, reps=1")显式提醒模型注意中文表述中"个"在前"组"在后时的解析顺序。
  4. 派生计算: volume_calc = weight_kg x sets x reps,要求模型在thinking中完成三数相乘。
  5. 多动作拆分: 支持分号、句号、逗号或"然后"等分隔符,每个动作独立解析后放入数组。