Skip to content

composite:一个化名人物的两周 ​

状态:由 scripts/compose_corpus.py build 生成 frames.json 与 ids.json,再由 family 追加家庭流;噪音画像见 NOISE.md,弱标注见 LABELS.md。人物是化名拼成的,前四条流来自不同真实的人的公开数据,文本是真实原文,只做了规则替换,没有用模型生成或改写;家庭流是作者编写的原创文本,见家庭往来。

手写情境里一个人的两周只有 112 条、每条一句话;curl-bagder 补上了真实的噪音,但只有工作。这份语料把工作、社区爱好、生活琐事、家庭往来和订阅噪音放进同一个人的收件箱,并保留前四条流在时间上的真实重合;家庭流按这些时间编写,与它们咬合。

人物 ​

项化名设定
姓名Jonas Berglund,住在斯德哥尔摩,时区 Europe/Stockholm
工作开源网络传输库 skarv(含命令行工具与 libskarv)的创始人与首席维护者,公司化名 Lindbo
账号GitHub jberglund,Mastodon @jonasb@mastodon.social,论坛 jonasbe,问答站 Jonas B.,邮箱 jonas@berglund.example,博客 berglund.example
家里同居伴侣 Kajsa、女儿 Signe(11 岁)、儿子 Ture(4 岁),猫 Smilla;母亲独居外地,妹妹 Ulrika 住哥德堡。1940 年代的独栋房子,有棚屋、车道,地暖要铺;生活问答里也会提到公寓与厨房的电磁炉(见接缝)
爱好在自然观察论坛 Wildlog Forum 上发帖并关注“自然闲谈”等分类;骑车,自己修车
订阅11 份 newsletter(烹饪、科学随笔、技术、产品、经济、AI、建筑与住房,名字已化名),航空与零售营销邮件,手机天气提醒

各流 ​

窗口是 2026-08-03 至 08-17(不含),每 12 小时一帧,共 28 帧、3217 条输入。

流条数(占比)来源进入收件箱的规则
工作1676(52%)curl-bagder 的全部输入与原语料相同:GitHub 通知、CI 失败、邮件列表、Mastodon 回复与提及、博客评论,本人发言 405 条
社区738(23%)iNaturalist 公开论坛(Discourse),窗口内全站 1709 帖本人的帖子与回复本人的帖子;本人参与过的话题此后的全部帖子;关注的 4 个分类的全部帖子;另 2 个分类只收新话题首帖。本人是按规则选出的一位用户(窗口内发帖 15–70 条、九成在欧洲白天、“自然闲谈”发帖最多),本人发言 19 条
生活326(10%)Stack Exchange 8 个生活站点(房屋维修、自行车、旅行、烹饪、宠物、园艺、育儿、个人理财)34 个窗口内提出的问题当作本人所问,来自 34 位不同的提问者;收件箱里是问题本身、收到的回答与评论,本人发言 81 条
订阅89(3%)Substack 公开归档 50 篇;Enron 语料的营销群发 21 封;SMHI 观测值生成的天气提醒 18 条newsletter 按真实发布时间;营销邮件取 2001-05-28 起两周、各邮箱收到的同一期只留一封;天气每天 06:30 一条概况,高温(≥26 °C)或阵风(≥14 m/s)另发提醒
家庭388(12%)作者编写的原创文本:119 拍剧情与 31 组噪音,瑞典语,见 family/README.md按节拍表的时间插入各帧;家人、朋友与邻居的聊天,兽医、幼儿园、学校、银行、保险、水管工、快递等通知,本人发言 78 条

加入家庭流之前共 2829 条,工作占 59%。按他人发来的输入算,工作占 1271 / 2634 = 48%(加入前 1271 / 2324 = 55%)。

改写规则 ​

所有替换都来自一张只存本机的化名表(.local/composite/mapping.json,含随机盐,不入库),同一个真实名字在所有流里换成同一个化名。

  • 项目与组织:项目名在标识符里也替换并保持大小写(如 libskarv、SKARVOPT_URL),相关工具、公司、仓库、邮件列表与域名一并替换;第三方库与平台(OpenSSL、c-ares、GitHub、Mastodon 实例)保留。
  • 账号:GitHub、Mastodon、论坛与问答站的账号换成生成的化名(如 windy-drift);@提及、引用块、链接路径、查询参数与个人实例的主机名一起换;平台机器人(github-actions、Copilot 评审)保留。
  • 人名:作者栏的全名换成化名全名;正文里出现的常见人名(系统人名表中、又不是普通英文词的)与其后的姓一起换;名与姓允许多对一。
  • 问答的提问者:34 位提问者只在各自的问题下换成本人(作者栏与 @ 提及);他们在别的问题下出现时,和其他人一样用普通化名。
  • 编号:项目仓库的 issue/PR 编号整体减 9000(保持先后与互相引用;仓库#编号、refs/pull/编号/head、百分号编码的链接和正文里裸写的已知编号一并平移),CVE、HackerOne 报告、CI 运行、Mastodon 帖子、论坛话题(含引用头里的 topic:)与问答帖子的编号换成等长的稳定化名,链接里评论与评审的锚点和对应输入的 ID 用同一映射,提交哈希按前 7 位映射以保证长短缩写一致。
  • 邮件地址:本人的地址换成 jonas@berglund.example;看起来属于个人的地址换成化名,营销与客服类地址保留。
  • 营销邮件:订单、注册、出票等交易类邮件不用(含收件人姓名与住址);称呼与“FOR 收件人”换成本人;8 位以上数字、发件地址与链接里的跟踪串换成等长化名;正文里的日期与年份随整周平移。
  • 时间:工作、社区、newsletter 与天气都是同一窗口的真实时间。生活问答里斯德哥尔摩 0–7 点提出的问题,整条线程平移 −6 小时,按北美东部的钟面时间对齐。营销邮件从 2001-05-28(周一)平移 9198 天到 2026-08-03(周一),星期几与一天中的时段不变。
  • 每条输入带 stream 与 origin;origin 是原始记录 ID 的加盐摘要,持有本机盐可以逐条核对,公开的清单不能反查原始记录。

这是化名,不是匿名:正文是真实原文,逐字搜索仍可能找回出处。改写的目的是不在演示与评测数据里直接展示真实的人。

跨流的事 ​

下面六件事都是挑选时间或话题真实重合的线程得到的,没有手写输入。选择器写在 compose_corpus.py 的 CROSS_STREAM 里,不依赖化名后的 ID;labels.json 的 cross_stream 列出每件事的全部输入与它们的弱档位,用法见 LABELS.md。

事涉及的流帧主要输入
热浪里的空调与喝水:8 月 13–15 日连续高温,15 日上午问空调超出温控范围;13 日 Mastodon 上刚聊到一台分体空调的控制面板;3 日问过宠物在热天里狂喝水生活、订阅、工作f01、f22、f24、f25wx:20260813:heat 等 3 条、qa:diy:q300671、md:336799047130945204、qa:pets:q35865
航班变更撞上最忙的工作日:8 月 6 日中午直飞改转机、换乘极紧,这天工作输入最多;前两天刚收到航空特价群发生活、订阅、工作f03–f08、f22qa:travel:q321223、5 封航空营销、同时段本人的 3 条 Mastodon
宠物药量弄错:8 月 11 日下午怀疑给猫喂了双倍抗生素,前后一小时有十几条工作输入在等;提问者此后没有再跟进,是内容判断与行为标注分歧的样本生活、工作f18qa:pets:q16452 与同时段 14 条工作输入
周六水管开裂:8 月 15 日下午问铜水管裂口能不能补,当天上午还在批准与关闭 PR,天气仍是高温生活、工作f25、f26qa:diy:q703714 与本人当天的 7 个工作动作
AI 找漏洞:3 日本人在 Mastodon 上说“没有 LLM 已经找不到这些漏洞了”,同期几份 newsletter 讲 LLM 安全威胁模型与前沿模型的攻击能力订阅、工作f01、f02、f14、f22md:383436635529304118、nl:360169234、nl:937646879、nl:409873652
厨房:8 日问贝壳类高汤、12 日问电磁炉锅具,同一周的美食 newsletter 写度假屋做饭与番茄生活、订阅f02、f11、f16、f20qa:cooking:q784539、qa:cooking:q535395、nl:791419926、nl:397896312

修订 ​

第一版发出后又修补了几处改写遗漏,输入条数、帧与流的划分不变:

  • 4 条博客评论的 ID 与所在线程改为化名编号(原来保留了原始编号)。
  • 论坛引用头里的话题号、链接里评论与评审的锚点、正文里裸写或百分号编码的项目编号,此前保留原值,现在化名。
  • 问答的提问者此前在所有问题下都被换成本人,导致 21 条别人的回答与评论署名成本人;现在只在各自的问题下替换。
  • 营销邮件发件地址与链接里的跟踪串换成化名。

家庭往来 ​

前四条流都没有一个会等 Jonas 回话的人。家庭流补上家人、朋友、邻居与家务通知:388 条,占 12%,长度中位 39 字符,是最碎、最短、空话最多的一条流,又最常要他本人拿主意。

项内容
来源作者编写的原创文本,不来自任何真实的人。节拍表 family/beats.json 是事实与标注的唯一来源,BEATS.md 是中文可读版,成品 messages.json 入库
人物伴侣 Kajsa(手术室护士)、女儿 Signe、儿子 Ture、猫 Smilla、母亲(通讯录里叫 Mamma)、妹妹 Ulrika、Kajsa 的父亲 Göran、朋友 Joakim、邻居 Gunnel;另有班级家长群、街坊群与派对群里的几十个人
剧情六条线:猫看病与药量(要去办)、母亲九月换水管期间住哪(要决定,最后她自己定了)、和朋友骑车(不了了之)、车道下的主水管漏水(窗口结束时仍要他决定)、9 月 14 日那趟航班几点到家、小龙虾派对报人数;另有孩子发烧被接回、女儿夜里看漫画、伴侣换新车、开学要签的文件等一次性的事
方法人写的消息由 Agent 逐段写成;动笔前在本机读过 Enron 私人往来的同类线程校准语气,只仿形态,不翻译、不改写任何一封。通知类用 31 种模板,噪音层另写。2026-10-15 用户决定:可以参考真实数据仿写,但不能用真实内容,形式不限于邮件
不可回溯成品与参考的 5044 封邮件没有共同的专名,与整个 Enron 语料 517,401 封没有 8 词以上的重合,见 family/README.md
标注作者写定,依据标 authored,存为 labels.json 的 family 一节,见 LABELS.md;评测时与前四条流分开计分,见第二次自由运行

家庭流与生活流有 15 处话题咬合(猫的药量、航班改经停、退单、铜水管、两次刹车等),由节拍表写明,不靠时间偶合挑选;它们列在 labels.json 的 family.cross_stream,不改上面六件跨流的事。

接缝 ​

拼接人物必然有对不上的地方,评测时应当知道它们来自拼接而不是 Agent 的误读:

  • 生活问答来自 34 位不同的人:有人说住公寓、有人有车道和棚屋,有人提到住在法国,房屋问题多按北美的电气与建材习惯。
  • 营销邮件的正文是 2001 年的:CD 商店、父亲节礼物、按美元计价的航线。
  • 论坛上的“本人”与工作中的本人是不同的真实的人,写作风格不同。
  • 天气提醒是用当天的观测值生成的模板,不是当时发布的预报;这两周斯德哥尔摩几乎没有降水。
  • 常见人名规则会误伤专有名词(例如某个奖项名里的名字被换掉)。
  • 家庭流按“女儿 11 岁、儿子 4 岁、养一只猫、住独栋”写,与生活流里问狗、两个十几岁儿子、四只猫、住公寓的提问冲突更明显;这一版不挪这些提问。
  • 家庭流的时间与话题是按其余四条流编写的,彼此有真实的因果;前四条流之间只有时间重合。

许可与入库 ​

来源许可或条款本仓库保存什么
GitHub、Mastodon、curl 邮件列表与博客作者保留版权只在本机
iNaturalist 论坛作者保留版权只在本机
Stack ExchangeCC BY-SA 4.0,需署名并以相同方式共享只在本机
Substack newsletter作者保留版权只在本机
Enron 邮件FERC 调查公开,CMU 发布供研究只在本机
SMHI 观测CC BY 4.0只在本机
家庭流作者原创,无第三方版权节拍表、成品与检查结果入库(family/)

入库的只有 ids.json(化名 ID、帧、流、类型、时间、作者类别、线程、原文长度与哈希、origin;家庭流的 origin 是 authored: 加拍号)、noise.json、labels.json、说明文档,以及家庭流的原创文本(family/)。frames.json 与 raw/ 被 .gitignore 忽略。原型演示数据 scenario.mjs 是例外:它收入了截到 500 字的改写正文,随本分支入库(见 SOURCES.md)。改写后的文本能否随演示数据公开,取决于各来源的条款,需要用户决定。

重建 ​

需要 curl-bagder 的 raw/ 已抓好、Enron 压缩包已缓存,并持有本机化名表:

sh
.venv/bin/python scripts/fetch_corpus.py composite        # 论坛、问答、newsletter、天气
.venv/bin/python scripts/compose_corpus.py build          # frames.json;与入库的 ids.json 对照
.venv/bin/python scripts/compose_corpus.py labels         # labels.json:各流的弱标注与跨流的事
.venv/bin/python scripts/compose_corpus.py noise          # noise.json:与 curl-bagder、手写情境并排
.venv/bin/python scripts/compose_corpus.py audit --sample 30   # 抽样核对,并扫描残留的真实名字
.venv/bin/python scripts/compose_corpus.py family         # 追加家庭流(只需要现有 frames.json 与入库的节拍表)
.venv/bin/python scripts/family_stream.py check            # 家庭流的不可回溯检查(需要 Enron 压缩包)

没有化名表时,第一次运行会生成一张新的(新的盐、新的化名),各流的挑选需要重新填写,ID 会与入库的清单不同。2026-10-15 本机的化名表与各流 raw/ 随一个误删的工作区丢失(Enron 压缩包已重新下载),前四条流目前无法按原来的化名从 raw 重建;现有的 frames.json 仍可用,家庭流只在它上面追加。