feat(scripts): add merge-pipeline to organize data - #5
Conversation
| @@ -0,0 +1,39 @@ | |||
| import json | |||
|
|
|||
| with open("posts.jsonl", encoding="utf-8") as f: | |||
There was a problem hiding this comment.
Seria mais interessante se o caminho de posts.jsonl fosse passado de forma mais dinâmica, talvez por argumentos de linha de comando. Ex:
merge_pipeline.py ./posts.jsonl| resultado.append(comment_record) | ||
|
|
||
| with open("dataset_bruto.jsonl", "w", encoding="utf-8") as out: | ||
| for item in resultado: |
There was a problem hiding this comment.
O caminho de saída que seria o dataset_bruto.jsonl poderia ser salvo junto ao mesmo diretório do caminho de entrada posts.jsonl (anteriormente), com um prefixo ou sufixo relativo ao nome do arquivo de entrada. Ex:
- Entrada:
./results/posts.jsonl - Saída:
./results/out.posts.jsonl
| @@ -0,0 +1,39 @@ | |||
| import json | |||
There was a problem hiding this comment.
Se puder colocar um comentário no topo do arquivo de explicando o que ele faz e como utilizá-lo.
othonhugo
left a comment
There was a problem hiding this comment.
Além disso, se puder colocar o script merge-pipeline.py dentro do diretório scripts (ex: `./script/merge_pipeline.py), na raiz do repositório.
Pensei em deixar a branch main focada na biblioteca (e no utilitário) de coleta de dados, e usar a branch workflow para focar nos scripts de automação do pipeline.
Pré-requisitos
prawlerativado (.venv)No terminal ou .env passe:
Passo 1 - Buscar posts do subreddit com filtro amplo de IA/chatbots
O filtro é aplicado apenas nos posts (título), ferramentas e termos utilizados por profissionais de TI no dia a dia, como assistentes de código e nomes de modelos/empresas comuns em discussões de dev:
Notas:
(?-i:IA)mantém a siglaIAcase-sensitive dentro de uma busca case-insensitive, evitando falso positivo com "ia" minúsculo dentro de outras palavras.-filteré repetível com semântica OR entre campos diferentes (ex:F "title ~= ..." -F "selftext ~= ..."); teste com poucos posts antes de aplicar em massa, pois o comportamento (AND vs OR) não foi confirmado.posts.jsonlguarda os posts completos, na ordem retornada pela API. E essa ordem é preservada até o arquivo final.Passo 2 - Extrair os IDs dos posts encontrados
Passo 3(OPCIONAL) - Conferir quantos posts foram encontrados
Passo 4 - Remover quebras de linha do Windows (CRLF)
comments_1v7ber0\r.jsonl).Passo 5 - Buscar todos os comentários de cada post (sem filtro)
Notas:
-limit 1000é alto de propósito, para garantir que a coleta capture o máximo possível de comentários do post, incluindo os de nível 0 que serão filtrados na etapa seguinte. Ajuste conforme o volume médio de comentários dos posts do brdev.comments_<id>.jsonlcontém comentários de todos os níveis (0, 1, 2...) -o filtro pordepth == 0só acontece no Passo 6.Passo 6 - Consolidar posts + comentários (filtrando
depth == 0) em um único arquivo, em ordemScript que lê os comentários brutos de cada post, mantém apenas os de nível 0 (
depth == 0), e intercala cada post com seus comentários filtrados, preservando a ordem deposts.jsonl. O contexto do post (submission_title) já vem embutido em cada comentário retornado peloprawler, então não é preciso join adicional.Execute:
Notas:.
record_type("post"/"comment") foi adicionado pois facilita filtrar.printfinais ajudam a validar que o filtro está de fato descartando comentários de níveis mais profundos (comparandototal_comentarios_brutosvstotal_comentarios_depth0).dataset_bruto.jsonl) sinaliza que ainda não passou por rotulagem.Passo 7 - Conferir o resultado final
Passo 8 (opcional/dica) - Limpeza dos arquivos intermediários
Mantendo
posts.jsonl,ids.txt/ids_clean.txt,merge_pipeline.pyedataset_bruto.jsonlcomo artefatos finais do pipeline de extração.Resumo do fluxo