Projeto analise-artigo: análise ABNT de artigos LaTeX

- texparse.py: extração de estrutura abntex2 (título, autores, resumo,
  palavras-chave, seções, citações, figuras), sem dependências externas
- bib.py: parser .bib (BibTeX) com normalização de autores e diacríticos
- analyze.py: checklist NBR 10520/6022/14724, métricas textuais, Flesch
  adaptado pt-BR e heurísticas de prosa
- report.py: relatório Markdown + JSON
- artigos/rumo-a-eficiencia: artigo analisado (main.tex + referencias.bib)
This commit is contained in:
2026-09-25 13:24:56 -03:00
commit 550440f4a7
14 changed files with 1591 additions and 0 deletions

109
README.md Normal file
View File

@@ -0,0 +1,109 @@
# analise-artigo
Projeto de análise de artigos acadêmicos escritos em **LaTeX (ABNT/abntex2)**.
É 100% Python puro (biblioteca padrão), sem dependências externas — roda em
qualquer máquina com Python ≥ 3.10.
## O que ele analisa
- **Estrutura e conformidade ABNT** (NBR 10520 / 6022 / 14724)
- título, autores, local/data, resumo (150–500 palavras), palavras-chave
- presença de seções: Introdução, Metodologia, Revisão de Literatura, Conclusão
- **Citações e referências**
- citações no corpo vs. entradas do `.bib` (detecta órfãs e não citadas)
- referências mais citadas e distribuição por ano
- **Métricas textuais**
- palavras, frases, média de tamanho de frase, vocabulário único
- legibilidade (Flesch adaptado ao português)
- distribuição de palavras por seção
- **Qualidade de prosa (heurísticas)**
- palavras repetidas / redundâncias (`de de`, `que que`, `mas mas` …)
- frases > 60 palavras e parágrafos > 160 palavras
- expressões mais repetidas no corpo do artigo
## Como usar
```bash
# a partir da raiz do projeto
python -m analise_artigo artigos/rumo-a-eficiencia
# ou apontando direto para o .tex (o .bib é descoberto automaticamente)
python -m analise_artigo artigos/rumo-a-eficiencia/main.tex
# saída em outro diretório
python -m analise_artigo caminho/do/artigo --out relatorios/
```
Saídas geradas no diretório de saída (padrão `relatorios/`):
| Arquivo | Conteúdo |
|-----------------|---------------------------------------------------|
| `relatorio.md` | relatório legível em Markdown |
| `relatorio.json`| dados estruturados (para plotar/automatizar) |
Código de saída do processo: `0` quando não há verificações em `fail`,
`2` quando há, `1` em erro de uso/entrada.
## Estrutura do projeto
```
analise-artigo/
├── analise_artigo/
│ ├── __init__.py # API pública do pacote
│ ├── texparse.py # LaTeX → texto (seções, resumo, citações)
│ ├── bib.py # parser .bib (BibTeX), sem dependências
│ ├── analyze.py # métricas + checklist ABNT + heurísticas
│ ├── report.py # geração do .md e do .json
│ └── __main__.py # CLI
├── artigos/
│ └── rumo-a-eficiencia/ # o artigo analisado (main.tex + referencias.bib)
├── relatorios/ # saída gerada
├── requirements.txt
└── README.md
```
## Usando como biblioteca
```python
from analise_artigo import parse_article, parse_bib, analyze, write_reports
from pathlib import Path
artigo = parse_article("artigos/rumo-a-eficiencia/main.tex")
refs = parse_bib("artigos/rumo-a-eficiencia/referencias.bib")
an = analyze(artigo, refs)
print(an.metrics["flesch"], an.metrics["flesch_faixa"])
for c in an.checks:
print(c.icon, c.code, c.detail)
```
## Limitações conhecidas
- O parser é orientado a abntex2/ABNT; documentos em outras classes
(`article`, `report` com nomenclatura própria) exigem pequenas adaptações
em `texparse.py`.
- **Uma frase/parágrafo por linha**: as heurísticas de sentença/travessão
e de "parágrafo extenso" presumem que cada parágrafo do .tex ocupe uma
linha (convenção verificada nas fontes analisadas). Textos com parágrafos
múltiplos de linha tendem a ser fragmentados.
- **Flesch adaptado (pt-BR)**: usa a fórmula 206,835 − 1,015·MPF − 84,6·VMP
com sílabas estimadas por grupos de vogais (resultado clamped em 0–100).
Texto acadêmico técnico costuma pontuar baixo (p. ex. 0–15) — o índice
reflete vocabulário denso, não um "erro".
- **"se se" excluído** da detecção de palavras repetidas: é uso pronominal
legítimo ("avaliou-se se cada estudo…").
- **Simplificação de `.bib`**: nomes com escapes LaTeX recebem diacríticos
removidos para exibição (`Ki\vs\vs\, M.` → `Kiss`), apenas na apresentação
— o arquivo original não é modificado.
- Heurísticas de prosa não substituem revisão humana ou ferramentas como
LanguageTool.
## Ideias de evolução
- [ ] Exportar relatório em HTML com gráficos (referências por ano,
palavras por seção) a partir do `relatorio.json`
- [ ] Suporte a bibliografia biblatex (`.bbx`) e listas de referências
manualmente digitadas no corpo do .tex
- [ ] Detecção de consistência terminológica (ex.: "agentes pedagógicos"
vs. "agente pedagógico")
- [ ] Integração com LanguageTool via CLI para correção gramatical completa