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
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:
- API REST (FastAPI): Ideale per l'integrazione asincrona e l'orchestrazione da parte di backend esterni ad alte prestazioni (es. Go/Java).
- 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
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
- Neuro :
Le dipendenze complete sono elencate in
requirements.txt.
Configurazione Locale
Per testare il sistema in locale, creare un file .env a partire dal template:
NEO4J_URI=neo4j+s://<tuo-cluster>.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
# 1. Clona il repository
git clone [https://github.com/](https://github.com/)<username>/<repository>.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:
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:
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