Costruire un motore di ricerca semantico e un classificatore su dataset di problemi matematici
Il dataset ResearchMath-14k, disponibile su Hugging Face come amphora/ResearchMath-14k, contiene oltre 14.000 problemi matematici di livello universitario e di ricerca, estratti dagli articoli di arXiv. In questo tutorial vediamo come caricarlo, esplorarne la struttura, estrarre keyword per campo, generare embeddings semantici, clusterizzare i problemi, costruire un motore di ricerca e addestrare un classificatore per lo stato aperto (open-status).
Iniziamo installando le librerie necessarie e importando i moduli principali: datasets, sentence-transformers, scikit-learn, umap-learn, pandas, matplotlib e seaborn. Impostiamo anche i parametri di configurazione: dimensione del campione a 4000, random seed a 42, e modello di embedding all-MiniLM-L6-v2.
Carichiamo il dataset con load_dataset("amphora/ResearchMath-14k", split="test") e lo convertiamo in DataFrame pandas. Filtriamo le righe con problemi troppo corti (meno di 20 caratteri). Esploriamo la distribuzione delle colonne: open_status e taxonomy_level_1. Visualizziamo con bar chart e istogrammi la distribuzione dei campi matematici, dello stato e della lunghezza dei problemi.
Creiamo una heatmap incrociando campo e stato per vedere come si distribuiscono le categorie.
Usiamo TF-IDF per estrarre le 8 parole/ngrammi più rappresentative per ogni campo matematico. Raggruppiamo per taxonomy_level_1 e calcoliamo i termini con il TF-IDF medio più alto. Per esempio, in “Algebra” emergono termini come “group”, “module”, “finite”, “representation”; in “Geometria” troviamo “manifold”, “hyperbolic”, “Riemannian”.
Campioniamo il dataset e generiamo embeddings semantici con SentenceTransformer. Riduciamo le dimensioni con UMAP e visualizziamo il landscape dei problemi colorato per campo. Applichiamo K-Means e confrontiamo i cluster con la tassonomia originale usando Adjusted Rand Index e Normalized Mutual Information.
Costruiamo una funzione di ricerca semantica: codifichiamo una query in embedding, calcoliamo la similarità coseno con tutti i problemi e restituiamo i primi k risultati. Esempio: cercando “rational points on hyperelliptic curves” otteniamo problemi in “Number Theory” con similarità > 0.5.
Addestriamo un classificatore Logistic Regression sugli embeddings per predire open_status. Suddividiamo in training (75%) e test (25%), bilanciamo le classi e otteniamo un report di classificazione e una matrice di confusione normalizzata per riga.
Infine, calcoliamo la similarità a coppie tra tutti gli embeddings, escludendo la diagonale, e identifichiamo la coppia di problemi più simile. Stampiamo i dettagli dei due problemi: paper_id, campo e testo troncato.
Questo flusso di lavoro mostra come passare dall’esplorazione di un dataset testuale a strumenti avanzati di NLP: keyword extraction, embeddings, clustering, ricerca semantica e classificazione. È un approccio pratico per analizzare grandi corpora di testo scientifico.
