File size: 7,241 Bytes
d01272f
 
 
 
 
 
 
 
a551bb6
d01272f
 
8905ad0
 
cc3f780
 
 
8905ad0
fe271ee
 
8905ad0
fe271ee
8905ad0
fe271ee
8905ad0
fe271ee
 
 
8905ad0
fe271ee
8905ad0
fe271ee
 
 
8905ad0
fe271ee
8905ad0
fe271ee
8905ad0
fe271ee
 
8905ad0
fe271ee
 
8905ad0
fe271ee
 
 
 
 
8905ad0
fe271ee
 
8905ad0
fe271ee
 
8905ad0
 
 
 
 
 
a551bb6
 
 
fe271ee
 
 
 
8905ad0
 
 
 
 
 
cc3f780
fe271ee
8905ad0
cc3f780
 
8905ad0
fe271ee
cc3f780
fe271ee
 
 
cc3f780
8905ad0
 
 
 
 
cc3f780
fe271ee
cc3f780
fe271ee
 
 
8905ad0
 
 
cc3f780
8905ad0
cc3f780
8905ad0
 
cc3f780
8905ad0
cc3f780
fe271ee
 
 
8905ad0
 
cc3f780
8905ad0
 
fe271ee
cc3f780
8905ad0
 
cc3f780
8905ad0
 
cc3f780
8905ad0
cc3f780
8905ad0
fe271ee
 
 
8905ad0
fe271ee
8905ad0
fe271ee
8905ad0
 
cc3f780
8905ad0
 
cc3f780
8905ad0
fe271ee
8905ad0
fe271ee
8905ad0
 
cc3f780
8905ad0
 
cc3f780
8905ad0
cc3f780
8905ad0
cc3f780
8905ad0
cc3f780
 
 
 
8905ad0
 
 
cc3f780
2fe50b2
8905ad0
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
---
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://<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

```bash
# 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:

```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