Commit Graph
93 Commits
Author SHA1 Message Date
davideandClaude Sonnet 4.6 ed42e1ba7b feat(chunks): aggiunge validator.py — invarianti + metriche
Implementa validate() che controlla chunk_id duplicati, fence rotti,
size compliance (esclusi overflow) e calcola metriche aggregate.
Fix fixture cfg: min_chars=40 per allinearla ai chunk da 50 chars nel test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 08:02:35 +02:00
davideandClaude Sonnet 4.6 d2b8baa844 feat(chunks): aggiunge packer.py — Block[] → Chunk[] con packing min/target/max
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:29:24 +02:00
davideandClaude Sonnet 4.6 2d2d478a3f feat(chunks): aggiunge segmenter.py — token stream → Block[]
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:25:49 +02:00
davideandClaude Sonnet 4.6 63ca7121b2 feat(chunks): aggiunge parser.py con markdown-it-py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:22:58 +02:00
davideandClaude Sonnet 4.6 bca01dc1c6 feat(chunks): aggiunge ChunkerConfig dataclass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:20:59 +02:00
davideandClaude Sonnet 4.6 be1347378b feat(chunks): aggiunge models.py con Block, Chunk, Diagnostics, ChunkingResult
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:20:30 +02:00
davideandClaude Sonnet 4.6 be8ae9f6b8 chore: rimuove chunker legacy, aggiunge dipendenze AST-based pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:16:07 +02:00
davideandClaude Sonnet 4.6 b321a51c5c docs: spec design chunker Phase 1 (AST-based pipeline)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:59:59 +02:00
davideandClaude Sonnet 4.6 ab52d26b99 feat(notebook): download ZIP per tutti gli stem in output/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:44:26 +02:00
davideandClaude Sonnet 4.6 019a484854 chore: cambia modello embedding da nomic-embed-text a qwen3-embedding:0.6b
Migliore supporto multilingue e coerenza semantica con qwen3.5:4b.
Aggiornati config.py, README.md, ingestion/README.md, ollama/README.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 15:54:43 +02:00
davideandClaude Sonnet 4.6 cdda929537 feat(notebook): aggiunge sezione chunking post-MinerU
Clone del repo RAG, cella config modificabile che sovrascrive
chunks/config.py, esecuzione chunker.py e download automatico
di chunks.json.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:44:56 +02:00
davideandClaude Sonnet 4.6 3445226584 chore: rimuove commento ridondante nell'header di config.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:40:13 +02:00
davideandClaude Sonnet 4.6 450c6d5784 docs: aggiorna CLAUDE.md e README secondari per rispecchiare architettura attuale
Rimuove riferimenti a Stage 1/Stage 2, md_optimizer.py, fix_chunks.py,
--skip-optimize, _clean.md e _content_list_v2.json (tutti obsoleti).
Aggiorna pipeline diagram, comandi, tabella architettura e input MinerU.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:39:12 +02:00
davideandClaude Sonnet 4.6 70eed10cb6 fix(config): system prompt più preciso e ancorato al contesto
Rimosso "interpreta liberamente" che incoraggiava allucinazioni.
Aggiunto vincolo esplicito "esclusivamente sul contesto fornito"
e istruzione a citare la sezione di riferimento.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:33:48 +02:00
davideandClaude Sonnet 4.6 98a8eaa9fb docs/fix: aggiorna README e fix ingest per embedding robusto
README riscritto per rispecchiare la pipeline attuale:
- rimossi riferimenti a Stage 1, md_optimizer, fix_chunks
- pipeline semplificata: MinerU .md → chunker → ingest → rag
- tabelle parametri aggiornate (SKIP_HEADINGS, SKIP_PRE_HEADING,
  MERGE_SHORT_PARAGRAPHS, EMBED_MAX_CHARS al posto dei vecchi)
- struttura repo corretta

ingest.py: strip tag HTML ed entità prima dell'embedding per evitare
HTTP 500 da Ollama su chunk con tabelle HTML grezze; aggiunto
EMBED_MAX_CHARS (default 6000) in config.py.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:29:06 +02:00
davideandClaude Sonnet 4.6 c93e2e8494 fix(verify): PUNCT_END generico e frasi spezzate come warning
PUNCT_END esteso con terminatori comuni in documenti tecnici:
- $ e } per formule LaTeX inline e blocchi
- > per tag HTML (</table>, </td>, ecc.)
- \\ per line break LaTeX
- · (punto centrato, U+00B7) per notazione matematica
Caratteri unicode scritti con chr() per evitare SyntaxError Python 3.12+
con curly quotes nel sorgente.

Frasi spezzate spostate da blockers a warnings: il chunker le risolve
automaticamente con merge_broken_sentences; i casi residui sono
perlopiù falsi positivi (frontespizi, entità proprie senza punto finale).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:27 +02:00
davideandClaude Sonnet 4.6 f0c6bad046 feat(chunker): riscrittura completa per input MD pulito
Input: sources/<stem>_output/auto/<stem>.md (fallback: sources/<stem>.md)
Output: chunks/<stem>/chunks.json + meta.json

Regole implementate:
- 1 paragrafo = 1 chunk; paragrafi di contesti diversi non si mescolano
- split a confine di frase se paragrafo > MAX_CHARS (mai a metà frase)
- merge_short(): paragrafi < MIN_CHARS fusi col successivo (stesso contesto)
- merge_broken_sentences(): chunk consecutivi con frase spezzata vengono
  uniti automaticamente se stesso contesto e corpo senza punteggiatura finale
- parse_paragraphs(): skip sezioni via SKIP_HEADINGS (prefisso case-insensitive)
  e skip contenuto pre-heading via SKIP_PRE_HEADING
- blocchi atomici: tabelle, liste, code block non vengono mai spezzati
- nessun overlap tra chunk

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:17 +02:00
davideandClaude Sonnet 4.6 ce4c3e5c87 refactor(chunks): rimuove Stage 1 e riscrive config per MD pulito
Eliminati md_optimizer.py e fix_chunks.py: la pipeline non parte più
da _content_list_v2.json ma da un .md già pulito in sources/.

config.py ridotto da 114 a 64 righe: rimossi tutti i parametri MinerU
(NOISE_TYPES, FRONTMATTER_HEADINGS, MODEL_SKIP_LABELS, ecc.) e aggiunti
i parametri effettivamente utili al chunking: SKIP_HEADINGS,
SKIP_PRE_HEADING, MERGE_SHORT_PARAGRAPHS, ATOMIC_TYPES, CONTEXT_DEPTH.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 14:18:44 +02:00
davideandClaude Sonnet 4.6 aabe4d168c feat(notebook): sostituisce visualizzazione layout con download ZIP output MinerU
La cella finale ora crea uno ZIP della cartella di output (auto o hybrid_auto)
e lo scarica automaticamente su Colab, pronto per essere decompresso in sources/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 12:14:48 +02:00
davideandClaude Sonnet 4.6 e88043baee docs: aggiunge notebook MinerU per Colab e configurazione rapida nel README
- Passo 1 ora presenta opzione Colab (mineru.ipynb) e installazione locale
- Notebook adattato per uso reale: variabile PDF_NAME, path dinamico, gestione pagine
- Nuova sezione "Configurazione rapida" con parametri chunking e RAG

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 11:45:13 +02:00
davideandClaude Sonnet 4.6 f76184340e chore: rimuove comando /post-chunk obsoleto
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:23:03 +02:00
davideandClaude Sonnet 4.6 98653464dd docs: README dettagliato MinerU + CLAUDE.md aggiornato per pipeline Stage 1+2
README.md: sezione MinerU espansa con requisiti di sistema, installazione
(pip/conda/Docker), CLI completo con tutti i flag, tabella comparativa
backend (pipeline/hybrid-auto-engine/vlm-auto-engine), configurazione
avanzata, struttura output e limitazioni note.

CLAUDE.md: aggiornato diagramma pipeline, input RICHIESTO/RACCOMANDATO,
comandi con --force e --skip-optimize, architettura chunker/md_optimizer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:08:00 +02:00
davideandClaude Sonnet 4.6 156b1ebba4 feat(verify): nuovi check, istogramma ASCII e sezioni per documento
Nuovi check bloccanti:
  - prefisso malformato ([ senza ] o contenuto vuoto)
  - corpo vuoto dopo prefisso valido

Nuovi warning:
  - tabelle Markdown senza riga separatore |---|
  - chunk con corpo identico (duplicati da overlap/merge)

Output migliorato:
  - istogramma ASCII con marcatori ← MIN / ← MAX
  - top 5 sezioni per volume di chunk
  - mediana (p50) nelle statistiche di lunghezza

report.json arricchito: p50_chars, sections, malformed_prefix,
body_empty, broken_tables, duplicate_bodies.

PUNCT_END esteso con \d[\d.,/]*$ per numeri, anni, riferimenti normativi.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:07:51 +02:00
davideandClaude Sonnet 4.6 e96c510e1f feat(chunks): pipeline unificata Stage 1+2 con md_optimizer
chunker.py ora esegue in sequenza:
  - Stage 1 (md_optimizer.py): _content_list_v2.json + _model.json → _clean.md
    con pulizia TOC, frontespizio, sommari interni, merge titoli capitolo
  - Stage 2: _clean.md → chunks.json (paragraph-overlap, atomici tabelle/liste)

config.py esteso con CHAPTER_PREFIX_PATTERNS, SOMMARIO_PATTERNS,
MODEL_SKIP_LABELS, MODEL_ABSTRACT_LABELS, MIN_CONTENT_CHARS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:07:40 +02:00
davideandClaude Sonnet 4.6 52e881d09c refactor: rimuove pipeline conversione PDF→MD, delegata a MinerU
Elimina conversione/ (9 stadi PyMuPDF) e tests/ (tutti unit/integration).
Il repository gestisce ora solo: pulizia MD, chunking, vettorizzazione e RAG.
Aggiorna CLAUDE.md e .gitignore per il nuovo flusso MinerU-first.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 14:21:16 +02:00
davideandClaude Sonnet 4.6 c546ad9674 docs(claude-md): riscrittura con modalità collaborativa e architettura compatta
Aggiunge sezione comportamento: Claude espone approccio e problemi concettuali
prima di toccare il codice. Ristruttura architettura in tabelle, completa i
comandi con chunking/ingestion/retrieve, rimuove note sulla pipeline deprecata.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 14:04:12 +02:00
davideandClaude Sonnet 4.6 6d7170d18b fix(verify): riconosce URL www. come terminatori validi + doc multi-documento
- _URL_TAIL ora matcha anche www.* (non solo https://) — evita falsi blockers
  su watermark tipo www.docsity.com
- README: documenta --collection / --stems per ingestion, retrieve e rag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:21:24 +02:00
davideandClaude Sonnet 4.6 606fad9e09 feat(ingestion): supporto multi-documento in unica collection ChromaDB
Aggiunge la possibilità di unire più documenti in una singola collection
ChromaDB, con chunk_id prefissati per stem e metadato source per filtrare.

- ingest.py: --stems doc1 doc2 --collection nome (nuovo), --stem (invariato)
- rag.py / retrieve.py: --collection, source nei chunk, verbose mostra [source]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:21:17 +02:00
davideandClaude Sonnet 4.6 b630316936 feat(chunks): ottimizzazione chunking e post-processing
- chunker.py: scrive meta.json con strategia e soglie effettive (target,
  min_chars, max_chars) per ogni documento chunked

- verify_chunks.py:
  * _load_thresholds(): legge min/max da meta.json invece del TARGET_CHARS
    globale, eliminando il mismatch tra soglie chunker e verify
    (h3_aware target=600 -> range 450-750, non piu' validato a 225-375)
  * _ROMAN_END: esclude numeri romani finali (XV, XIV...) dagli incompleti
    perche' sono artefatti indice PDF, non frasi spezzate
  * PUNCT_END: aggiunge ; come fine valida (clausole legali italiane)

- fix_chunks.py:
  * _load_thresholds(): usa max_chars da meta.json per split coerente
  * _SECONDARY_END: split secondario su ; per testo legale multi-clausola
  * Fase 1 (convergenza): risolve solo blockers (incomplete, empty,
    no_prefix) senza toccare warnings -- elimina il ciclo
    merge->too_long->split->incomplete->merge
  * Fase 2 (finale): una sola passata di merge too_short + split too_long
    dopo che i blockers sono azzerati

Risultato su dirittopenale: da blocked (265 incomplete) a warnings_only
in 2 iterazioni, senza cicli infiniti.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 11:09:28 +02:00
davideandClaude Sonnet 4.6 0cf3c0564b docs(conversione): aggiorna README — comandi, output e log di esecuzione
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:43:17 +02:00
davideandClaude Sonnet 4.6 135036c53d docs(readme): aggiunge sezioni configurazione modelli, test ollama, retrieval e RAG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:39:27 +02:00
davideandClaude Sonnet 4.6 d947e04152 chore(config): tuning RAG — modello 4b, temperatura 0.2, chunk target 300
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:37:39 +02:00
davideandClaude Sonnet 4.6 8831e3c047 fix(ingestion): correggi path chunks da step-6/ a chunks/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 10:37:35 +02:00
davideandClaude Sonnet 4.6 e3e259965e docs: aggiorna README con flusso ingestion completo
- README.md: aggiunge step 7 (ingestion) con verifica ambiente,
  comandi base e --force; aggiorna pipeline header e riferimenti
- ingestion/README.md: rinomina da "Step 8" a "Ingestion",
  aggiorna riferimenti da step-6 a chunks/, aggiunge sezione
  "Verifica ambiente", corregge comandi con .venv/bin/python

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 16:05:23 +02:00
davideandClaude Sonnet 4.6 2c180fc9b6 refactor: rinomina step-8 → ingestion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:58:54 +02:00
davideandClaude Sonnet 4.6 efb02fa955 docs(readme): flusso completo conversione → chunking
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:46:52 +02:00
davideandClaude Sonnet 4.6 e264bc52b1 feat(chunks): target-based chunking con config centralizzata
Introduce chunks/config.py come unica fonte di verità per tutti i
parametri della pipeline di chunking. TARGET_CHARS + CHUNK_TOLERANCE
sostituiscono MIN_CHARS/MAX_CHARS: il chunker mira a una dimensione
target e si avvicina il più possibile rispettando il vincolo assoluto
di terminare ogni chunk su un confine di frase (punto/punteggiatura).

- config.py: TARGET_CHARS, CHUNK_TOLERANCE, SPLIT_THRESHOLD_FACTOR,
  PROTECT_TABLES, FIX_MAX_ITERATIONS, STRATEGY_OVERRIDES per strategia
- chunker.py: algoritmo target-based (emit quando frase successiva
  sfora upper_body = upper - prefix_len), table protection atomica,
  override MIN/MAX/overlap per ciascuna delle 4 strategie
- verify_chunks.py: soglie derivate da target*(1±tolerance)
- fix_chunks.py: _split_at_boundary sempre su punteggiatura finale,
  loop ricorsivo fix→verify fino a FIX_MAX_ITERATIONS, split solo
  per chunk > upper × SPLIT_THRESHOLD_FACTOR

Risultato su bitcoin: 694 chunk, 0 incompleti, 83% in range [450,750],
tutti terminanti su punteggiatura indipendentemente dalla dimensione.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:45:24 +02:00
davide d590346539 Merge branch 'chunks' into main
Integra la pipeline di chunking (chunks/) con tutte le modifiche
accumulate sul branch, inclusa la pipeline PDF→Markdown a 9 stadi.
2026-05-11 14:51:53 +02:00
davideandClaude Sonnet 4.6 e921306baa feat: integra pipeline PDF→Markdown a 9 stadi e test suite
Porta da main la riscrittura completa di conversione/_pipeline/ (9 stadi
PyMuPDF) e la suite tests/ senza modificare chunks/, step-8/, rag.py,
ollama/, retrieve.py, config.py.

requirements.txt: aggiunge PyMuPDF>=1.24.0 e pytest>=8.0, mantiene chromadb,
rimuove opendataloader-pdf e pymupdf4llm.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:46:16 +02:00
davideandClaude Sonnet 4.6 83e6ba9083 feat: integra pipeline PDF→Markdown a 9 stadi e test suite
Porta da branch marker la riscrittura completa di conversione/_pipeline/
(9 stadi PyMuPDF) e la suite tests/ senza modificare il resto del progetto
RAG (ollama/, step-5/, step-6/, step-8/, rag.py, retrieve.py, config.py).

requirements.txt: aggiunge PyMuPDF>=1.24.0 e pytest>=8.0, mantiene chromadb,
rimuove opendataloader-pdf e pymupdf4llm.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 14:44:16 +02:00
davide 16029f1ef2 refactor(skills): rinomina step6-fix → post-chunk
- rimpiazza .claude/commands/step6-fix.md con post-chunk.md
- aggiorna path da step-6/ a chunks/ in tutta la skill
- aggiunge gestione incomplete_math nel report summary
- scope ampliato: workflow completo fino alla vettorizzazione
- CLAUDE.md: aggiorna /step6-fix → /post-chunk
2026-04-20 14:25:31 +02:00
davide f340c4c14e feat(chunks): sentence-boundary flush, math incomplete detection, structure profile export
- chunker: estrai _flush_chunk() con estensione al confine di frase (max 120%)
- verify: rileva chunk matematici incompleti come warning, gestisci hash hex e URL
- conversione: esporta structure_profile.json nell'output dir
2026-04-20 12:28:03 +02:00
davide 240cad9830 chore: pulisci .gitignore — rimuovi step-2..6, aggiungi chunks/ 2026-04-20 12:25:04 +02:00
davide 5f8a7a1fb1 refactor: rimuovi step-5/ e step-6/, sostituiti da chunks/ 2026-04-20 12:22:21 +02:00
davide a18eb10117 feat(chunks): aggiungi pipeline chunking consolidata
Nuova cartella chunks/ con chunker.py (step 5), verify_chunks.py e
fix_chunks.py (step 6). Tutto l'I/O va in chunks/<stem>/ invece di
step-5/ e step-6/ separati. Input: conversione/<stem>/clean.md
2026-04-20 11:36:24 +02:00
davide 722489baff docs: compatta README — rimuovi sezioni verbose, mantieni l'essenziale 2026-04-20 11:21:01 +02:00
davide df6e580907 feat: pipeline RAG consolidata — conversione unificata, refactor struttura, CLAUDE.md minimale
Branch ollama introduce:
- Pipeline conversione PDF → Markdown unificata (conversione/pipeline.py) con 30+ transform
  che sostituisce i vecchi step-0..step-4
- Ambiente Ollama (ollama/) con check_env.py e test_ollama.py
- Rimozione cartelle step-0..step-4, step-7, step-9 obsolete
- Consolidamento script alla root
- CLAUDE.md riscritto: path reali, istruzioni minime, agnostico alla struttura step-X
- validate.py con scoring orientato a chunking/vettorizzazione
- README riallineato alla struttura reale del repo
2026-04-20 11:06:18 +02:00
davide dae1b458fd docs(CLAUDE.md): semplifica istruzioni, rimuovi path step-X hardcoded 2026-04-20 11:05:20 +02:00
davide fa15e06e35 fix: aggiorna path step-4/ → conversione/ e riferimenti step-X
- chunker.py: input da conversione/<stem>/ (era step-4/, non esistente)
- verify_chunks.py: messaggi errore aggiornati a conversione/
- config.py: commenti step-8 → ingest.py
2026-04-19 00:03:43 +02:00
davide 719559354a refactor: pulizia files 2026-04-17 18:52:37 +02:00
davide 4c02102363 docs(README): riscrittura per struttura reale del progetto
Sostituisce la struttura step-0…step-10 con la pipeline
effettiva: conversione/, revisione /prepare-md, chunking,
verifica, ollama/, vettorizzazione, interrogazione
2026-04-17 18:51:15 +02:00
davide 6d25834acd chore(requirements): rimuovi commenti step-X obsoleti 2026-04-17 18:50:53 +02:00
davide ce3823dc47 refactor: elimina step-7 e step-9, consolida script alla root
- step-9/: config.py, rag.py, retrieve.py → root;
  test_ollama.py → ollama/
- step-7/: eliminata, già coperta da ollama/
- sys.path aggiornati in rag.py, retrieve.py, ingest.py,
  check_env.py (step-7 e ollama)
- Riferimenti step-9/config.py → config.py in tutti i file
2026-04-17 18:50:36 +02:00
davide 865bd58101 feat(ollama): aggiungi step 7 — verifica ambiente Ollama
Script check_env.py e README per controllare prerequisiti prima
della vettorizzazione: ollama nel PATH, modelli embedding e LLM
disponibili, chromadb importabile
2026-04-17 18:16:40 +02:00
davide d1f7da8141 feat(conversione): pipeline unificata PDF → Markdown, sostituisce step-0..4
Consolida in un unico modulo (conversione/pipeline.py) l'intera catena di
conversione che prima era distribuita tra step-0 (validazione PDF), step-1
(ispezione qualità), step-2 (conversione pymupdf4llm), step-3 (rilevamento
struttura) e step-4 (revisione euristica).

Miglioramenti principali rispetto agli step separati:
- libreria di conversione XY-Cut++ (ordine di lettura più preciso)
- 30+ trasformazioni euristiche vs le 7 originali di step-4
- validazione, struttura e profilo chunking prodotti in un solo passaggio
- validate.py con scoring orientato a chunking/vettorizzazione
2026-04-17 16:05:20 +02:00
davide 1dfcb24a2d chore: rimuovi cartelle step-0..step-4 ora obsolete
La logica è consolidata in conversione/pipeline.py.
2026-04-17 16:04:59 +02:00
davide 21ac849a8a refactor(docs): skill prepare-md sostituisce step4-review, CLAUDE.md senza step-X 2026-04-17 13:44:41 +02:00
davide 9313cb5d19 fix(conversione): PUA Symbol, garbage headers, merge+bib guard, math EN 2026-04-17 13:44:30 +02:00
davide a7f6bc0636 fix(conversione): 5 fix robustezza e precisione transform
- _t_remove_footnotes: rimuove marcatori superscript inline e righe
  corpo-nota (¹ testo, [N] testo) — nuovo transform in posizione early
- _t_numbered_sections: esclude voci bibliografiche (anno, pp., vol.,
  DOI, ISBN) dalla promozione a ### header
- _t_remove_toc: intercetta voci con numero pagina finale nel contesto
  TOC — rimosso _t_remove_toc_page_list standalone
- _t_remove_frontmatter: limitata alle prime ~20% sezioni del documento
- _t_remove_recurring_lines: soglia 3->5, Counter spostato a top-level
2026-04-17 12:06:25 +02:00
davide 2824ac32ef feat(conversione): robustezza e 7 nuovi transform
- check_pdf: file < 1KB, campione esteso 15pp, MemoryError
- convert_pdf: validazione output ≥ 100 char
- analyze: rilevamento gerarchia invertita h3 > h2
- _detect_language: supporto FR/DE/ES
- 7 nuovi transform: fix_math_symbols, remove_recurring_lines,
  normalize_numbered_headings, remove_toc_page_list,
  restore_poetry_lines, demote_verse_headers, remove_watermarks
- bug fix: tabelle MD, garbage headers lowercase, empty headers
- run(): MemoryError / UnicodeDecodeError / PermissionError
2026-04-17 11:53:42 +02:00
davide 0796c51469 refactor(pipeline): modularizza apply_transforms in 26 funzioni _t_xxx
Estrae ogni trasformazione strutturale in una funzione dedicata
_t_xxx(text) -> tuple[str, int], sostituendo la mega-function da
418 righe con un loop su lista di coppie (stat_key, fn). Aggiunge
_parse_sections_with_body() condivisa tra analyze() e build_report().
Output identico verificato su tutti e 5 gli stem esistenti
2026-04-17 09:46:59 +02:00
davide c3bd1a8ff3 feat(validate): scoring orientato a chunking/vettorizzazione, flag --detail
- _score() ritorna (int, list[str]) con dettaglio penalità applicate
- Rimossi criteri non pertinenti al chunking: sezioni_corte, sezioni_lunghe,
  mediana, p25 — il chunker le normalizza già in fase di suddivisione
- Aggiunte penalità per residui che impattano i vettori: br_inline,
  simboli_encoding, formule_inline
- Flag --detail / -d per mostrare breakdown penalità per documento
- Colonne tabella aggiornate: btk, br, enc, url, med
2026-04-17 09:20:21 +02:00
davide 3067214b28 feat(pipeline): 10 nuovi transform e metriche residui estese
- 0_br: rimozione tag <br> residui da tabelle PDF
- 0_tabsep: rimozione separatori | | e |---| (doppio pass pre/post merge)
- 0a2: correzione encoding " → × (moltiplicazione, solo digit-before)
- 0a3: correzione encoding ! → µ prima di unità SI
- 0a4: rimozione label formule inline [N.M]
- 9c: filtro garbage headers — simboli puri, abbreviazioni brevi, prefisso ...
- 9d: rimozione sezioni frontmatter (URL, email, copyright, affiliazione)
- build_report: tracking esteso br_inline, simboli_encoding, formule_inline
2026-04-17 09:19:53 +02:00
davide a8178cab25 feat(conversione): aggiungi clear.sh per pulizia batch cartelle stem
Script bash con conferma interattiva e flag -f per eliminare in blocco
le cartelle stem gitignorate in conversione/*/
2026-04-17 09:19:30 +02:00
davide eb761aae15 feat(conversione): 7 nuovi transform pipeline, refactor validate — media 92→99/100
- dot-leader continui, strip "- " in allcaps, backtick orfani LaTeX
- TOC list removal, extract_article_headers, extract_math_environments, merge_title_headers
- validate.py: interfaccia semplificata, rimosso codice morto
2026-04-17 07:47:56 +02:00
davide aa707ef4d8 feat(validate): support single-file flags and explicit markdown score output 2026-04-16 16:05:03 +02:00
davide e06b65272b feat(pdf-to-md): sostituisci report.md con report.json + validate.py
pipeline.py produce conversione/<stem>/report.json invece di
structure_profile.json + report.md. Il JSON contiene tutto:
trasformazioni, struttura, distribuzione lunghezze sezioni,
anomalie (bare_headers, short/long sections) e residui con esempi.

Fix: bare_headers flagga solo header senza corpo < 30 chars;
header numerati con corpo lungo (aforismi) non sono anomalie.

Nuovo validate.py legge tutti i report.json e stampa tabella
di stato per ogni stem ( / ⚠️ / ) con soglie configurabili.

README aggiornato con sezione validazione batch e struttura report.json.
2026-04-16 15:54:21 +02:00
davide b8d3c459c8 docs(pdf-to-md): aggiungi README per conversione/
Spiega requisiti (Java 11+, opendataloader-pdf), setup, utilizzo,
output prodotti, tutte le trasformazioni strutturali e i tipi di
documento supportati.
2026-04-16 15:35:58 +02:00
davide 1565cccb43 refactor(pdf-to-md): rimuovi riferimenti agli step interni da conversione/
pipeline.py è una pipeline autonoma e non deve nominare la suddivisione
interna del progetto (step-0..4). Aggiornati docstring, commenti sezione,
messaggi di output e argparse description.
2026-04-16 15:31:03 +02:00
davide 165de34df2 feat(pdf-to-md): aggiungi pipeline automatica PDF → Markdown pulito
Nuova cartella conversione/ con pipeline.py che sostituisce
step-0+1+2+3+4 in un singolo comando senza operazioni manuali.
Usa opendataloader-pdf (algoritmo XY-Cut++ per ordine di lettura).

Trasformazioni strutturali:
- accenti backtick da PDF LaTeX (es. `e→è, puo`→può)
- rimozione dot-leader TOC e numerali romani pagina (i, ii, iii)
- normalizzazione header a gerarchia uniforme h1/h2/h3
- conversione sezioni numerate e aforismi → header ###
- rilevamento sezioni Esercizi → disabilita conversione numerazioni
- watermark URL rimossi, header vuoti scartati
2026-04-16 15:27:53 +02:00
davide 07e5c0c9ec feat(step-9): aggiungi retrieve.py per retrieval puro senza LLM
Nuovo script interattivo che vettorizza la query e restituisce i chunk
più simili da ChromaDB senza chiamare Ollama per la generation.
Utile per debug del retrieval e verifica della qualità dei chunk.
Aggiornato README con rag.py e retrieve.py come opzioni alla pari.
2026-04-15 14:25:44 +02:00
davide 9cbfc48537 docs(README): aggiungi istruzioni manuali senza Claude per step 4 e 6
Step 4: sostituisce la sezione "Revisione manuale residua" con 6 check
grep/python eseguibili da terminale (sillabazione, righe orfane, frasi
spezzate, header, sezioni vuote, gerarchia).

Step 6: aggiunge sottosezione "Senza Claude Code" con tabella delle 3
condizioni di output di verify_chunks, spiegazione delle operazioni di
fix_chunks --dry-run e tabella dei 4 casi di 🔴 persistenti con la
correzione specifica in clean.md.
2026-04-15 13:34:02 +02:00
davide 58de94e03b fix(step-6): riconosci _word._ come terminatore valido in verify_chunks
Rimuove falsi positivi per chunk che terminano con marcatori markdown
di enfasi (_) dopo punteggiatura di fine frase (es. _parola._).
Aggiunge U+2026 (…) alla lista di terminatori accettati.
2026-04-15 13:33:45 +02:00
davide 8a36735741 feat(skills): potenzia step4-review e step6-fix con check concreti
step4-review: aggiunge 6 check con grep/python eseguibili (sillabazione,
righe orfane, frasi spezzate, header sospetti, sezioni vuote, gerarchia);
carica revision_log e structure_profile per contesto immediato.

step6-fix: aggiunge Passo 0 di ri-verifica fresca, mostra last_text dei
chunk problematici, exit immediato su verdict=ok, delta chunk pre/post.
2026-04-15 11:39:09 +02:00
davide 1733819cdf docs(CLAUDE.md): riscrivi con regole operative e tabella file critici
Espande CLAUDE.md da 6 a ~80 righe per orientare Claude Code sulle
convenzioni critiche del progetto: pipeline visiva, sincronizzazione
soglie chunking su 3 file, coerenza EMBED_MODEL, skills custom.
2026-04-15 11:38:51 +02:00
davide a641909ebd step-9: add dynamic epilog and improve argparse help text
- description spiega scopo e prerequisiti
- help di --stem rimosso riferimento al documento specifico
- epilog mostra sintassi del loop interattivo
- epilog lista le collection ChromaDB disponibili a runtime
2026-04-14 19:45:19 +02:00
davide c9d2ad9064 docs(step-8): aggiungi regole per parametri ottimali
fix(step-9): passa SYSTEM_PROMPT come campo system nell'API Ollama
anziche concatenato nel prompt — risolve risposte di fallback errate
con modelli piccoli
2026-04-14 19:10:43 +02:00
davide 05946bb93f feat(step-7,8): leggi modello da config.py, allinea EMBED_MODELS al README
- step-8/ingest.py: rimuove EMBED_MODEL e OLLAMA_URL hardcoded;
  li importa da step-9/config.py (fonte di verita unica)
- step-7/check_env.py: aggiorna EMBED_MODELS con tutti i modelli
  del README (aggiunge qwen3-embedding, nomic-embed-text-v2-moe,
  paraphrase-multilingual); mostra il modello configurato in config.py
  e verifica proprio quello, non un qualsiasi modello embedding
- step-8/README.md: creato
2026-04-14 18:22:14 +02:00
davide 92182a2cd4 chore: rimuovi .env.example e traccia sources/.gitkeep
- .env.example eliminato: le istruzioni per le variabili d'ambiente sono documentate nel README
- sources/.gitkeep aggiunto con --force per tracciare la directory sources/ (ignorata da .gitignore) senza committarne il contenuto
2026-04-14 18:01:02 +02:00
davide 5bf8ca7748 docs: allinea README alla struttura reale del progetto
Corregge struttura progetto (step-N/ invece di scripts/ e processed/),
aggiorna script, comandi e path per step 1–3, rimuove riferimenti a
marker-pdf (sostituito da pymupdf4llm), snellisce step 7 e 9 con
rimando ai README dedicati, segna step 10 come da implementare
2026-04-14 15:57:49 +02:00
davide 5aa2a9e259 docs(step-7): aggiorna guida modelli embedding e LLM
Sostituisce la tabella embedding con valutazione completa dei modelli
disponibili su Ollama, con raccomandazione esplicita per testi italiani.
Riduce la sezione LLM alla sola famiglia Qwen3.5 con nota di compatibilità.
Semplifica la sezione chromadb
2026-04-14 15:57:40 +02:00
davide 046828be41 step-9: add pipeline RAG interattiva
Aggiunge rag.py (loop interattivo retrieval+generation), config.py
(tutti i parametri in un unico file), test_ollama.py (verifica
Ollama senza ChromaDB) e README.md dedicato.
Aggiunge .env.example e aggiorna .gitignore
2026-04-14 15:57:29 +02:00
davide 4873eee739 step-8: add ingest.py, align README
- ingest.py: embed chunks via Ollama nomic-embed-text, index in
  ChromaDB (cosine space); --stem / --force / batch-100 / ETA display
- README: fix step-8 input path (step-5 → step-6), script path
  (scripts/ → step-8/), add --force explanation and real timings
2026-04-14 10:59:40 +02:00
davide 8afd3f3d24 step-7: add check_env.py, README, update requirements
- check_env.py: verifica ollama, embedding model, LLM model, chromadb
- Rileva qualsiasi modello embedding/LLM installato (non lista fissa)
- step-7/README.md: guida installazione/disinstallazione Ollama, modelli, chromadb
- requirements.txt: aggiunge chromadb per step-8
2026-04-14 07:54:04 +02:00
davide 386af44c83 step-6: add fix_chunks.py, make step-6 self-contained
- verify_chunks.py now reads from step-6/<stem>/chunks.json and
  auto-copies from step-5 on first run (input and output both in step-6)
- fix_chunks.py: new script that applies fixes directly on chunks.json
  (merge too-short/incomplete, split too-long, remove empty, add prefix)
  supports --dry-run to preview changes before applying
- step6-fix.md skill updated to use fix_chunks.py workflow:
  dry-run → user approval → apply → re-verify
2026-04-13 23:56:50 +02:00
davide f80b77ab93 step-5: add adaptive chunker
chunker.py splits any revised Markdown (step-4) into RAG-ready chunks.
Supports 4 strategies driven by structure_profile.json: h3_aware,
h2_paragraph_split, paragraph, sliding_window. Respects MIN/MAX_CHARS
and sentence-level overlap. Updates .gitignore and README paths.
2026-04-13 13:48:51 +02:00
davide aa5ae17ca8 step-4: add revise.py, step4-review skill, README update
- revise.py: automatic pre-processing (ALL-CAPS→##, numbered sections→###,
  TOC removal, broken paragraph merging, whitespace normalization);
  supports N. and Na. numbering patterns; universal heuristics
- .claude/commands/step4-review.md: Claude Code skill for qualitative
  review of clean.md (🔴/🟡/🟢 report + interactive fixes)
- README: document step-4 workflow with revise.py and /step4-review
- .gitignore: exclude step-4/*/ and step-4/revision_log.md
2026-04-13 12:21:30 +02:00
davide eaca282f2f step-3: add detect_structure.py (structure profile, no ML deps) 2026-04-13 10:16:45 +02:00
davide 5a4fdc27ec step-2: add convert_pdf.py (pymupdf4llm, low-memory)
Converts PDFs in sources/ to Markdown using pymupdf4llm (pure C,
~30-50 MB RAM, no ML models). Output: step-2/<stem>/raw.md + clean.md.
2026-04-13 10:01:03 +02:00
davide 0768188c0a step-1: add inspect_pdf.py
Analisi automatica pagina per pagina: score 0–100, sillabazioni,
layout a colonne, Unicode anomali, intestazioni/piè ripetitivi.
Report salvato in step-1/<stem>_step1_report.txt (escluso da git).
2026-04-13 08:51:08 +02:00
davide f9328c4d5b step-0: add check_pdf.py
Script di verifica idoneità PDF per lo step 0 della pipeline RAG.
Legge automaticamente tutti i PDF in sources/, controlla criteri
obbligatori e desiderabili, salva il report in step-0/.
2026-04-13 08:03:13 +02:00
davide 6b17df8a3f project setup: gitignore, CLAUDE.md, requirements
Aggiunge configurazione base del progetto:
- .gitignore: esclude venv, sources, processed, chroma_db e report generati
- CLAUDE.md: documenta l'uso obbligatorio del venv
- requirements.txt: dipendenze dirette (pdfplumber per step 0-1)
2026-04-13 08:02:54 +02:00
davideandClaude Sonnet 4.6 82456d4aba Initial commit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 23:53:13 +02:00