--- license: apache-2.0 title: Automated Semantic Discovery sdk: docker colorFrom: blue colorTo: red pinned: false emoji: 🧠 short_description: Neurosymbolic prototype for automatic semantic discovery --- # Automated Semantic Discovery – Prototype ![Python](https://img.shields.io/badge/python-3.13-blue) ![FastAPI](https://img.shields.io/badge/framework-FastAPI-009688) ![Streamlit](https://img.shields.io/badge/UI-Streamlit-FF4B4B) ![Neo4j](https://img.shields.io/badge/graphdb-Neo4j-green) ![LLM](https://img.shields.io/badge/LLM-Groq%20%7C%20Llama%203-black) ![Status](https://img.shields.io/badge/status-Phase%201%20Completed-success) Questo repository contiene un **prototipo avanzato per la scoperta semantica automatica (Automated Semantic Discovery)**. Il sistema agisce come un microservizio finalizzato alla generazione di **ontologie authoritative** e **Knowledge Graphs** a partire da testo non strutturato. Nasce come strumento abilitante per scenari aziendali e di BPO, dove l'estrazione massiva di dati deve coniugarsi con il rigore dei vocabolari semantici formali (es. ArCo, OntoPiA, CIDOC-CRM). Il progetto espone una doppia interfaccia: 1. **API REST (FastAPI):** Ideale per l'integrazione asincrona e l'orchestrazione da parte di backend esterni ad alte prestazioni (es. Go/Java). 2. **Web UI (Streamlit):** Un'interfaccia interattiva, perfetta per demo, test curati e visualizzazione topologica del grafo. ## Il Paradigma Neuro-Simbolico Il progetto supera i limiti dei tradizionali sistemi RAG o delle semplici estrazioni LLM implementando una pipeline ibrida: - **Neuro (AI Generativa & Vettoriale):** Sfrutta la comprensione del testo dei Large Language Models (tramite Groq/Llama 3) e il clustering semantico basato su embedding spaziali (`sentence-transformers`). - **Symbolic (Logica Deterministica):** Applica regole algoritmiche rigide per la validazione ontologica (**SHACL** via `pyshacl`), il Type-Driven Domain Traversal (**TDDT**) e l'Entity Linking formale. ## Workflow Architetturale (Fase 1) La pipeline elabora i dati in memoria ed Γ¨ orchestrata in moduli sequenziali indipendenti: ### 1. Semantic Chunking (`semantic_splitter.py`) Segmentazione dinamica del testo basata su **cosine similarity** vettoriale. L'algoritmo calcola i percentili di distanza per individuare i reali "punti di rottura" argomentativi, garantendo chunk semanticamente coesi. ### 2. Type-Driven Domain Traversal - TDDT (`extractor.py`) Estrazione relazionale a "imbuto" in due passaggi (Pass 1: Macro-Categorizzazione e Specializzazione; Pass 2: Estrazione Relazionale). Il modello linguistico Γ¨ vincolato tramite *Structured Outputs* (Pydantic JSON Schema) a utilizzare esclusivamente gli URI presenti nel **Domain Index**, azzerando le allucinazioni sui tipi. ### 3. Hybrid Entity Resolution (`entity_resolver.py`) - Deduplica locale in RAM tramite clustering spaziale (**DBSCAN**). - Normalizzazione del "Label Bloat" tramite algoritmi di **Majority Voting** sui tipi ontologici. - Risoluzione globale sui **Vector Index nativi di Neo4j**. - **Entity Linking** asincrono tramite chiamate REST all'API di **Wikidata** per l'ancoraggio a concetti universali (`owl:sameAs`). ### 4. SHACL Blocking & Validation (`validator.py` & `build_schema.py`) Costruzione automatica di vincoli SHACL a partire dal dizionario ontologico. Durante l'estrazione, un reasoner OWL RL convalida la conformitΓ  (Domain/Range) delle triple. Le triple invalide vengono deviate su una DLQ (Dead Letter Queue) in MongoDB per non corrompere il grafo principale. ### 5. Graph Persistence (`graph_loader.py`) Salvataggio massivo transazionale (`UNWIND` Cypher) su database a grafo **Neo4j**, includendo tracciabilitΓ  della fonte (`evidence`, `reasoning`) per garantire la massima *Explainability*. ## Struttura del repository ```text prototipo/ β”‚ β”œβ”€β”€ assets/ β”‚ └── style.css β”‚ β”œβ”€β”€ ontology/ β”‚ β”œβ”€β”€ domain_index.json # Indice gerarchico delle ontologie (JSON) β”‚ └── shapes/ β”‚ └── auto_constraints.ttl # Regole SHACL autogenerate β”‚ β”œβ”€β”€ src/ β”‚ β”œβ”€β”€ ingestion/ β”‚ β”‚ └── semantic_splitter.py β”‚ β”œβ”€β”€ extraction/ β”‚ β”‚ └── extractor.py β”‚ β”œβ”€β”€ validation/ β”‚ β”‚ └── validator.py β”‚ └── graph/ β”‚ β”œβ”€β”€ graph_loader.py β”‚ └── entity_resolver.py β”‚ β”œβ”€β”€ app.py # Entrypoint Web UI (Streamlit) β”œβ”€β”€ api.py # Entrypoint API REST (FastAPI) β”œβ”€β”€ build_schema.py # Script per la generazione di index e shapes SHACL β”œβ”€β”€ Dockerfile # Configurazione container β”œβ”€β”€ .env.example β”œβ”€β”€ requirements.txt └── README.md ``` ## Tech Stack & Requisiti - **Linguaggio**: Python 3.13 - **Database**: Neo4j (Graph), MongoDB (DLQ) - **Interfacce**: FastAPI, Uvicorn, Streamlit - **Core Libraries**: - **Neuro** : `langchain`, `langchain-huggingface`, `langchain-groq`, `scikit-learn` - **Symbolic** : `neo4j`, `rdflib`, `pyshacl`, `pydantic` > Le dipendenze complete sono elencate in `requirements.txt`. ## Configurazione Locale Per testare il sistema in locale, creare un file `.env` a partire dal template: ```env NEO4J_URI=neo4j+s://.databases.neo4j.io NEO4J_USER=neo4j NEO4J_PASSWORD=la_tua_password MONGO_URI=mongodb://localhost:27017/ GROQ_API_KEY=tua_api_key_groq ONTOLOGY_PATH=./ontology ``` ## Installazione ed Esecuzione ```bash # 1. Clona il repository git clone [https://github.com/](https://github.com/)/.git cd prototipo # 2. Crea l'ambiente virtuale e attivalo python -m venv venv source venv/bin/activate # Linux / macOS # venv\Scripts\activate # Windows # 3. Installa le dipendenze pip install -r requirements.txt # 4. Genera gli indici ontologici (una tantum) python build_schema.py ``` ## ModalitΓ  1: Web UI (Streamlit) Avvia la dashboard interattiva per visualizzare il grafo e testare l'estrazione: ```bash streamlit run app.py ``` L'interfaccia sarΓ  disponibile su `http://localhost:8501`. ## ModalitΓ  2: API REST Headless Avvia il motore in ascolto per l'orchestrazione backend: ```bash python api.py ``` L'endpoint sarΓ  disponibile su `http://0.0.0.0:5000/api/discover`. ## Output dell'API Il sistema produce una risposta JSON strutturata contenente: - Statistiche di esecuzione (tempo, chunk elaborati). - Esito della validazione SHACL. - La lista completa delle triple riconciliate e validate. - Il feedback di avvenuto inserimento massivo su Neo4j. ## Limiti noti - **Rate Limiting Wikidata**: Le chiamate di Entity Linking dipendono dai tempi di risposta dell'API pubblica di Wikidata; per ingestion intensive Γ¨ consigliato l'uso di cache locali stratificate. - **Dipendenza da Vocabolari**: L'accuratezza dell'estrazione semantica tramite Schema-RAG fluttua in base alla ricchezza descrittiva del dizionario JSON ontologico fornito in ingresso. ## Riferimenti **Automated Semantic Discovery – Generazione Neuro-Simbolica di Ontologie Leggere e Vocabolari Semantici** Gaetano Parente, Dicembre 2025 ## Autore **Gaetano Parente** Activa Digital – NextGenTech