Files
whale-fall-code 2bb83f3685 初始提交:抖音视频批量采集流水线
App 端免签名接口(设备注册 + detail + CDN 直链),一体化流水线
下载→抽音→传COS→记录→删本地,AI 作品四档判定,四份文档:
README(使用指南)、PROGRESS(批次进度)、RE(逆向全过程)、AI(判定规则)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-29 16:31:10 +08:00

216 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI 判定规则详解
> 本文档逐条解释 `douyin/aiclass.py` 的判定逻辑:信号从哪来、四档怎么定、
> 每个词表为什么这么选、已知误收和否决理由。改规则之前必读;
> 每个坑在 `test_aiclass.py` 里都有对应测试(29 个),改完务必跑通。
> 各批筛选结果和下载进度见 [PROGRESS.md](PROGRESS.md) §4.5。
---
## 1. 判定对象:三个文本源,地位不同
每条记录抽出三段文本,权重严格递减:
| 来源 | 构成 | 地位 |
|---|---|---|
| **body**(作品文本) | `desc` + 所有 hashtags 的 name | 主信号场,能定 strong / topic |
| **author**(作者昵称) | `author.nickname` | 只能兜底成 author 档,**绝不往上顶** |
| **music**(音乐标题) | `music.title`,但先剥壳(见 §6) | 同上 |
「作者昵称 / 音乐标题」回答的是**谁发的**,不是**作品是什么**。实测
@牛牛Ai 发普法解说、@你好,我是大福 发真人游泳视频——昵称带 AI 的作品
多数不是 AI。所以 author/music 的命中只能在作品自身毫无信号时兜底成
`author` 档(`classify()` 里 `if tier == "none"` 才采纳)。
## 2. 四档体系
档位之间不重叠,一条记录取**最强**的一档:
```
platform > strong > topic > author > none
```
| 档 | 依据 | 含义 | 可信度 |
|---|---|---|---|
| `platform` | 爬虫打的 `ai.is_aigc` | 抖音官方 AIGC 标 | 最高,且唯一能抓到「作者什么都没标但确实是 AI」的作品——实测 1744 条文案零 AI 字样 |
| `strong` | body 里有明确「这是 AI 做的」信号 | 见 §3 的四路信号 | 高 |
| `topic` | body 只提到 AI 本身 | 在讲 AI(教程/新闻/大模型),不一定是 AI 做的 | 中 |
| `author` | 只有昵称/音乐标题带 AI | 兜底档,会误收 | 低 |
| `none` | 无信号 | | |
⚠️ **已知 bug**:爬虫层把「`risk_infos` 有内容」就当 `is_aigc=true`,把
虚构演绎/个人观点等免责声明也算进了 platform 档,全库误算 1029 条。正确做法
是认 `risk_infos.type ∈ {44, 47, 76, 328}`(44=作者声明、47=疑似、76/328=平台判定),
修法在 PROGRESS.md §7 待办。`raw.is_aigc_media` 全库皆 false,别信。
## 3. strong 档的四路信号(body 里任一成立)
### 3.1 `aigc` token
独立的 `aigc` 字样直接 strong。边界规则见 §5。
### 3.2 生成工具名单 `_GEN_TOOLS`——命中即 strong,不要求 ai 同现
用了生成工具 = 片子是 AI 做的,这是最强的文本证据。名单 70+ 个,分三类:
- **中文工具**:即梦、可灵、海螺(注意这个在歧义表,见 3.5)、海艺、小云雀、
妙鸭、一帧秒创、腾讯智影、讯飞智作、硅基智能、魔音工坊、元气口播、万兴播爆、
闪剪、声音克隆/语音克隆/克隆音色/音色克隆……
- **英文工具**:dreamina、jimeng、seedance、seedream、kling、vidu、pixverse、
pika、luma、runway、sora、viggle、heygen、midjourney、comfyui、flux、
nanobanana、stable diffusion、liblib、suno、udio、veo3、hunyuanvideo、
cogvideo、controlnet、domoai、synthesia、deepbrain……
- **生成动词**:文生视频、图生视频、文生图、图生图、生成式
**选词标准**(2026-08 扩充时定的):「这串字在中文短视频文案里不可能有别的意思」。
全部在 12.7 万条真实数据上验过——要么零命中(备着以后用),要么命中全是真 AI。
反过来,这些被明确**拒收**:`tripo`(撞 tripod 三脚架)、`seaweed`(海藻)、
`lora`(撞 valorant,实测命中 3 条全是无畏契约)、`captions`、`playground`。
### 3.3 AI 漫剧专有名词 `_MANJU`——单独出现即 strong
AI 漫剧已形成固定圈子,这些词在 18.4 万条数据里几乎只出现在 AI 作品上
(括号=全库命中/仍漏掉的):
- 圈内词:漫剧(1568/64)、治愈系漫画(80/0)、渡灵书(62/0)、超级裂变(46/0)、
二次元动漫(33/0)、月落小溪(25/4)、七罪创世(21/0)、晚夏小梦(67/4)、
灵绘漫客(12/0)、neowow(12/0)、猫箱跨次元相遇(114/12) 等
- **红果片名**(字节免费短剧 App 的 AI 漫剧):万妖图录传、发配边关、
罪妻开荒养出战神、斩仙台、杂灵根……**来源是新闻报道热榜,不是红果完整片库**,
红果不公开片库,遇到新片名往这加
实测**拒收**的(题材 ≠ AI 标记):西游记(+26 真·玄奘故里游记)、孙悟空(+16)、
宫崎骏(+10 龙猫童年)、民间故事、睡前故事、国漫推荐(+4《剑来》真人制作)、
原创动漫(+18 手绘二次元)、创作者激励计划、未来导演扶持计划、开放赛道(后三个是
抖音通用活动)。
**为什么「红果」两个字不能进表**:红果主体是真人短剧,AI 漫剧只是一个赛道。
实测 3 条命中 2 条真人短剧(《家里家外2》《冷御失守》)、1 条演员面试。
要抓红果的 AI 漫剧只能靠具体片名。
### 3.4 `ai` + 创作语境词 `_GEN_CTX`——同现才成立
单独的 `ai` 只能算 topic。必须跟 41 个创作/生成语境词之一同现才升级 strong:
短剧、漫剧、动画、视频、绘画、创作、制作、生成、分身、配音、换脸、特效、导演、
数字人、虚拟人、成片、写真、转绘、扩图、提示词……
反过来,中文泛词(动画/绘画/分身/动漫)**不跟 ai 同现就一律不算**——830 条
`#原创动画` 全是手绘,早期版本单独算信号误收几千条。`剪映`(375)/`关键帧`(314)/
`蒙版`(203)/`转场` 是剪辑术语,根本不是 AI 信号。
### 3.5 歧义工具 `_AMBIG_GEN`——必须跟 ai/aigc 同现
工具名本身是常用词,单独出现几乎全是误判(数据来自全库统计):
| 词 | 误判实例 | 真命中 |
|---|---|---|
| 豆包 | 224 条:狗名、豆沙包、「反强包之神」 | 145 条,全带 AI 字样 |
| 海螺 | 13 条:三峰「海螺」帐篷 | 全带 AI 字样 |
| 元宝 | 11 条:316 不锈钢元宝勺 | 全带 AI 字样 |
| 万相 | 17 条:《龙神万相》、万相集 | 全带 AI 字样 |
| 星流 | 「明星流量」子串 | 全带 AI 字样 |
| 清影 | 「起舞弄清影」 | 全带 AI 字样 |
真命中**无一例外**同时带 AI 字样,所以这道门槛不掉召回。同机制的还有
`_AMBIG_CHAT`(豆包、元宝、混元,归 topic 档)。
## 4. topic 档:在讲 AI,不一定是 AI 做的
- **模型名单** `_CHAT_TOOLS`:chatgpt、deepseek、kimi、通义、千问、qwen、文心、
ernie、智谱、glm、copilot、gemini、grok,及中文泛词 人工智能、大模型、
神经网络、机器学习、深度学习
- **独立成词的** `_CHAT_RE`:gpt、claude、llm、agi、ai agent(要求词边界,
避免 gpt 撞上别的串)
命中即 topic;若同时撞了 §3 的 strong 信号,取 strong。
## 5. 归一化与词边界:AI 的三种写法、词中词的两难
### 5.1 AI 的冒充写法
`ai` 的第二个字符实际匹配四种:`i`、小写 `l`、罗马数字 `Ⅰ`/`ⅰ`(U+2160/U+2170):
- `Al`(大写 A + 小写 L):标签 `抖音al` 出现 129 次,文案有 `#Al创作`
- `#AⅠ漫剧`:罗马数字冒充,与 `Al` 同套路
### 5.2 独立词边界
- `_AI` / `_AIGC`:前后不能接字母数字(挡 email、detail、again、hair),
但**允许接中文**(`AI绘画` 要命中)
- `_alt()`(工具/模型/漫剧名单共用的编译器):纯 ASCII 词只挡字母、
**不挡数字和中文**——数据里满地 `Seedance2.0`、`sora2`、`runninghub0.21`、
`libtv创作者`,一刀切 `\b` 会丢 3500+ 条真命中
- 但真正的词中词要挡:`udio` 藏在 `Grass Studio`/`theonestudio` 里 17 次、
`flux` 藏在 `Fluxxwave` 曲名里 1 次(都是音乐标题混进 author 档的)
## 6. 音乐标题剥壳
抖音默认原声的标题就是个壳,里面是作者昵称复读,不含作品信息:
```
jsonl: @<昵称>创作的原声
csv: @<昵称>创作的原声 - <昵称> ← 后缀那半截也要剥
```
**不剥会怎样**:昵称带 AI 会连「创作」一起命中 `_GEN_CTX`,作者昵称就从
music 这条路偷偷升到 strong——实测 771 条这样混进来(@冠宇Aigc 的猴子炒菜、
@牛牛Ai 的大案纪实)。剥完后音乐标题只剩 16 条还有命中,这条路本来就没什么
价值,只配给 author 档兜底。注意 csv 的壳多一截 ` - 昵称`,剥壳正则必须两种都覆盖,
否则 bug 在 csv 输入上复发。
## 7. 明确否决的信号(放开只进误判,实测一条真的都捞不到)
| 否决词 | 污染来源 |
|---|---|
| 数字人 | 数字人民币 |
| 分身 | 微信分身、五五分身材 |
| 换脸 | 「这套穿搭能换脸」 |
| lora | 无畏契约 valorant |
| tripo | tripod 三脚架 |
| seaweed | 海藻 |
| 度加 | 「亏损幅度加大」 |
| 万彩 | 「29万彩礼」 |
| 生数 | 「诞生数副名场面」 |
| 节点 | 「关键节点」 |
| 抽卡 | 原神 |
| 捏脸 | 燕云十六声 |
| 国漫 | 《剑来》真人制作 |
| 对口型 | 真人对口型 |
测试锚点:`test_rejected_candidates_stay_none`、`test_digital_rmb_is_not_a_digital_human`、
`test_hongguo_platform_name_is_not_an_ai_signal`。
## 8. 维护指南
**加新工具名**:
1. 先问「这串字在中文短视频文案里有没有别的意思」。没有 → `_GEN_TOOLS`;
是常用词但真命中都带 AI → `_AMBIG_GEN`;是对话模型 → `_CHAT_TOOLS`;
常用词模型 → `_AMBIG_CHAT`
2. 在真实数据上跑一遍验证:命中应全为真 AI,或至少零命中
3. 加测试用例到 `test_aiclass.py`(用真实文案,别造)
4. 红果新片名 → `_MANJU` 片名区;通用活动标签别收
**判档结果怎么用**:`clean_ai.py --tier platform,strong` 是默认推荐组合
(可下载清单的标准切法);`topic` 档是「讲 AI 的新闻科普」,多数采集场景不要;
`--platform-needs-text` 用于卡「平台标了 AIGC 但文案零信号」的带货视频,但会误伤
@栖光 类 AI 古风美图作者(文案一个 AI 字都不写),这批要按是否带货再分
(`lists/platform无佐证_*.txt`)。
## 9. 测试对照表(改规则的回归网)
| 测试 | 守什么 |
|---|---|
| `test_platform_label_wins_even_with_no_ai_text` | platform 档优先,文案零信号也成立 |
| `test_strong_*`(5 个) | 四路 strong 信号:复合词、工具名、aigc、Al 冒充 |
| `test_topic_*`(2 个) | 纯 AI 提及、模型名只给 topic |
| `test_author_never_upgrades_a_scored_item` | 昵称/music 绝不把已定级的作品往上顶 |
| `test_default_original_sound_is_not_a_work_signal` / `test_sound_wrapper_csv_form_is_stripped` | 音乐壳剥壳(jsonl + csv 两种写法) |
| `test_english_words_containing_ai_are_not_signals` | email/detail/hair 不算 |
| `test_editing_jargon_is_not_ai` / `test_generic_chinese_words_alone_are_not_ai` | 剪辑术语、中文泛词单独不成立 |
| `test_ambiguous_tool_*`(2 个) | 歧义工具单独不算、带 AI 才算 |
| `test_roman_numeral_impersonates_ai` / `test_strong_handles_capital_A_lowercase_L` | 两种 AI 冒充写法 |
| `test_rejected_candidates_stay_none` + 同组 | §7 否决清单 |
| `test_manju_*`(3 个) | 漫剧词单独成立、红果不成立、题材词不收 |
| `test_veo3_beats_a_weak_author_signal` | 强信号压弱信号 |