# 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 源配置 ```yaml 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 | <5 | 依赖文字游戏、场景复杂或敏感度过高 | 15% | #### 改编价值评估矩阵 | 维度 | 权重 | 评估标准 | |------|------|----------| | 视觉化潜力 | 25% | 是否容易转化为视觉场景 | | 冲突张力 | 25% | 是否蕴含内在戏剧性冲突 | | 节奏感 | 20% | 铺垫-笑点-反转结构是否清晰 | | 共鸣度 | 15% | 是否触及观众共同经验 | | 演出成本 | 15% | 场景简单度、角色数量 | #### adaptation_notes 生成规则 ```yaml 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 格式要求 ```yaml 结构要求: - 有效 JSON 语法(无 trailing comma) - 字段命名 snake_case - 日期格式 ISO8601: YYYY-MM-DDTHH:mm:ssZ - 枚举值必须小写 内容格式: - 字符串无多余前后空格 - 无 HTML 标签残留 - 编码统一 UTF-8 - 数组元素不为空 ``` #### 枚举值规范 ```yaml 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 输出 ```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 < 6.0 或 source.grade == "D" 的内容: ```json { "filtered": true, "reason": "low_absurdity_score|low_source_quality", "headline": "原标题", "absurdity_score": 5.0, "source.grade": "D", "explanation": "具体原因说明" } ``` --- ## 完整示例 **输入**: ```xml Local Man Declares Himself Mayor Of Wendy's https://www.theonion.com/local-man-mayor-wendys Wed, 26 Mar 2026 10:00:00 GMT Local ``` **处理过程**: 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 **输出**: ```json { "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 < 6.0 | 输出过滤标记 | 不进入最终集 | --- ## 训练记录 - **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+)