Por Sorsa Editorial
Publicado em 13 de junho de 2026. Atualizado em 3 de julho de 2026: preços reformulados para taxas por 1.000 tweets, oferta inicial de 100 requisições grátis adicionada e comparação de custos com a API do X atualizada. As taxas de pagamento por uso da API oficial do X foram verificadas em julho de 2026.
Em resumo: Criar um dataset do Twitter (X) para machine learning significa coletar tweets de uma API, limpar e deduplicar, rotular para a tarefa, dividir em conjuntos de treino, validação e teste e exportar para um formato como JSONL. Como a API gratuita e os scrapers abertos pararam de funcionar, a coleta de dados novos agora passa por uma API de dados paga.
Esse último ponto é o obstáculo prático. Com o plano gratuito da API encerrado desde 2023 e scrapers como snscrape e twint fora de operação, um corpus novo e focado no seu tema precisa vir de uma API de dados. A Sorsa API, uma alternativa somente leitura para dados do X (antigo Twitter), retorna tweets e perfis públicos como JSON puro atrás de um único cabeçalho, com endpoints de busca, timeline e coleta em massa pensados para esse trabalho. A cobrança é fixa: uma chamada conta como uma requisição, não importa o que ela retorne, o perfil do autor vem incluído de graça e uma única chamada em lote reidrata até 100 IDs de tweets, que é como os datasets somente de IDs publicados por pesquisadores voltam à vida. Nos endpoints em lote, a Sorsa sai por cerca de US$ 0,02 por 1.000 tweets no plano Pro (a partir de US$ 0,049 no Starter), e 100 requisições grátis, sem cartão e sem prazo de validade, cobrem todos os 40 endpoints, o suficiente para testar um pipeline antes de qualquer gasto.
Índice
- Como construir um dataset do Twitter para machine learning?
- Vale mais criar seu próprio dataset ou usar um público?
- Como coletar tweets para um dataset em 2026
- Como reidratar um dataset que só tem IDs de tweets?
- Como estruturar e rotular um dataset para treinamento
- E os termos da plataforma e a ética?
- Quanto custa coletar um dataset?
- Um dataset construído na prática
- Perguntas frequentes
- Primeiros passos
Como construir um dataset do Twitter para machine learning? {#how-do-you-build-a-twitter-dataset-for-machine-learning}
Montar um dataset do Twitter passa por cinco estágios: coletar tweets brutos de uma API, limpar e deduplicar, rotular para a tarefa, dividir em conjuntos de treino, validação e teste e exportar para um formato de treinamento como JSONL. O mesmo pipeline serve tanto para um dataset de classificação quanto para um conjunto de instruction tuning de um modelo de linguagem; só a etapa de rotulagem muda.
Comece pelo objetivo, não pelos dados. Um classificador de sentimento pede tweets curtos com um rótulo claro de positivo, negativo ou neutro. Um modelo ajustado por instruções pede pares de prompt e resposta. Uma adaptação de domínio pede um grande volume de texto do tema, com rótulos leves ou nenhum rótulo. Saber o alvo define a consulta, o volume e o esquema antes de puxar um único tweet.
O trabalho se divide de forma limpa. Coleta e reidratação são um problema de API, coberto abaixo com código. Rotulagem, normalização e divisão são um problema de dados que você resolve localmente em Python. O restante deste guia trata de cada parte na ordem, apontando as restrições de 2026 que quebram a maioria dos tutoriais antigos exatamente onde elas doem.
Vale mais criar seu próprio dataset ou usar um público? {#should-you-build-your-own-dataset-or-use-a-public-one}
Use um dataset público quando algum já corresponde à sua tarefa; crie o seu quando tema, idioma, janela de tempo ou rótulos são específicos do seu caso. Os conjuntos públicos no Hugging Face e no Kaggle são gratuitos e rápidos de carregar, mas têm escopo fixo, costumam ter anos de idade, muitas vezes só cobrem inglês, e muitos são distribuídos como IDs de tweets que você precisa reidratar antes de o texto existir.
Vale conhecer primeiro as opções conhecidas. O Sentiment140 reúne cerca de 1,6 milhão de tweets rotulados por sentimento, e o benchmark TweetEval, do Cardiff NLP agrupa sete tarefas de classificação de tweets (ironia, ódio, conteúdo ofensivo, posicionamento, emoji, emoção, sentimento). Para um modelo genérico de sentimento ou emoção em inglês, carregar um desses vale mais do que coletar qualquer coisa.
Crie o seu quando a lacuna for real:
- O tema é estreito ou recente demais e nenhum conjunto público o cobre.
- Você precisa de um idioma ou região que os conjuntos públicos ignoram.
- Você precisa de uma janela de tempo recente, não de tweets de 2017.
- Seu esquema de rótulos não bate com nenhum dataset existente.
Para o caso específico de sentimento, o guia de análise de sentimento de tweets em Python cobre o lado de modelagem depois que os dados existem.
Como coletar tweets para um dataset em 2026 {#how-to-collect-tweets-for-a-dataset-in-2026}
Colete tweets por três rotas: busca por palavras-chave e operadores para corpora de tema, timelines de usuários para corpora por conta e Listas ou Comunidades para fontes curadas. O plano gratuito da API fechou em 2023 e scrapers como snscrape e twint pararam de funcionar, então a coleta de dados novos em qualquer volume agora passa por uma API de dados que retorna resultados de busca e timeline diretamente.
Uma API somente leitura transforma isso em um loop curto: consultar um endpoint, ler uma página de tweets, seguir o cursor, gravar cada tweet em um arquivo. O endpoint de busca da Sorsa aceita os operadores de busca avançada do Twitter padrão, como lang:, since:, until: e -filter:retweets, retorna cerca de 20 tweets por página com o perfil do autor anexado e pagina com next_cursor. Se a sintaxe for pouco familiar, monte a consulta primeiro no construtor visual de buscas.
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")
Para corpora por conta, troque a chamada de busca pelo endpoint de timeline do usuário com um nome de usuário; para fontes curadas, puxe do feed de uma Lista ou Comunidade. Para amostrar com equilíbrio, o endpoint de menções adiciona filtros como min_likes, since_date e until_date, que permitem puxar, por exemplo, apenas tweets com bom engajamento dentro de um intervalo de datas.
Duas notas de eficiência. Como o perfil do autor vem dentro de cada tweet, você recebe o @, o número de seguidores e a idade da conta na mesma resposta, sem chamada extra. E quando os dados cabem em formato de lote, os endpoints em lote cortam o número de requisições: uma única chamada aceita até 100 IDs de tweets ou 100 nomes de usuário, a principal alavanca para segurar o volume de requisições em uma coleta grande.
Se você preferir evitar uma API, a rota antiga dos scrapers ainda existe, mas espere quebras; a análise de por que os scrapers de código aberto pararam de funcionar explica a troca.
Como reidratar um dataset que só tem IDs de tweets? {#how-do-you-rehydrate-a-tweet-id-only-dataset}
Reidratar (rehydrate) significa pegar uma lista de IDs de tweets e buscar o conteúdo atual de cada um. Datasets públicos de pesquisa são distribuídos como IDs, e não como tweets completos, porque os termos da plataforma restringem a redistribuição do texto dos tweets, então o texto só existe depois que você consulta os IDs em uma API. Espere recuperar um subconjunto: tweets apagados, ou publicados por contas suspensas ou que ficaram privadas, não retornam mais.
Um endpoint em lote torna isso barato. O endpoint de tweets em lote da Sorsa aceita até 100 IDs por chamada e retorna os objetos completos, então um arquivo de 50.000 IDs vira cerca de 500 requisições em vez de 50.000 consultas individuais.
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")
A taxa de recuperação cai conforme a lista de IDs envelhece, já que mais tweets originais desaparecem a cada ano. Para saber de onde vêm as listas de IDs e quanto de um dataset antigo de eventos sobrevive, veja o guia de recuperação de tweets antigos a partir de uma lista de IDs.
Como estruturar e rotular um dataset para treinamento {#how-to-structure-and-label-a-dataset-for-training}
Dê a cada registro um esquema estável e exporte para JSONL, um objeto por linha. Um conjunto de classificação precisa do ID do tweet, do texto, do rótulo, do idioma e do timestamp; um conjunto de instruction tuning precisa de uma instrução, uma entrada opcional e a saída alvo. JSONL é o formato que a biblioteca datasets do Hugging Face e a maioria dos pipelines de fine-tuning leem diretamente.
Um registro de classificação e um registro de instrução ficam assim:
{"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"}
Limpe antes de rotular. Deduplique pelo ID do tweet, descarte tweets muito curtos ou vazios e filtre pelo campo lang para o conjunto ficar no idioma alvo. Seguindo a convenção do TweetEval, do Cardiff NLP, substitua URLs por um token {{URL}} e nomes de usuário não verificados por {{USERNAME}}, para o modelo aprender padrões de linguagem em vez de links ou perfis específicos.
Para rótulos, três abordagens escalam. Rotule à mão um pequeno conjunto de referência para avaliação. Pré-rotule o grosso com um modelo pequeno já existente e depois deixe uma pessoa corrigir, o que é muito mais rápido do que rotular do zero. Ou, para instruction tuning, escreva pares de prompt e resposta em torno dos tweets. Guias de fine-tuning de LLMs insistem na qualidade acima do volume bruto: alguns milhares de pares limpos e bem formados costumam vencer um conjunto ruidoso dez vezes maior.
Por fim, divida antes de treinar para a avaliação continuar honesta. Uma divisão comum é 80% treino, 10% validação e 10% teste, embaralhada com uma seed fixa para reprodutibilidade.
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):]
E os termos da plataforma e a ética? {#what-about-platform-terms-and-ethics}
Coletar tweets públicos para o seu próprio modelo é uma coisa; redistribuir o dataset é onde as regras pegam. A Política de Desenvolvedor do X afirma que, ao compartilhar conteúdo com terceiros, incluindo datasets para download, você pode distribuir apenas IDs de posts e IDs de usuários, não o texto completo, que é exatamente o motivo de os datasets públicos de pesquisa circularem como IDs.
Os termos atuais definem limites concretos. Pela Política de Desenvolvedor do X, você não pode distribuir mais de 1.500.000 IDs de posts a uma mesma entidade em um período de 30 dias sem permissão por escrito, enquanto pessoas atuando em nome de uma instituição acadêmica, em pesquisa não comercial, podem compartilhar um número ilimitado de IDs. Pesquisadores com acesso via Lei de Serviços Digitais da União Europeia entram em disposições separadas.
O padrão prático que mantém você dentro das linhas: guarde o texto completo que coletar para o seu próprio treinamento e, se publicar um dataset, publique os IDs dos tweets e um script de reidratação para que outros recriem o texto por conta própria. Os termos também proíbem rastrear ou monitorar grupos e eventos sensíveis, então mantenha a coleta longe desses usos. Isto é orientação geral, não aconselhamento jurídico, e os termos mudam, então confira o X Developer Agreement atual antes de publicar qualquer coisa.
Quanto custa coletar um dataset? {#how-much-does-collecting-a-dataset-cost}
O custo depende do volume e de a fonte cobrar por recurso ou por requisição. O preço por recurso cobra por cada post e cada perfil que a resposta retorna, então uma chamada que puxa um tweet mais o autor é cobrada duas vezes; o preço por requisição conta uma chamada como uma unidade, não importa quanto ela retorne. Em uma coleta de leitura intensa, essa única diferença decide a conta.
A API oficial do X cobra por recurso: cada leitura de post custa US$ 0,005 e cada leitura de perfil custa US$ 0,010, com teto de 2 milhões de leituras de posts por mês, taxas verificadas em julho de 2026 na análise de preços da API do Twitter. A Sorsa cobra uma requisição por chamada com o perfil do autor incluído de graça, então nos endpoints em lote uma coleta de dataset sai a partir de cerca de US$ 0,02 por 1.000 tweets no plano Pro (a partir de US$ 0,049 no Starter e de US$ 0,018 no Enterprise), e a partir de cerca de US$ 0,01 por 1.000 perfis.
| Tarefa | API oficial do X (pagamento por uso) | Sorsa (Pro, base de lote) |
|---|---|---|
| 1.000 tweets, perfil do autor incluído | US$ 15,00 (1.000 leituras de posts + 1.000 leituras de perfis) | a partir de US$ 0,02 |
| Reidratar 1.000 IDs de tweets | US$ 5,00 (1.000 leituras de posts) | a partir de US$ 0,02 |
| Coletar 100.000 tweets de ponta a ponta | de US$ 500 a US$ 1.500, aproximadamente | dentro de um mês do Pro de US$ 199 |
Os números da Sorsa usam a base de lote: uma requisição retorna até 100 tweets ou 200 perfis. Em qualquer coleta de leitura intensa, a cobrança fixa por requisição fica muito abaixo do preço por recurso, e o perfil do autor não custa nada do lado da Sorsa.
Qual rota serve depende do fluxo de trabalho, não de um vencedor único:
- Escrever ou postar: a API oficial do X, o caminho em conformidade para qualquer ação de escrita.
- Volume de leitura muito baixo, abaixo de cerca de 10.000 posts por mês: qualquer uma funciona, e o pagamento por uso do X continua barato nesse tamanho.
- Construir um dataset, que é coleta de leitura intensa mais reidratação: uma API de requisição fixa como a Sorsa, até 50x mais barata nos mesmos tweets, com perfis de autor incluídos de graça.
Pesquisadores também podem conferir o acesso com desconto para pesquisa acadêmica, e o mesmo código de coleta porta para qualquer stack.
Um dataset construído na prática {#a-real-dataset-build}
Uma pequena equipe de IA construindo um modelo de sentimento financeiro chegou a isso depois de cotar a rota oficial. Precisava de cerca de 200.000 tweets recentes em inglês sobre uma cesta de tickers, rotulados como positivo, negativo ou neutro. Na cobrança por recurso, só as leituras de posts davam cerca de US$ 1.000, e os perfis de autor dobrariam ou triplicariam isso antes de qualquer atualização, com o teto mensal de 2 milhões de leituras pairando assim que planejassem atualizações. Ao mover a coleta para uma API de requisição fixa, os mesmos 200.000 tweets couberam em cerca de US$ 20 da cota de um mês Pro, até 50x mais barato só nas leituras de posts (cerca de 98% menos), e mais ainda contando os perfis de autor grátis, porque a busca retornava 20 tweets por requisição.
O projeto continuou enxuto. Uma consulta de palavra-chave por ticker, com filtro de idioma, alimentou um arquivo JSONL; um classificador pequeno pré-rotulou as linhas e um analista corrigiu uma amostra; URLs e @s foram normalizados para tokens; e o conjunto foi dividido em 80, 10 e 10 com uma seed fixa. Quando mais tarde quiseram estender um dataset público antigo de eventos, reidrataram a lista de IDs em lotes de 100 e aceitaram que uma fatia dos tweets originais já tinha sido apagada. A lição que ficou foi a ordem: defina o esquema de rótulos e a consulta primeiro, porque recoletar depois de uma mudança de esquema é o erro caro, não a conta da API.
Perguntas frequentes {#faq}
Ainda dá para coletar tweets para um dataset em 2026?
Sim, mas não pelas ferramentas antigas. O plano gratuito da API do Twitter fechou em 2023, e scrapers como snscrape e twint não funcionam mais na plataforma atual. A coleta de dados novos em qualquer volume real agora passa por uma API de dados paga que retorna resultados de busca e timeline, que você percorre página a página e grava em um arquivo. Datasets públicos continuam sendo uma opção quando algum já serve para a tarefa.
Onde conseguir um dataset pronto do Twitter?
Hugging Face e Kaggle hospedam os principais datasets públicos de tweets. O Sentiment140 reúne cerca de 1,6 milhão de tweets rotulados por sentimento, e o benchmark TweetEval cobre sete tarefas de classificação, como ironia, ódio e emoção. Muitos datasets acadêmicos circulam como IDs de tweets em vez de texto completo, então você reidrata os IDs em uma API antes de o conteúdo dos tweets existir na sua cópia.
Como reidratar IDs de tweets?
A reidratação busca o conteúdo atual de uma lista de IDs de tweets. Um endpoint em lote torna isso barato: uma API somente leitura como a Sorsa aceita até 100 IDs por chamada e retorna os objetos completos dos tweets, então um arquivo de 50.000 IDs vira cerca de 500 requisições. Espere recuperar um subconjunto, porque tweets apagados ou publicados por contas suspensas ou privadas não retornam mais.
Quantos tweets são necessários para fazer fine-tuning de um modelo?
Depende da tarefa, e qualidade importa mais que volume. Para uma tarefa estreita de classificação ou de seguir instruções, alguns milhares de exemplos limpos e corretamente rotulados costumam mover o modelo de forma perceptível, enquanto um conjunto ruidoso dez vezes maior pode render menos. Defina o objetivo, rotule primeiro um conjunto pequeno de alta qualidade e só o aumente se a avaliação mostrar que o modelo precisa de mais cobertura.
É legal criar e compartilhar um dataset do Twitter?
Coletar tweets públicos para o seu próprio modelo é geralmente permitido, mas a redistribuição é restrita. A Política de Desenvolvedor do X permite compartilhar apenas IDs de posts e IDs de usuários em datasets publicados, não o texto completo dos tweets, com teto de 1.500.000 IDs por entidade a cada 30 dias e exceção para instituições acadêmicas. Publique IDs e um script de reidratação em vez do texto bruto, e confira os termos atuais antes do lançamento.
Precisa da API oficial do X para criar um dataset?
Não. A API oficial do X só é necessária para ações de escrita, como postar. Para coletar tweets e perfis públicos, uma alternativa somente leitura como a Sorsa API usa um único cabeçalho ApiKey e cobra por requisição, não por tweet, com o perfil do autor incluído de graça. Sai a partir de cerca de US$ 0,02 por 1.000 tweets no preço de lote do Pro, e 100 requisições grátis, sem cartão, cobrem um teste de verdade.
Primeiros passos {#getting-started}
A maneira mais rápida de dimensionar um dataset é rodar a consulta antes de escrever um pipeline. Abra o playground da API no navegador, rode uma busca com os seus operadores e leia os campos JSON que você vai mapear para JSONL. Quando a consulta parecer certa, coloque o script de coleta acima no seu projeto e aponte-o para um arquivo.
A Sorsa começa com 100 requisições grátis: concedidas uma única vez, sem cartão, sem prazo de validade e válidas em todos os 40 endpoints, o que basta para reidratar até 10.000 tweets ou puxar até 20.000 perfis enquanto você testa. Quando estiver pronto para escalar, os planos de preço por requisição fixos saem a partir de cerca de US$ 0,02 por 1.000 tweets nos endpoints em lote, com um limite fixo de 20 requisições por segundo e sem fila de aprovação.
Revisado por Keksich, fundador da Sorsa, profissional de marketing e pesquisador da API do X.
Este guia se apoia no trabalho prático da nossa equipe operando a Sorsa API ao vivo e na sua documentação, além de datasets públicos e termos da plataforma conferidos no momento da escrita. Os limites de redistribuição de conteúdo foram lidos na Política de Desenvolvedor do X, as convenções de datasets públicos e de normalização vieram do dataset TweetEval no Hugging Face, e as taxas por recurso da API oficial do X foram cruzadas com análises públicas atuais. Mais sobre a nossa equipe está na página sobre a Sorsa. Verificado em julho de 2026.