Commit Graph

42 Commits

Author SHA1 Message Date
davide e02e3496a3 chore(requirements): rimuovi commenti step-X obsoleti 2026-04-17 18:50:53 +02:00
davide 12effa1a51 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 fc457e8525 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 610d4db348 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 82f205faa2 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 368530bc25 refactor(docs): skill prepare-md sostituisce step4-review, CLAUDE.md senza step-X 2026-04-17 13:44:41 +02:00
davide cdb2d4cab9 fix(conversione): PUA Symbol, garbage headers, merge+bib guard, math EN 2026-04-17 13:44:30 +02:00
davide ef8f56fdba 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 0a8d98279c 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 757df26bc2 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 875a342efa 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 ea721774da 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 9910a70823 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 265ac92b6c 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 bcf2e688aa feat(validate): support single-file flags and explicit markdown score output 2026-04-16 16:05:03 +02:00
davide 5b6940e479 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 6ec54c8616 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 2545d834a9 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 b7994100e7 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 70924a575a 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 0b46c73006 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 87e7ba67ec 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 dabad93131 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 94766d67cc 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 80bd563000 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 1a0ebafda5 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 6594033673 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 f62b5bc871 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 8fa07784ae 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 f27ebfa101 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 d50f7f64a9 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 7d95872a8e 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 a5f8b8d119 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 e70a9a41f0 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 5126e0d971 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 1631dff80d 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 ee25adc0a6 step-3: add detect_structure.py (structure profile, no ML deps) 2026-04-13 10:16:45 +02:00
davide 346e336f1a 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 3d9ed0141c 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 eda04dc464 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 42c38c30f7 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
davide 638ba17629 Inital commit 2026-04-12 23:53:13 +02:00