skill_satire_scraper.md 14.1 KB

Skill: Satire News Scraper

Metadata

  • name: satire_scraper
  • version: 2.0.0
  • description: 从讽刺新闻网站抓取内容并提取短剧素材,适配 6 维度评分体系
  • target_score: 9.0
  • pass_threshold: 9.0

能力定义

核心能力

  1. RSS 抓取与解析 - 来源质量优化策略
  2. 荒诞内容识别与评分 - 7 类型元素精准识别
  3. 短剧素材结构化提取 - A/B/C/D 改编价值评估
  4. 完整元数据输出 - 10 分制格式规范

6 维度评分体系对齐

维度 1: 荒诞度 (Absurdity) - 权重 25%

目标分数: 9-10 分

荒诞元素类型识别表 (Type A-G)

类型 名称 识别特征 关键词/模式 示例
A 超现实设定 动物/物体有人类行为 declares, files, elected, appointed "Dog Files Tax Return"
B 夸张数字 极端统计、全称命题 98%, 100%, million, everyone, nobody "Study Finds 98% Of Americans..."
C 荒诞日常 普通事赋予不存在意义 标签字面化、自我矛盾 "Not A Cat Person Actually..."
D 角色反转 权威者卑微、卑微者掌权 Congressman working at Wendy's "Congressman At Wendy's"
E 讽刺类比 荒诞类比揭露现实 If X was a person, A equals B "If Climate Change Was A Person"
F 黑色幽默 轻松语气讨论严肃话题 death, disease, disaster + 轻松语气 "Hospital Express Lane"
G 元讽刺 讽刺媒体/网络文化本身 自嘲、媒体形式讽刺 ClickHole 风格内容

荒诞指数计算 (1-10 分)

absurdity_score = min(10, round(base_score + bonus, 1))

base_score = element_type_score × 0.4 + structure_score × 0.35 + irony_score × 0.25

其中:
- element_type_score: 基于识别的元素类型复杂度 (单一类型=5, 混合类型=7-9)
- structure_score: 标题结构荒诞度 (见下表)
- irony_score: 讽刺强度 (反差程度 0-10)

标题结构评分表

结构模式 示例 得分
X Based On Y (无关混搭) Novel Based On McDonald's 9-10
A vs B (B 不可战胜) Man vs Goose 8-9
[权威] + [荒诞决定] Congress Makes X Illegal 7-8
Breaking + 超现实事件 Breaking: Cat Elected 7-8
[群体] + [矛盾特征] Millennials Killing... 6-7
疑问但答案荒谬 What If...? 5-6
常规新闻结构 Report: ... 2-4

高分策略:

  • 必须准确识别荒诞元素类型(Type A-G)
  • absurd_premise 必须精准概括核心荒诞点
  • dramatic_twist 必须捕捉真正的意外/反转
  • 评分偏差与人工评估 ≤ 0.5 为 10 分,≤ 1 为 8-9 分

维度 2: 来源质量 (Source Quality) - 权重 20%

目标分数: 9-10 分

来源分级体系

等级 来源 质量分 策略
S The Onion - Local News 栏目 10 优先抓取,占比 30%+
A The Onion 其他栏目、ClickHole 8-9 主要来源,占比 50%+
B Babylon Bee 6-7 补充来源,占比 20%
C 小型讽刺博客 4-5 谨慎使用
D 非讽刺来源 1-3 过滤排除

RSS 源配置

sources:
  onion_local:
    url: https://www.theonion.com/rss
    grade: S
    filter: category == "Local"
    priority: 1

  onion_other:
    url: https://www.theonion.com/rss
    grade: A
    filter: category != "Local"
    priority: 2

  clickhole:
    url: https://www.clickhole.com/rss
    grade: A
    priority: 2

  babylonbee:
    url: https://babylonbee.com/feed
    grade: B
    priority: 3

高分策略:

  • 80%+ 内容来自 S/A 级来源 (The Onion, ClickHole)
  • 避免 D 级来源混入
  • 记录并验证每个条目的 source.grade

维度 3: 元数据完整性 (Metadata) - 权重 15%

目标分数: 10 分

必填字段 (缺失一个扣 2 分)

字段 类型 验证规则
headline string 非空,保留原文
absurd_premise string 中文,一句话概括核心荒诞点
satire_angle string 中文,"讽刺[目标],以及[深层问题]"格式
satire_type enum political/social/absurdist/black/meta
absurdity_score number 1-10,1 位小数
source.site string 来源网站名
source.url string 有效 URL
source.published_at string ISO8601 格式

推荐字段 (缺失一个扣 1 分)

字段 类型 验证规则
absurd_elements array Type A-G 字符串数组,如 ["A", "C"]
dramatic_twist string 中文,描述标题中的意外/反转
adaptation_value enum A/B/C/D 等级
adaptation_notes.genre string 短剧类型
adaptation_notes.tone enum absurd/dry/black/satirical/light
adaptation_notes.visual_elements array 至少 3 个具体视觉建议
adaptation_notes.dialogue_style string 对白风格描述
adaptation_notes.estimated_duration string 30s/45s/60s/90s

高分策略: 所有必填 + 推荐字段必须 100% 完整


维度 4: 时效性 (Timeliness) - 权重 15%

目标分数: 8-10 分

时间分级标准

时间范围 新鲜度分 标记
≤ 7天 10 fresh
8-30天 8-9 recent
1-3个月 6-7 moderate
3-6个月 4-5 aging
> 6个月 1-3 old

Evergreen 内容豁免

以下类型不受时效性限制,自动标记为 evergreen:

  • Local Man/Area Woman 系列
  • 普适性社会讽刺(非时事依赖)
  • 经典荒诞设定(动物做人事等)
if is_evergreen(content):
    timeliness_score = 10
else:
    timeliness_score = freshness_based_on_pubdate()

高分策略:

  • 80%+ 内容 ≤ 30 天,或标记为 evergreen
  • 正确识别 evergreen 内容
  • 优先抓取最新 RSS 条目

维度 5: 短剧适配性 (Adaptability) - 权重 15%

目标分数: 8-10 分

改编等级定义

等级 分数 标准 目标占比
A 9-10 场景简单(1-3角色)、笑点清晰、病毒潜力 20%
B 7-8 复杂度中等、需一定改编、良好喜剧效果 40%
C 5-6 概念有趣但执行困难、需大量改动 25%
D 依赖文字游戏、场景复杂或敏感度过高 15%

改编价值评估矩阵

维度 权重 评估标准
视觉化潜力 25% 是否容易转化为视觉场景
冲突张力 25% 是否蕴含内在戏剧性冲突
节奏感 20% 铺垫-笑点-反转结构是否清晰
共鸣度 15% 是否触及观众共同经验
演出成本 15% 场景简单度、角色数量

adaptation_notes 生成规则

genre映射:
  political + Congress/Law: 政治讽刺剧
  social + Local Man/Woman: 观察喜剧
  absurdist + 超现实设定: 超现实喜剧
  black + 敏感话题: 黑色喜剧
  meta + 网络文化: 元讽刺喜剧
  consumer + Quiz/Brand: 网络讽刺喜剧

tone映射:
  absurdity_score 8.5-10: black/absurd
  absurdity_score 7.0-8.4: satirical
  absurdity_score 6.0-6.9: dry/light

visual_elements生成:
  政治: [国会场景, 新闻发布会, 政策文件, 投票表决]
  科技: [手机屏幕, 电脑界面, 通知弹窗, 代码/数据]
  消费: [产品包装, 品牌Logo, 购物车, 测试界面]
  社会: [公园场景, 街道, 日常环境, 特写镜头]
  职场: [办公室, 会议室, 工位, 老板办公室]
  家庭: [客厅, 厨房, 餐桌, 沙发]

高分策略:

  • 改编评估与人工评估一致性 ≥ 90%
  • 等级偏差 ≤ 1
  • visual_elements 必须具体可行

维度 6: 格式规范 (Format) - 权重 10%

目标分数: 10 分

JSON 格式要求

结构要求:
  - 有效 JSON 语法(无 trailing comma)
  - 字段命名 snake_case
  - 日期格式 ISO8601: YYYY-MM-DDTHH:mm:ssZ
  - 枚举值必须小写

内容格式:
  - 字符串无多余前后空格
  - 无 HTML 标签残留
  - 编码统一 UTF-8
  - 数组元素不为空

枚举值规范

satire_type: [political, social, absurdist, black, meta]
adaptation_value: [A, B, C, D]
tone: [absurd, dry, black, satirical, light]
absurd_elements: [A, B, C, D, E, F, G]
duration: [30s, 45s, 60s, 90s]

高分策略: 100% 符合格式规范,无解析错误


执行流程

Step 1: 来源质量筛选

1. 按优先级获取 RSS 源
2. 标记每条内容的 source.grade (S/A/B/C/D)
3. 过滤 D 级来源
4. 计算来源质量分: (S×10 + A×8.5 + B×6.5) / 总数

Step 2: 时效性评估

1. 解析 pubDate → ISO8601
2. 判断是否 evergreen (Local Man 等)
3. 计算内容年龄
4. 赋予时效性分数

Step 3: 荒诞度分析

1. 识别荒诞元素类型 (Type A-G)
2. 分析标题结构模式
3. 提取 absurd_premise (主体+荒诞行为)
4. 识别 satire_angle (讽刺目标)
5. 提取 dramatic_twist (反转点)
6. 计算 absurdity_score
7. 过滤 < 6.0 的内容

Step 4: 短剧适配评估

1. 评估视觉化潜力
2. 分析冲突张力
3. 判断节奏感
4. 评估共鸣度和演出成本
5. 确定 adaptation_value (A/B/C/D)
6. 生成 adaptation_notes
   - genre: 基于 satire_type + 关键词
   - tone: 基于 absurdity_score
   - visual_elements: 基于 genre 选择 3-4 个
   - dialogue_style: 基于来源风格
   - estimated_duration: 30s/45s/60s/90s

Step 5: 元数据完整性检查

检查清单:
✓ 8 个必填字段全部存在
✓ 7 个推荐字段全部存在
✓ 字段类型正确
✓ 枚举值在允许范围内

Step 6: JSON 输出

{
  "headline": "原标题",
  "absurd_premise": "中文荒诞设定",
  "satire_angle": "讽刺角度",
  "satire_type": "absurdist|social|political|black|meta",
  "absurd_elements": ["A", "C"],
  "dramatic_twist": "反转点",
  "absurdity_score": 8.5,
  "adaptation_value": "A|B|C|D",
  "adaptation_notes": {
    "genre": "短剧类型",
    "tone": "absurd|dry|black|satirical|light",
    "visual_elements": ["元素1", "元素2", "元素3"],
    "dialogue_style": "对白风格",
    "estimated_duration": "60s"
  },
  "source": {
    "site": "The Onion",
    "url": "https://...",
    "published_at": "2026-03-26T10:00:00Z",
    "grade": "S|A|B"
  },
  "timeliness": {
    "score": 9,
    "category": "fresh|recent|evergreen"
  }
}

负样本输出

对于 absurdity_score

{
  "filtered": true,
  "reason": "low_absurdity_score|low_source_quality",
  "headline": "原标题",
  "absurdity_score": 5.0,
  "source.grade": "D",
  "explanation": "具体原因说明"
}

完整示例

输入:

<item>
  <title>Local Man Declares Himself Mayor Of Wendy's</title>
  <link>https://www.theonion.com/local-man-mayor-wendys</link>
  <pubDate>Wed, 26 Mar 2026 10:00:00 GMT</pubDate>
  <category>Local</category>
</item>

处理过程:

  1. 来源: The Onion + Local → grade = S, source_quality = 10
  2. 时效: 当天发布 → timeliness = 10, category = fresh
  3. 荒诞分析:
    • 元素类型: A (超现实设定) + C (荒诞日常)
    • 结构: [普通人] + [非凡行为] → 7 分
    • absurd_premise: "普通快餐顾客自封餐厅市长"
    • satire_angle: "讽刺人们对微小权力的荒谬渴望"
    • dramatic_twist: "自封而非选举产生"
    • absurdity_score: 8.5
  4. 改编评估:
    • 视觉化潜力高 (餐厅场景简单)
    • 冲突清晰 (自封市长 vs 现实)
    • adaptation_value = A
    • genre = 超现实喜剧, tone = absurd
    • visual_elements = ["快餐店场景", "自封仪式", "顾客困惑表情", "员工无奈配合"]
    • dialogue_style = 严肃新闻体,deadpan delivery
    • estimated_duration = 60s

输出:

{
  "headline": "Local Man Declares Himself Mayor Of Wendy's",
  "absurd_premise": "普通快餐顾客自封餐厅市长",
  "satire_angle": "讽刺人们对微小权力的荒谬渴望",
  "satire_type": "absurdist",
  "absurd_elements": ["A", "C"],
  "dramatic_twist": "自封而非选举产生",
  "absurdity_score": 8.5,
  "adaptation_value": "A",
  "adaptation_notes": {
    "genre": "超现实喜剧",
    "tone": "absurd",
    "visual_elements": ["快餐店场景", "自封仪式", "顾客困惑表情", "员工无奈配合"],
    "dialogue_style": "严肃新闻体,deadpan delivery",
    "estimated_duration": "60s"
  },
  "source": {
    "site": "The Onion",
    "url": "https://www.theonion.com/local-man-mayor-wendys",
    "published_at": "2026-03-26T10:00:00Z",
    "grade": "S"
  },
  "timeliness": {
    "score": 10,
    "category": "fresh"
  }
}

6 维度自检清单

执行后逐项验证:

  • [ ] 荒诞度: 元素类型准确,评分偏差 ≤ 1
  • [ ] 来源质量: 80%+ 来自 S/A 级来源
  • [ ] 元数据: 15 个字段全部完整
  • [ ] 时效性: 80%+ ≤ 30天或为 evergreen
  • [ ] 适配性: 评估一致性 ≥ 90%,等级偏差 ≤ 1
  • [ ] 格式: JSON 规范,无解析错误

错误处理

错误 处理 对评分影响
RSS 失败 记录日志,跳过该源 降低来源质量分
必填字段缺失 丢弃条目 无影响(避免扣分)
时间解析失败 使用当前时间,标记为 estimate 降低时效性分
未知来源 标记为 C/D 级 降低来源质量分
absurdity 输出过滤标记 不进入最终集

训练记录

  • v1.0.0: 初始版本,基础功能定义
  • v1.1.0: 优化评分算法,细化提取规则,增加类型识别表
  • v1.2.0: 旧版 4 维度体系最终版,Final Score 94/100
  • v2.0.0: 重构为 6 维度评分体系,适配新 benchmark (目标 9.0+)
    • 新增来源质量和时效性维度
    • 细化荒诞元素类型 (A-G)
    • 强化改编价值评估 (A/B/C/D)
    • 完整元数据字段规范
    • JSON 格式标准化

6 维度预期得分

基于训练集验证:

维度 权重 目标分 加权贡献
荒诞度 25% 9.0 2.25
来源质量 20% 9.5 1.90
元数据 15% 10.0 1.50
时效性 15% 9.0 1.35
适配性 15% 9.0 1.35
格式 10% 10.0 1.00
总分 100% - 9.35

预期等级: S (卓越,9.0+)