  {"id":3901,"date":"2026-06-28T09:27:16","date_gmt":"2026-06-28T08:27:16","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=3901"},"modified":"2026-06-28T10:16:42","modified_gmt":"2026-06-28T09:16:42","slug":"naive-bayes-intento-ricerca","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/naive-bayes-intento-ricerca\/","title":{"rendered":"Naive Bayes: classificare l&#8217;intento delle query con il teorema di Bayes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nell&#8217;articolo sul <a href=\"https:\/\/www.gironi.it\/blog\/multi-armed-bandit-thompson\/\">multi-armed bandit<\/a> abbiamo usato Bayes per <em>decidere fra varianti<\/em>: spostare il traffico verso quella che converte di pi\u00f9 mentre il test \u00e8 ancora in corso. Adesso facciamo un passo di lato, restando per\u00f2 nello stesso impianto di ragionamento: invece di scegliere fra opzioni, vogliamo <em>classificare<\/em>, cio\u00e8 attaccare a ogni nuova osservazione l&#8217;etichetta pi\u00f9 probabile date le sue caratteristiche.<br> Il caso concreto \u00e8 uno che chiunque faccia SEO conosce bene: <strong>l&#8217;intento dietro una query di ricerca<\/strong>. Chi cerca &#8220;come fare un dolce&#8221; vuole imparare qualcosa; chi cerca &#8220;comprare scarpe online&#8221; \u00e8 pronto a tirare fuori la carta di credito. Sono due mondi diversi, e servono contenuti diversi: una guida, un tutorial, un glossario per il primo; una scheda prodotto, un listino, una <em>call to action<\/em> ben visibile per il secondo. Sbagliare l&#8217;intento significa rispondere alla domanda giusta nel modo sbagliato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il problema \u00e8 che le query sono tante e sempre nuove, e classificarle a mano non scala. Ci serve un metodo che impari da un po&#8217; di esempi etichettati e poi se la cavi da solo sulle query mai viste. L&#8217;algoritmo che fa questo con un&#8217;eleganza quasi disarmante \u00e8 il <em>Naive Bayes<\/em>, e \u2014 come il nome lascia intuire \u2014 parte ancora una volta dal <a href=\"https:\/\/www.gironi.it\/blog\/statistica-bayesiana\/\">teorema di Bayes<\/a> che ci accompagna da tutto questo percorso.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Di cosa parleremo<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#dal-teorema\">Dal teorema al classificatore<\/a><\/li><li><a href=\"#addestramento\">Addestrare su query etichettate<\/a><\/li><li><a href=\"#classificare\">Classificare le query nuove<\/a><\/li><li><a href=\"#limiti\">I limiti del &#8220;naive&#8221;<\/a><\/li><li><a href=\"#prova-tu\">Prova tu<\/a><\/li><li><a href=\"#per-approfondire\">Per approfondire<\/a><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dal-teorema\">Dal teorema al classificatore<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Riprendiamo il filo. Il teorema di Bayes ci dice come aggiornare la probabilit\u00e0 di un&#8217;ipotesi alla luce dei dati osservati. Qui l&#8217;ipotesi \u00e8 &#8220;questa query appartiene alla classe <em>informazionale<\/em>&#8221; (oppure <em>transazionale<\/em>), e i dati sono le parole che compongono la query. Vogliamo cio\u00e8 la probabilit\u00e0 di una classe <em>dato<\/em> il testo: in simboli, <em>P(classe | parole)<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Calcolarla direttamente sarebbe un incubo, perch\u00e9 le combinazioni di parole possibili sono sterminate. Bayes ci permette di girare il problema: invece di chiederci quanto \u00e8 probabile la classe viste le parole, ci chiediamo quanto sono probabili quelle parole vista la classe \u2014 una domanda a cui i dati di addestramento sanno rispondere. La regola, prima a parole e poi in formula, \u00e8 che la probabilit\u00e0 di una classe data una query \u00e8 proporzionale alla probabilit\u00e0 a priori della classe moltiplicata per la probabilit\u00e0 di osservare quelle parole se la classe fosse quella:<\/p>\n\n\n\n\\( P(\\text{classe} \\mid \\text{parole}) \\propto P(\\text{classe}) \\cdot \\prod_i P(\\text{parola}_i \\mid \\text{classe}) \\\\ \\)\n\n\n\n<p class=\"wp-block-paragraph\">Sciogliamo i simboli. <em>P(classe)<\/em> \u00e8 il <strong>prior<\/strong>: quanto \u00e8 frequente quella classe in partenza, prima di guardare il testo (se met\u00e0 delle query d&#8217;esempio sono informazionali, il prior \u00e8 0,5). <em>P(parola | classe)<\/em> \u00e8 quanto spesso quella parola compare nelle query di quella classe. Il simbolo \u220f \u00e8 semplicemente il prodotto: moltiplichiamo i contributi di tutte le parole della query. Il segno \u221d (&#8220;proporzionale a&#8221;) ci ricorda che stiamo trascurando un denominatore costante, identico per tutte le classi: visto che alla fine ci interessa solo <em>quale<\/em> classe vince, possiamo ignorarlo senza danni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ed eccolo, il punto in cui si annida il &#8220;naive&#8221;. <strong>Moltiplicare le probabilit\u00e0 delle singole parole come se fossero indipendenti l&#8217;una dall&#8217;altra equivale ad assumere che, nota la classe, la presenza di una parola non dica nulla sulla presenza delle altre.<\/strong> \u00c8 un&#8217;assunzione palesemente falsa nel linguaggio reale \u2014 &#8220;carta&#8221; e &#8220;credito&#8221; non compaiono certo a caso una indipendentemente dall&#8217;altra \u2014 ed \u00e8 proprio questa ingenuit\u00e0 (in inglese <em>naive<\/em>) a dare il nome all&#8217;algoritmo. La cosa sorprendente, che vedremo, \u00e8 che pur partendo da un&#8217;ipotesi cos\u00ec grossolana il metodo funziona benissimo nella pratica.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"addestramento\">Addestrare su query etichettate<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Addestrare un Naive Bayes vuol dire una cosa sola: contare. Per ogni classe contiamo quante volte compare ciascuna parola nelle query di esempio, e da quei conteggi ricaviamo le <em>P(parola | classe)<\/em>. Niente ottimizzazione, niente iterazioni: si scorrono i dati una volta e si riempie una tabella di frequenze.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Partiamo da un piccolo insieme di query etichettate a mano, cinque informazionali e cinque transazionali. Addestro il classificatore in R cos\u00ec:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>train &lt;- list(\n  info  = c(\"come fare un dolce\", \"cos e la statistica\", \"guida seo principianti\",\n            \"tutorial r gratis\", \"come funziona il bayesiano\"),\n  trans = c(\"comprare scarpe online\", \"prezzo iphone offerta\", \"miglior hosting economico\",\n            \"acquista corso seo\", \"sconto abbonamento palestra\")\n)\ntok &lt;- function(s) unlist(strsplit(tolower(s), \"\\\\s+\"))\nvocab &lt;- unique(unlist(lapply(unlist(train), tok)))\ncounts &lt;- lapply(train, function(docs) {\n  w &lt;- table(factor(unlist(lapply(docs, tok)), levels = vocab)); w + 1\n})\ntots &lt;- sapply(counts, sum); V &lt;- length(vocab)\nprior &lt;- sapply(train, length) \/ length(unlist(train))   # 0.5 \/ 0.5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo cosa succede riga per riga. La funzione <code>tok<\/code> spezza ogni query in parole minuscole (una tokenizzazione spartana ma sufficiente). <code>vocab<\/code> \u00e8 il vocabolario, l&#8217;elenco di tutte le parole distinte viste in addestramento: qui sono 31. Per ogni classe, <code>table(factor(...))<\/code> conta le occorrenze di ciascuna parola del vocabolario; <code>tots<\/code> \u00e8 il totale dei conteggi per classe, e <code>prior<\/code> qui vale 0,5 e 0,5 perch\u00e9 le due classi hanno lo stesso numero di esempi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;\u00e8 un dettaglio in quel <code>w + 1<\/code> che merita una sosta, perch\u00e9 \u00e8 il trucco che tiene in piedi tutto l&#8217;edificio. <strong>Se una parola non compare mai nelle query di una classe, il suo conteggio \u00e8 zero, e con esso si azzererebbe l&#8217;intero prodotto delle probabilit\u00e0: una sola parola sconosciuta basterebbe a mandare a zero la probabilit\u00e0 della classe, cancellando il contributo di tutte le altre.<\/strong> \u00c8 il classico caso in cui &#8220;moltiplicare per zero&#8221; rovina la festa. La soluzione si chiama <strong>smoothing di Laplace<\/strong>: aggiungiamo 1 al conteggio di ogni parola, in ogni classe, prima di calcolare le proporzioni. Nessuna parola ha pi\u00f9 probabilit\u00e0 esattamente nulla, solo molto piccola.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il prezzo dello smoothing \u00e8 che ai totali per classe va aggiunto il numero di parole del vocabolario (le 31 unit\u00e0 aggiunte una per parola): per questo <code>tots<\/code> non vale 18 e 15 \u2014 i token grezzi delle due classi \u2014 ma 49 e 46. Con questi numeri, per esempio, la parola &#8220;comprare&#8221; (presente una volta fra le transazionali, mai fra le informazionali) ha <em>P(comprare | trans) = 2\/46 \u2248 0,043<\/em> contro <em>P(comprare | info) = 1\/49 \u2248 0,020<\/em>: pi\u00f9 del doppio, ed \u00e8 proprio questo squilibrio che spinge una query verso l&#8217;intento giusto. Una parola neutra come &#8220;seo&#8221;, che compare una volta per parte, resta invece quasi bilanciata fra le due classi e non sposta l&#8217;ago.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"classificare\">Classificare le query nuove<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con la tabella delle frequenze pronta, classificare una query nuova \u00e8 davvero un giochetto da ragazzi: si tokenizza, si sommano i logaritmi delle probabilit\u00e0 di ciascuna parola (sommare logaritmi anzich\u00e9 moltiplicare probabilit\u00e0 evita che il prodotto di tanti numeri piccolissimi vada in <em>underflow<\/em> numerico, ma il risultato \u00e8 lo stesso), si aggiunge il logaritmo del prior e si sceglie la classe con il punteggio pi\u00f9 alto. Calcolo in R:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>classify &lt;- function(query) {\n  w &lt;- tok(query)\n  logp &lt;- log(prior)\n  for (cl in names(train)) {\n    p &lt;- counts[[cl]][w]; p[is.na(p)] &lt;- 1            # parola fuori vocab: peso neutro\n    logp[cl] &lt;- logp[cl] + sum(log(as.numeric(p) \/ tots[cl]))\n  }\n  names(which.max(logp))\n}\ncat(\"'comprare corso seo scontato' -&gt;\", classify(\"comprare corso seo scontato\"), \"\\n\")\ncat(\"'come imparare la statistica'  -&gt;\", classify(\"come imparare la statistica\"), \"\\n\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;output \u00e8 netto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'comprare corso seo scontato' -&gt; trans\n'come imparare la statistica'  -&gt; info<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Come si vede, il classificatore assegna la prima query all&#8217;intento transazionale e la seconda all&#8217;informazionale, esattamente come avrebbe fatto un essere umano. Vale la pena notare come ci arriva. Nella prima query &#8220;comprare&#8221; e &#8220;scontato&#8221; tirano con decisione verso <em>trans<\/em>, &#8220;seo&#8221; resta neutra, e nemmeno &#8220;corso&#8221; \u2014 che in addestramento compariva nel transazionale &#8220;acquista corso seo&#8221; \u2014 rema contro: il verdetto \u00e8 solido. Nella seconda, &#8220;statistica&#8221; \u00e8 una parola spiccatamente informazionale, e &#8220;imparare&#8221;, pur essendo fuori vocabolario, non fa danni grazie a quel <code>p[is.na(p)] &lt;- 1<\/code> che assegna alle parole mai viste un peso neutro, identico per entrambe le classi: non potendo dire nulla, semplicemente non vota.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cinque query d&#8217;esempio per parte sono pochissime, eppure il meccanismo \u00e8 gi\u00e0 tutto qui. In un caso reale basta sostituire le manciate di query etichettate con qualche centinaio o migliaio di query estratte dalla Search Console e annotate per intento, e lo stesso codice \u2014 invariato nella struttura \u2014 diventa un classificatore di intento utilizzabile sul serio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"limiti\">I limiti del &#8220;naive&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di lanciarsi, per\u00f2, \u00e8 bene sapere dove il metodo mostra la corda, perch\u00e9 la sua semplicit\u00e0 ha un rovescio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il limite pi\u00f9 evidente \u00e8 proprio l&#8217;assunzione di indipendenza da cui prende il nome. Trattando ogni parola come slegata dalle altre, il Naive Bayes ignora del tutto l&#8217;ordine e il contesto: per lui &#8220;scarpe da corsa economiche&#8221; e &#8220;economia delle scarpe da corsa&#8221; sono lo stesso sacchetto di parole (<em>bag of words<\/em>, come dicono gli anglosassoni). Nella classificazione d&#8217;intento questo conta poco, ma in compiti pi\u00f9 sottili pu\u00f2 ingannare. C&#8217;\u00e8 poi la questione delle <strong>parole fuori vocabolario<\/strong>: una query fatta solo di termini mai visti in addestramento finirebbe decisa dal solo prior, cio\u00e8 da un puro testa o croce \u2014 il segnale che il dataset di esempi \u00e8 troppo magro e va ampliato.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\">Un avvertimento che vale per qualunque classificatore, e a maggior ragione per uno addestrato su pochi dati: il modello impara <em>esattamente<\/em> ci\u00f2 che gli mostriamo, bias compresi. Se le query d&#8217;esempio transazionali contengono tutte la parola &#8220;comprare&#8221;, il classificatore assocer\u00e0 l&#8217;intento d&#8217;acquisto a quel termine e arrancher\u00e0 su un &#8220;aggiungi al carrello&#8221; altrettanto transazionale ma lessicalmente diverso. La qualit\u00e0 e la rappresentativit\u00e0 dei dati etichettati contano pi\u00f9 della raffinatezza dell&#8217;algoritmo: un Naive Bayes nutrito di esempi vari e bilanciati batte un modello sofisticato addestrato male.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Detto questo, il Naive Bayes resta un <em>preziosissimo strumento<\/em> da avere nella cassetta degli attrezzi: \u00e8 velocissimo da addestrare, richiede pochi dati per partire, \u00e8 interpretabile (possiamo sempre andare a vedere quali parole hanno spinto la decisione) e nella classificazione di testo regge il confronto con modelli ben pi\u00f9 complessi. \u00c8 spesso la <em>baseline<\/em> da battere prima di tirare in ballo artiglieria pi\u00f9 pesante \u2014 ed \u00e8 qui che si apre la porta sul machine learning vero e proprio, dove la classificazione si fa con alberi, regressioni e reti che lasciano cadere l&#8217;ipotesi di indipendenza in cambio di pi\u00f9 potenza (e meno trasparenza).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prova-tu\">Prova tu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il codice qui sopra \u00e8 un terreno di gioco perfetto per costruire l&#8217;intuizione. Le query di ricerca non sono solo informazionali o transazionali: ne manca almeno una terza famiglia, quella <strong>navigazionale<\/strong> (chi cerca &#8220;facebook login&#8221; o &#8220;gironi blog&#8221; vuole solo arrivare a un sito preciso). Ecco qualche modifica da provare:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Aggiungi una classe <code>nav<\/code> al <code>train<\/code> con quattro o cinque query navigazionali (&#8220;facebook login&#8221;, &#8220;youtube&#8221;, &#8220;amazon accedi&#8221;, &#8220;gmail posta&#8221;), poi riaddestra: il <code>prior<\/code> non sar\u00e0 pi\u00f9 0,5 ma circa un terzo per classe. Come cambiano le classificazioni delle query precedenti?<\/li><li>D\u00e0i in pasto al classificatore una query ambigua come &#8220;recensione iphone&#8221; (informativa? transazionale?) e guarda da che parte pende. Aveva senso il verdetto, viste le parole in addestramento?<\/li><li>Togli lo smoothing (sostituisci <code>w + 1<\/code> con <code>w<\/code>) e prova a classificare una query con una parola rara: cosa succede al punteggio quando un conteggio \u00e8 zero? \u00c8 il modo pi\u00f9 rapido per vedere con i propri occhi perch\u00e9 Laplace serve.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Il bello \u00e8 che la struttura del codice non cambia: aggiungere una classe vuol dire solo allungare la lista <code>train<\/code>, e tutto il resto \u2014 vocabolario, conteggi, prior, regola di classificazione \u2014 si adatta da s\u00e9.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Con questo chiudiamo il filo bayesiano che abbiamo dipanato di articolo in articolo: dalla <a href=\"https:\/\/www.gironi.it\/blog\/conversion-rate-bayesiano\/\">stima di un conversion rate<\/a> al confronto fra varianti, dall&#8217;allocazione adattiva del traffico fino a quest&#8217;ultimo salto, dal decidere al classificare. Lo stesso teorema, riproposto ogni volta in una veste diversa, si \u00e8 rivelato un filo conduttore sorprendentemente robusto. Da qui in avanti la strada si biforca verso il machine learning in senso pieno \u2014 gli alberi decisionali, la regressione logistica, le reti \u2014 dove i metodi rinunciano alle ipotesi pi\u00f9 comode in cambio di potenza, e dove Bayes resta sullo sfondo come la grammatica con cui, in fondo, si impara sempre dai dati.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"per-approfondire\">Per approfondire<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se vuoi passare dal Naive Bayes al machine learning vero e proprio restando con i piedi per terra (e con R sotto mano), <a href=\"https:\/\/www.amazon.it\/dp\/1461471370?tag=consulenzeinf-21\" rel=\"nofollow sponsored noopener\" target=\"_blank\"><em>An Introduction to Statistical Learning<\/em><\/a> di James, Witten, Hastie e Tibshirani \u00e8 il testo che consiglio. \u00c8 la porta d&#8217;ingresso pi\u00f9 accessibile al machine learning applicato: spiega classificazione, alberi e regressione con il rigore giusto ma senza matematica intimidatoria, e ogni capitolo ha laboratori in R che si possono rifare passo passo. La seconda edizione dedica spazio proprio al Naive Bayes, cos\u00ec il salto da questo articolo al resto del percorso \u00e8 naturale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo articolo fa parte del percorso <a href=\"https:\/\/www.gironi.it\/blog\/approccio-bayesiano\/\">\u00abL&#8217;approccio bayesiano\u00bb<\/a>, la guida ragionata agli articoli su statistica e inferenza bayesiana applicate alla SEO.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nell&#8217;articolo sul multi-armed bandit abbiamo usato Bayes per decidere fra varianti: spostare il traffico verso quella che converte di pi\u00f9 mentre il test \u00e8 ancora in corso. Adesso facciamo un passo di lato, restando per\u00f2 nello stesso impianto di ragionamento: invece di scegliere fra opzioni, vogliamo classificare, cio\u00e8 attaccare a ogni nuova osservazione l&#8217;etichetta pi\u00f9 &hellip; <a href=\"https:\/\/www.gironi.it\/blog\/naive-bayes-intento-ricerca\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Naive Bayes: classificare l&#8217;intento delle query con il teorema di Bayes&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[629],"tags":[],"class_list":["post-3901","post","type-post","status-publish","format-standard","hentry","category-statistica-it"],"lang":"it","translations":{"it":3901,"en":3902},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Paolo Gironi","author_link":"https:\/\/www.gironi.it\/blog\/author\/autore-articoli\/"},"uagb_comment_info":0,"uagb_excerpt":"Nell&#8217;articolo sul multi-armed bandit abbiamo usato Bayes per decidere fra varianti: spostare il traffico verso quella che converte di pi\u00f9 mentre il test \u00e8 ancora in corso. Adesso facciamo un passo di lato, restando per\u00f2 nello stesso impianto di ragionamento: invece di scegliere fra opzioni, vogliamo classificare, cio\u00e8 attaccare a ogni nuova osservazione l&#8217;etichetta pi\u00f9&hellip;","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/comments?post=3901"}],"version-history":[{"count":3,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3901\/revisions"}],"predecessor-version":[{"id":3937,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3901\/revisions\/3937"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=3901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=3901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=3901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}