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
能力定义
核心能力
- RSS 抓取与解析 - 来源质量优化策略
- 荒诞内容识别与评分 - 7 类型元素精准识别
- 短剧素材结构化提取 - A/B/C/D 改编价值评估
- 完整元数据输出 - 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>
处理过程:
- 来源: The Onion + Local → grade = S, source_quality = 10
- 时效: 当天发布 → timeliness = 10, category = fresh
- 荒诞分析:
- 元素类型: A (超现实设定) + C (荒诞日常)
- 结构: [普通人] + [非凡行为] → 7 分
- absurd_premise: "普通快餐顾客自封餐厅市长"
- satire_angle: "讽刺人们对微小权力的荒谬渴望"
- dramatic_twist: "自封而非选举产生"
- absurdity_score: 8.5
- 改编评估:
- 视觉化潜力高 (餐厅场景简单)
- 冲突清晰 (自封市长 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+)