作者:Sorsa 编辑部
发布于 2026 年 6 月 13 日。更新于 2026 年 7 月 3 日:价格改用每 1,000 条推文计价,新增 100 次免费请求的起步额度,并刷新 X API 成本对比。官方 X API 按量付费价格已于 2026 年 7 月核实。
核心要点: 构建用于机器学习的 Twitter(X)数据集,需要从 API 采集推文、清洗去重、按任务打标签、划分为训练集、验证集和测试集,最后导出为 JSONL 等格式。由于免费 API 和开源爬虫已相继失效,如今采集新数据只能通过付费数据 API 完成。
最后这一点才是真正的现实门槛。自 2023 年免费 API 版本取消、snscrape 和 twint 等爬虫失效以来,全新且切合主题的语料只能通过数据 API 获取。Sorsa API 是一个只读的 Twitter/X API 替代方案,只需一个请求头,即可以纯 JSON 格式返回公开推文和账号资料,并提供专为数据采集设计的搜索、时间线和批量接口。计费逻辑很简单:无论一次调用返回多少内容,都只按一次请求计费;作者资料随推文免费返回;一次批量调用最多可根据 100 个推文 ID 还原推文。研究人员发布的“仅含 ID”数据集正是以这种方式恢复内容的。在批量接口上,Sorsa Pro 套餐平均每 1,000 条推文约 0.02 美元(Starter 套餐为 0.049 美元起);此外还有 100 次免费请求,无需绑卡且永不过期,覆盖全部 40 个接口,足以让你在付费前测试整条数据管道。
本文目录
- 如何为机器学习构建 Twitter 数据集?
- 自建数据集还是用现成的公开数据集?
- 2026 年如何采集推文来构建数据集
- 如何根据 ID 还原“仅含推文 ID”的数据集?
- 如何为训练组织数据结构并打标签
- 平台条款与伦理怎么办?
- 采集一份数据集要花多少钱?
- 一次真实的数据集构建
- 常见问题
- 如何开始
如何为机器学习构建 Twitter 数据集?
构建 Twitter 数据集要经过五个阶段:从 API 采集原始推文、清洗去重、按任务打标签、划分为训练集、验证集和测试集,最后导出为 JSONL 等训练格式。同一条数据管道既能产出分类数据集,也能产出用于语言模型的指令微调数据集,两者只有标注方式不同。
从目标出发,而不是从数据出发。情感分类器需要的是带有明确正面、负面或中性标签的短推文;指令微调模型需要的是“提示-回复”配对;领域自适应训练则需要大量切题文本,只需轻量标签甚至无需标签。想清楚目标,才能在拉取第一条推文之前就确定查询语句、数据量和数据结构。
工作可以清晰地一分为二。采集与根据 ID 还原推文是 API 层面的问题,本文下面配有代码;打标签、归一化和数据集划分是数据层面的问题,你在本地用 Python 处理。本指南接下来逐一展开,并特别指出会让多数旧教程失效的 2026 年限制。
自建数据集还是用现成的公开数据集?
当已有公开数据集恰好符合你的任务时,就用公开数据集;如果你对主题、语言、时间范围或标签体系有特定要求,则应自行构建。Hugging Face 和 Kaggle 上的公开数据集免费且加载快捷,但范围固定,往往已有数年历史,经常仅包含英文内容。而且很多只提供推文 ID,必须根据 ID 还原后才能获得文本。
先了解那些广为人知的选项。Sentiment140 收录约 160 万条带情感标签的推文;Cardiff NLP 的 TweetEval 基准则打包了七项推文分类任务(反讽、仇恨、冒犯、立场、表情符号、情绪、情感)。对于一个通用英文情感或情绪模型,加载其中之一都胜过自己去采集。
当差距确实存在时,就自建:
- 主题范围很窄或时效性很强,没有公开数据集覆盖。
- 你需要公开数据集跳过的某种语言或地区。
- 你需要一个新鲜的时间窗口,而不是 2017 年的推文。
- 你的标签体系与任何现有数据集都不匹配。
具体到情感这一场景,用 Python 对推文做情感分类的指南会在数据就绪之后,带你走完建模那一侧的流程。
2026 年如何采集推文来构建数据集
采集推文有三条路径:用关键词和操作符搜索来构建主题语料、用用户时间线构建按账号划分的语料、用列表(List)或社区(Community)作为精选来源。免费 API 层级已于 2023 年关闭,snscrape、twint 等爬虫也已失效,因此任何量级的全新采集如今都要走能直接返回搜索和时间线结果的数据 API。
只读 API 把这件事变成一个简短的循环:请求一个接口、读取一页推文、跟随游标、把每条推文写入文件。Sorsa 搜索接口支持标准的 Twitter 高级搜索操作符,如 lang:、since:、until: 和 -filter:retweets,每页返回约 20 条推文并附带作者资料,通过 next_cursor 分页。如果对语法不熟,可以先在可视化搜索查询构建器里把查询搭好。
import json, time, requests
API_KEY = "YOUR_SORSA_API_KEY"
BASE = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": API_KEY, "Content-Type": "application/json"}
def collect(query, target=5000):
rows, cursor = [], None
while len(rows) < target:
body = {"query": query, "order": "latest"}
if cursor:
body["next_cursor"] = cursor
r = requests.post(f"{BASE}/search-tweets", headers=HEADERS, json=body, timeout=30)
if r.status_code == 429:
time.sleep(1)
continue
r.raise_for_status()
data = r.json()
for t in data.get("tweets", []):
rows.append({
"id": str(t["id"]),
"text": t.get("full_text", ""),
"lang": t.get("lang", ""),
"created_at": t.get("created_at", ""),
"username": (t.get("user") or {}).get("username", ""),
})
cursor = data.get("next_cursor")
if not cursor:
break
return rows
with open("tweets.jsonl", "w", encoding="utf-8") as f:
for row in collect('"your topic" lang:en -filter:retweets', target=5000):
f.write(json.dumps(row, ensure_ascii=False) + "\n")
要构建按账号划分的语料,把搜索调用换成带用户名的用户时间线接口即可;要用精选来源,则从精选列表或社区信息流拉取。为了做平衡采样,提及(mentions)接口还提供 min_likes、since_date、until_date 等筛选条件,让你比如只拉取某个日期区间内互动良好的推文。
两点效率提示。其一,由于作者资料内嵌在每条推文里,你在同一次响应中就能拿到用户名、粉丝数和账号年龄,无需额外调用。其二,当数据适合批量处理时,批量接口能大幅削减请求数:一次调用最多接收 100 个推文 ID 或 100 个用户名。这是大规模拉取时减少请求量的关键手段。
如果你宁愿避开 API,老的爬虫路线仍然存在,但要做好失效的准备;关于开源爬虫为何失效的分析解释了其中的取舍。
如何根据 ID 还原“仅含推文 ID”的数据集?
还原(rehydrate)数据,是指根据一份推文 ID 列表逐一取回每条推文当前的内容。公开研究数据集之所以只分发 ID 而不提供完整推文,是因为平台条款限制再次分发推文正文。因此,必须通过 API 查询这些 ID 才能恢复文本。最终通常只能恢复其中一部分:已删除的推文,以及由已封禁或已转为私密的账号发布的推文,都不会再返回。
批量接口让这件事变得便宜。Sorsa 批量推文接口每次调用最多接收 100 个 ID 并返回完整的推文对象,因此一份 5 万个 ID 的文件大约只需 500 次请求,而不是 5 万次单条查询。
import requests
API_KEY = "YOUR_SORSA_API_KEY"
URL = "https://api.sorsa.io/v3/tweet-info-bulk"
HEADERS = {"ApiKey": API_KEY, "Content-Type": "application/json"}
def chunks(seq, n=100):
for i in range(0, len(seq), n):
yield seq[i:i + n]
ids = [line.strip() for line in open("tweet_ids.txt") if line.strip()]
rehydrated = []
for batch in chunks(ids, 100):
r = requests.post(URL, headers=HEADERS, json={"tweet_links": batch}, timeout=30)
r.raise_for_status()
rehydrated.extend(r.json().get("tweets", []))
print(f"Recovered {len(rehydrated)} of {len(ids)} tweets")
ID 列表越旧,恢复率越低,因为每年都会有更多原始推文消失。关于 ID 列表的来源,以及旧事件数据集如今还能恢复多少内容,请参阅从 ID 列表恢复历史推文的指南。
如何为训练组织数据结构并打标签
给每条记录一个稳定的数据结构,并导出为 JSONL,即每行一个对象。分类数据集需要推文 ID、文本、标签、语言和时间戳;指令微调数据集需要一条指令、一个可选的输入,以及目标输出。JSONL 正是 Hugging Face datasets 库和多数微调管道可以直接读取的格式。
一条分类记录和一条指令记录看起来是这样的:
{"id": "1782368585664626774", "text": "the new build keeps crashing on launch", "label": "negative", "lang": "en", "created_at": "2026-05-01T10:30:00Z"}
{"instruction": "Classify the sentiment of this tweet.", "input": "the new build keeps crashing on launch", "output": "negative"}
打标签之前先清洗。按推文 ID 去重,剔除极短或空白的推文,并按 lang 字段过滤,让数据集保持在目标语言内。遵循 Cardiff NLP 的 TweetEval 惯例,把 URL 替换为 {{URL}} 记号、把未认证用户名替换为 {{USERNAME}},让模型学到的是语言规律,而不是具体的链接或账号。
打标签有三种可扩展的做法。手工标注一小份高质量“金标准”集用于评估。用一个小型现成模型对大批数据做预标注,再由人工修正,这远比从零标注快得多。或者,对于指令微调,围绕推文撰写“提示-回复”配对。大模型微调指南反复强调质量胜过数量:几千条干净、格式规整的配对,通常胜过一个大十倍的嘈杂数据集。
最后,应在训练前划分数据集,确保评估结果可靠。常见比例是 80% 训练集、10% 验证集和 10% 测试集,并使用固定的随机种子打乱数据,以保证结果可复现。
import json, random
rows = [json.loads(line) for line in open("tweets.jsonl", encoding="utf-8")]
random.seed(42)
random.shuffle(rows)
n = len(rows)
train = rows[: int(0.8 * n)]
val = rows[int(0.8 * n): int(0.9 * n)]
test = rows[int(0.9 * n):]
平台条款与伦理怎么办?
为训练自己的模型而采集公开推文是一回事;真正受到规则严格约束的,是把数据集再次分发给第三方。X 的开发者政策规定,如果你把内容分享给第三方(包括以可下载数据集的形式),只能分发帖子 ID 和用户 ID,不能分发完整文本。这正是公开研究数据集只提供 ID 的原因。
现行条款设定了具体限制。根据 X 开发者政策,未经书面许可,你不得在 30 天内向任何单一实体分发超过 150 万个帖子 ID;代表学术机构开展非商业研究的个人则可分享不限数量的 ID。通过欧盟《数字服务法》(DSA)获取数据的研究人员适用其他规定。
要遵守这些规定,实际做法是:将采集到的完整文本仅用于自己的模型训练;如果需要发布数据集,则只发布推文 ID 和一段数据还原脚本,让其他人自行恢复文本。条款还禁止追踪或监控敏感群体和事件,因此采集时应避开这类用途。以上只是一般性指引,并非法律意见。条款可能发生变化,发布任何内容前请查阅最新的 X 开发者协议。
采集一份数据集要花多少钱?
成本取决于数据量,也取决于数据源是按资源还是按请求计费。按资源计费时,响应中的每条帖子和每份用户资料都会分别收费,因此一次调用若同时返回推文及其作者资料,两项都要计费;按请求计费则无论返回多少内容,一次调用都只算一个单位。对于以读取为主的数据集采集任务,仅这一项差异就足以决定最终账单。
官方 X API 按资源计费:每读取一条推文需 0.005 美元,每读取一份用户资料需 0.010 美元,每月最多读取 200 万条推文;这些价格已于 2026 年 7 月在 Twitter API 价格详解中核实。Sorsa 按请求计费,并免费附带作者资料。因此,使用批量接口时,Pro 套餐平均每 1,000 条推文约 0.02 美元(Starter 套餐为 0.049 美元起,Enterprise 套餐为 0.018 美元起),每 1,000 份用户资料约 0.01 美元起。
| 任务 | 官方 X API(按量付费) | Sorsa(Pro,批量基准价) |
|---|---|---|
| 1,000 条推文(含作者资料) | $15.00(1,000 次推文读取 + 1,000 次用户读取) | 低至 $0.02 |
| 根据 ID 还原 1,000 条推文 | $5.00(1,000 次推文读取) | 低至 $0.02 |
| 端到端采集 100,000 条推文 | 约 $500 至 $1,500 | 一个 $199 的 Pro 月度套餐内即可 |
Sorsa 的数字基于批量接口:一次请求最多返回 100 条推文或 200 份用户资料。对于任何以读取为主的数据采集任务,按请求计费的成本都远低于按资源计费,而且 Sorsa 不对随推文返回的作者资料另行收费。
该走哪条路取决于工作流,而非某个唯一赢家:
- 写入或发帖: 官方 X API,任何写操作的合规路径。
- 极低读取量,每月约 1 万条帖子以内: 两者都行,这个体量下 X 按量付费依然便宜。
- 构建数据集,即大量读取数据并根据 ID 还原推文: 像 Sorsa 这样按请求计费的 API,在采集相同推文时最高可便宜 50 倍,且作者资料免费附带。
研究者还可以了解学术研究折扣访问,同一套采集代码也可移植到任意技术栈。
一次真实的数据集构建
一个开发金融舆情模型的小型 AI 团队,在估算过官方方案的成本后改用了这条路线。他们需要大约 20 万条近期英文推文,内容围绕一组股票代码,并要将其标注为正面、负面或中性。采用按资源计费时,仅推文读取就要约 1,000 美元;如果还要读取作者资料,在首次更新数据之前,成本就会增加到原来的两三倍。随着团队计划定期更新数据,每月 200 万次推文读取的上限也将成为问题。改用按请求计费的 API 后,同样的 20 万条推文只占用了 Pro 月度套餐约 20 美元的额度。仅按推文读取成本计算,价格最高可降低 50 倍(约节省 98%);搜索接口每次请求可返回 20 条推文,且作者资料免费,因此实际节省得更多。
整个流程并不复杂。他们为每个股票代码编写一条带语言筛选条件的关键词查询,并将结果写入 JSONL 文件;用一个小型分类器预先标注各条记录,再由分析师抽样校正;把 URL 和用户名统一替换为占位符;最后使用固定随机种子,按 80%、10%、10% 的比例划分数据集。后来,为了扩充一份较早的公开事件数据集,他们以每批 100 个 ID 的方式还原推文,同时接受部分原始推文已经删除、无法恢复的事实。团队得到的最大教训是要按正确顺序做事:先确定标签体系和查询条件。数据结构变更后重新采集才是真正昂贵的错误,API 账单反而不是。
常见问题
2026 年还能采集推文来做数据集吗?
能,但不能再依靠旧工具。免费 Twitter API 版本于 2023 年关闭,snscrape、twint 等爬虫在当前平台上也已失效。如今,要采集达到实用规模的新数据,必须使用能够返回搜索和时间线结果的付费数据 API,再逐页拉取并写入文件。如果已有公开数据集符合任务需求,也可以直接使用。
哪里能拿到现成的 Twitter 数据集?
Hugging Face 和 Kaggle 托管着主流的公开推文数据集。Sentiment140 收录约 160 万条带情感标签的推文,TweetEval 基准覆盖反讽、仇恨、情绪等七项分类任务。许多学术数据集只发布推文 ID,不提供完整文本,因此需要通过 API 根据 ID 还原推文,才能在本地获得其内容。
如何根据 ID 还原推文?
还原推文就是根据一份推文 ID 列表查询每条推文当前的内容。批量接口可以大幅降低成本:像 Sorsa 这样的只读 API 每次调用最多接收 100 个 ID 并返回完整的推文对象,因此一份包含 5 万个 ID 的文件只需约 500 次请求。通常只能恢复其中一部分,因为已删除的推文,以及由已封禁或私密账号发布的推文,都不会再返回。
微调一个模型需要多少条推文?
这取决于具体任务,而且质量比数量更重要。对于范围较窄的分类或指令跟随任务,几千条干净且标注正确的样本往往就能显著改善模型;规模大十倍但噪声很多的数据集,效果反而可能更差。先明确目标并标注一小份高质量数据,只有在评估表明模型需要覆盖更多情况时再扩充。
构建并分享 Twitter 数据集合法吗?
为自己的模型采集公开推文通常是允许的,但再次分发数据会受到限制。X 开发者政策规定,发布数据集时只能分享帖子 ID 和用户 ID,不能分享完整的推文文本;每个实体在 30 天内最多可接收 150 万个 ID,学术机构另有例外。请发布 ID 和数据还原脚本,而不是原始文本,并在发布前查阅最新条款。
构建数据集需要官方 X API 吗?
不需要。只有发帖等写操作必须使用官方 X API。若要采集公开推文和用户资料,可以使用 Sorsa API 之类的只读替代方案:只需一个 ApiKey 请求头,按请求而非按推文计费,并免费附带作者资料。按 Pro 批量价格计算,平均每 1,000 条推文约 0.02 美元;100 次免费请求无需绑卡,足以完成一次实际测试。
如何开始
给数据集估算规模最快的方式,是在写数据管道之前先把查询跑一遍。打开浏览器版 API playground,用你的操作符运行一次搜索,读一读你将映射进 JSONL 的那些 JSON 字段。当查询看起来没问题时,把上面的采集脚本放进项目,让它指向一个文件即可。
Sorsa 提供 100 次免费请求:额度一次性发放,无需绑卡、永不过期,且适用于全部 40 个接口,足够在测试期间还原最多 1 万条推文,或拉取最多 2 万份用户资料。准备扩容时,可使用按请求计费套餐;通过批量接口,平均每 1,000 条推文约 0.02 美元,速率固定为每秒 20 次请求,而且无需排队审批。
审校:Keksich(Sorsa 创始人,X API 研究者)
本指南基于我们团队运营 Sorsa 实时 API 及其文档的一线经验,并参考了撰写时核对的公开数据集和平台条款。内容再次分发规则依据 X 开发者政策;公开数据集和归一化惯例参考 Hugging Face 上的 TweetEval 数据集;官方 X API 的按资源价格则与当前公开的价格详解进行了交叉核对。有关我们团队的更多信息,请参阅关于页面。内容已于 2026 年 7 月核实。