Come Lavorare con il Clustering in Python
Aspose.PDF FOSS per Python include un piccolo utility di clustering gerarchico agglomerativo di uso generale — indipendente da qualsiasi operazione PDF singola — per raggruppare oggetti DataPoint correlati in istanze Cluster e calcolare il centroide di un cluster. Decidi tu cosa rappresenta ciascun punto dati e fornisci le sue coordinate; l’utilità non le popola automaticamente. La libreria si installa con il comando riportato di seguito.
Guida passo-passo
Passo 1: Installa il pacchetto
Installa il pacchetto FOSS Aspose.PDF:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .Verifica l’installazione importando Cluster e stampando un messaggio di conferma:
from aspose_pdf import Cluster
print("aspose-pdf-foss-for-python is ready.")Passo 2: Importa le classi richieste
Importa le tre classi che costituiscono l’utilità di clustering:
from aspose_pdf import Cluster, ClusterCollection, DataPointPasso 3: Crea i punti dati
Un DataPoint associa una stringa name a una lista value di float — le coordinate o il vettore di caratteristiche che decidi siano significativi per la tua logica di raggruppamento:
from aspose_pdf import DataPoint
point_a = DataPoint("item-1", [12.0, 45.0])
point_b = DataPoint("item-2", [13.5, 44.0])
point_c = DataPoint("item-3", [98.0, 5.0])
print(point_a.name, point_a.value)DataPoint non lega value a nessun concetto PDF specifico — le coordinate di pagina, le metriche dei font o qualsiasi altro vettore di caratteristiche numeriche funzionano tutti ugualmente bene.
Passo 4: Raggruppa i punti dati in un cluster
Passa l’elenco completo dei membri al costruttore Cluster. Non esiste un metodo per aggiungere elementi a un Cluster dopo che è stato creato, quindi decidi la composizione dei membri prima:
from aspose_pdf import Cluster
nearby = Cluster([point_a, point_b])
print(nearby.count) # 2
print(nearby.contains(point_a)) # Truecontains() corrisponde per uguaglianza — DataPoint definisce l’uguaglianza su name e value insieme, quindi una diversa istanza DataPoint con lo stesso nome e valore viene anch’essa segnalata come contenuta.
Passo 5: Calcola il centroide del cluster
DataPoint.get_centroid(cluster) è un metodo statico che media ogni dimensione di tutti i DataPoint.value nel cluster e restituisce il risultato come un nuovo DataPoint chiamato "centroid":
from aspose_pdf import DataPoint
centroid = DataPoint.get_centroid(nearby)
print(centroid.name) # "centroid"
print(centroid.value) # per-dimension average across the clusterOgni lista DataPoint.value nel cluster deve avere la stessa lunghezza — get_centroid media posizione per posizione e non verifica che le lunghezze corrispondano. Chiamarla su Cluster.empty(), o su qualsiasi cluster con count == 0, solleva ValueError.
Passo 6: Clona un cluster o riutilizza l’istanza vuota condivisa
clone() restituisce un Cluster indipendente che contiene gli stessi elementi; Cluster.empty() restituisce sempre la stessa istanza di cluster vuoto memorizzata nella cache anziché allocarne una nuova:
from aspose_pdf import Cluster
backup = nearby.clone()
print(backup is nearby) # False -- independent copy
print(backup.contains(point_a)) # True -- same items
placeholder = Cluster.empty()
print(placeholder.count) # 0Passo 7: Raggruppa più cluster in un ClusterCollection
ClusterCollection raggruppa diversi oggetti Cluster dietro un unico contenitore consapevole di len():
from aspose_pdf import Cluster, ClusterCollection
outliers = Cluster([point_c])
collection = ClusterCollection([nearby, outliers])
print(len(collection)) # 2ClusterCollection non espone un metodo per recuperare i suoi cluster — conserva un riferimento alla lista che passi al costruttore se hai bisogno di iterare i cluster in seguito.
Problemi comuni e soluzioni
Non esiste alcun metodo per aggiungere un elemento a un esistente Cluster
Cluster accetta la sua lista di membri solo al momento della costruzione (Cluster(items)). Costruisci prima l’elenco completo di oggetti DataPoint, poi costruisci il Cluster — non esiste alcun add() o append() da chiamare successivamente.
DataPoint.get_centroid() raises ValueError
Questo accade quando il cluster passato è vuoto (count == 0), inclusi Cluster.empty(). Controlla cluster.count prima di chiamare get_centroid, oppure gestisci l’eccezione se un cluster vuoto è un input valido nel tuo flusso di lavoro.
I valori del centroide sembrano errati
get_centroid somma ogni posizione di DataPoint.value una per una e divide per il numero di punti — non verifica che ogni lista di value nel cluster abbia la stessa lunghezza. Mescolare oggetti DataPoint con dimensionalità non corrispondente produce una media errata in modo silenzioso invece di sollevare un’eccezione.
Expecting Cluster.empty() per creare un nuovo cluster vuoto ogni volta
Cluster.empty() è un accessor singleton — ogni chiamata restituisce la stessa istanza nella cache. Usa Cluster() (senza argomenti) invece se ti serve un cluster vuoto distinto e indipendente.
Ci si aspetta che la libreria raggruppi i punti automaticamente
DataPoint, Cluster e ClusterCollection sono strutture dati per rappresentare punti, cluster e un calcolo del centroide — il modulo non include una funzione di collegamento o di distanza che decida quali punti appartengono insieme. Il tuo codice determina l’appartenenza ai cluster prima di costruire un Cluster.
Domande Frequenti
Questo modulo raggruppa automaticamente i punti dati per distanza?
No. Cluster, DataPoint e ClusterCollection sono blocchi costitutivi per rappresentare raggruppamenti già decisi e calcolare un centroide — non esiste alcuna fase di aggregazione o di assegnazione basata sulla distanza incorporata.
Qual è la differenza tra Cluster() e Cluster.empty()?
Cluster(items=None) crea una nuova istanza ogni volta che viene chiamato. Cluster.empty() è un metodo di classe che restituisce la stessa istanza di cluster vuoto memorizzata nella cache e condivisa a ogni chiamata.
Posso aggiungere elementi a un Cluster dopo averlo creato?
No. Cluster espone solo contains(), clone() e la proprietà count oltre alla costruzione — l’appartenenza è fissata una volta che il costruttore viene eseguito.
Il get_centroid() funziona con qualsiasi numero di dimensioni?
Sì, purché ogni lista DataPoint.value nel cluster abbia la stessa lunghezza. get_centroid calcola la media di ogni dimensione in modo indipendente e restituisce il risultato come un nuovo DataPoint.
Cosa aggiunge ClusterCollection oltre a una semplice lista di cluster Python?
Principalmente un contenitore tipizzato con supporto len(). Non aggiunge iterazione, ricerca o comportamento di fusione oltre a ciò che hai già nella lista da cui lo hai costruito.