Experimento reproduzivel para a 3a avaliacao de Aprendizado Profundo: classificacao binaria de reviews em portugues brasileiro usando uma CNN 1D em PyTorch, comparada com baselines classicos de PLN.
Repositorio do projeto:
https://github.com/Altaeir-13/Indago-PT-Detecting-Synthetic-Reviews-in-Brazilian-Portuguese
Classificar uma review individual como:
0: falsa/sintetica.1: genuina.
O projeto trata a unidade de analise como a review isolada. Ele nao detecta astroturfing completo, campanhas coordenadas, comportamento de usuarios, padroes temporais ou grafos de contas, porque o dataset principal nao contem usuario, data, rating, produto especifico nem relacoes entre contas.
O experimento foi consolidado em um unico notebook autocontido:
notebooks/01_experimento_fake_reviews.ipynb
A pasta src/ foi removida porque toda a logica de carregamento, EDA, preprocessamento, split, baselines, CNN, avaliacao e geracao de outputs esta no notebook.
Use o Fake Reviews PT-BR Dataset:
https://github.com/cristianomg10/fake-reviews-ptbr-dataset
O arquivo esperado e:
data/raw/true_fake_dataset_top15.csv
Para preparar o dataset:
- Acesse https://github.com/cristianomg10/fake-reviews-ptbr-dataset.
- Baixe o arquivo
true_fake_dataset_top15.csv. - Coloque o arquivo em
data/raw/true_fake_dataset_top15.csv. - Abra
notebooks/01_experimento_fake_reviews.ipynbe execute as celulas em ordem.
A base e derivada do dataset publico da Olist:
https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce
Colunas reais detectadas na execucao:
- texto:
review_comment_message - categoria:
product_category_name - rotulo:
label
O mapeamento tambem foi salvo em outputs/tables/column_mapping.json.
python -m pip install -r requirements.txtO codigo principal do experimento esta em:
notebooks/01_experimento_fake_reviews.ipynb
Para reproduzir o experimento completo:
- Instale as dependencias com
python -m pip install -r requirements.txt. - Coloque o dataset em
data/raw/true_fake_dataset_top15.csv. - Abra o notebook no Jupyter Notebook, JupyterLab ou VS Code.
- Mantenha
USE_SMOKE_TEST = False. - Execute todas as celulas em ordem (
Run All).
Smoke test rapido:
- Abra o notebook.
- Altere
USE_SMOKE_TEST = Truena secao de configuracao global. - Execute todas as celulas.
- Os resultados de smoke sao gravados em
outputs/smoke/, que e ignorado pelo Git.
O notebook e autocontido e nao depende da pasta src/.
.
|-- README.md
|-- requirements.txt
|-- data/
| |-- README.md
| `-- raw/
|-- notebooks/
| `-- 01_experimento_fake_reviews.ipynb
|-- outputs/
| |-- figures/
| |-- tables/
| `-- models/
|-- report/
| |-- relatorio.md
| `-- slides.md
`-- tests/
`-- fixtures/
`-- smoke_reviews.csv
- Carrega o CSV local.
- Infere colunas de texto, categoria e rotulo.
- Faz limpeza minima: textos vazios sao removidos, espacos e quebras de linha sao normalizados.
- Executa EDA inicial.
- Divide em treino, validacao e teste com estratificacao
70/15/15erandom_state=42. - Treina TF-IDF + Regressao Logistica.
- Treina TF-IDF + SVM Linear.
- Treina CNN 1D em PyTorch com early stopping.
- Avalia todos os modelos no teste.
- Salva metricas, graficos, modelos, historico de treino, resumo do split e analise de erros em
outputs/.
Arquitetura:
Embedding(vocab_size, embedding_dim, padding_idx=0)
-> Conv1d(in_channels=embedding_dim, out_channels=filters, kernel_size=kernel_size)
-> ReLU
-> GlobalMaxPool1d
-> Dropout
-> Linear(filters, 1)
Treinamento padrao:
- Loss:
BCEWithLogitsLoss. - Otimizador: Adam.
- Learning rate:
0.001. - Batch size:
64. - Epocas: ate
30. - Early stopping por
val_loss,patience=4. - Melhor modelo salvo em
outputs/models/cnn1d.pt.
Os resultados abaixo foram gerados pelo pipeline real e estao em
outputs/tables/model_comparison.csv.
| Modelo | Accuracy | Precision fake label 0 | Recall fake label 0 | F1 fake label 0 | F1 macro | AUC-ROC fake label 0 |
|---|---|---|---|---|---|---|
| TF-IDF + Regressao Logistica | 0.881085 | 0.867553 | 0.899556 | 0.883264 | 0.881043 | 0.949981 |
| TF-IDF + SVM Linear | 0.894421 | 0.886037 | 0.905333 | 0.895581 | 0.894408 | 0.959195 |
| CNN 1D PyTorch | 0.962658 | 0.963078 | 0.962222 | 0.962650 | 0.962658 | 0.991639 |
Leituras principais:
- A CNN 1D PyTorch teve o melhor desempenho geral.
- Entre os baselines classicos, o SVM linear superou a regressao logistica.
- A CNN teve ganho de aproximadamente 6,8 pontos percentuais de acuracia em relacao ao SVM linear.
- A CNN atingiu F1 macro de aproximadamente 96,27%.
- A AUC-ROC da CNN para a classe falsa/sintetica foi aproximadamente 99,16%.
- A alta AUC sugere boa separacao entre reviews sinteticas e genuinas no dataset avaliado.
Esses resultados nao devem ser interpretados como deteccao completa de astroturfing. A classe falsa e sintetica/operacional, gerada por GPT-2, e nao fraude humana comprovada.
Arquivos de EDA gerados:
outputs/tables/eda_summary.jsonoutputs/tables/class_distribution.csvoutputs/tables/category_distribution.csvoutputs/tables/review_length_summary.csvoutputs/tables/missing_values.csvoutputs/tables/examples_by_class.csv
Resumo observado:
- 29.988 amostras apos limpeza.
- Classes: 15.000 falsas/sinteticas e 14.988 genuinas.
- Sem valores ausentes nas colunas canonicas depois do carregamento.
- 683 linhas duplicadas e 1.537 textos duplicados foram identificados na EDA.
- Tamanho medio das reviews: 82,95 caracteres e 13,98 tokens.
- Mediana: 92 caracteres e 15 tokens.
Figuras de EDA:
outputs/figures/class_distribution.pngoutputs/figures/category_distribution.pngoutputs/figures/review_char_length_hist.pngoutputs/figures/review_token_length_hist.pngoutputs/figures/review_token_length_by_class.png
Figuras de resultado:
outputs/figures/cnn_loss_curve.pngoutputs/figures/cnn_accuracy_curve.pngoutputs/figures/confusion_matrix_cnn1d.pngoutputs/figures/confusion_matrix_linear_svm.pngoutputs/figures/confusion_matrix_logistic_regression.png
A analise qualitativa da CNN esta em:
outputs/tables/cnn_error_analysis.csv
Esse arquivo lista falsos positivos, isto e, reviews genuinas preditas como falsas/sinteticas, e falsos negativos, isto e, reviews falsas/sinteticas preditas como genuinas. A discussao desses casos deve considerar que reviews curtas, genericas, negativas, pouco especificas ou muito padronizadas podem ficar proximas da fronteira de decisao.
- A classe falsa/sintetica e gerada por GPT-2 no dataset. Ela nao representa necessariamente fraude humana comprovada.
- O projeto classifica reviews individuais.
- Nao ha metadados para detectar astroturfing completo, campanhas coordenadas, grafos de usuarios ou padroes temporais.
- Resultados dependem do recorte do dataset e devem ser interpretados como classificacao supervisionada no dominio operacional da base.
Este projeto pode ser reaproveitado no TCC como:
- um modelo neural intermediario entre baselines TF-IDF e uma comparacao futura com BERTimbau;
- um pipeline experimental reutilizavel para carregamento, EDA, treino, avaliacao e analise de erros;
- uma base para discutir ameacas a validade, principalmente a diferenca entre texto sintetico de dataset e fraude humana real.
BERTimbau permanece como extensao futura ou comparacao posterior, nao como modelo principal desta avaliacao.
A fonte oficial do relatorio e o arquivo LaTeX:
report/relatorio.tex
Compile o relatorio a partir da pasta report/ com LaTeX/BibTeX, por exemplo:
cd report
pdflatex relatorio.tex
bibtex relatorio
pdflatex relatorio.tex
pdflatex relatorio.tex
O PDF final esperado e report/relatorio.pdf. Verifique visualmente o PDF antes de entregar para garantir que tabelas, quebras de pagina, figuras e referencias estejam legiveis.