Rilevare la lingua di un testo, e perché i testi brevi falliscono
Pubblicato il 14/08/2026 · 16 min di lettura · Strumenti testo e lingua
Daniel Okonkwo — Sviluppatore front-end e redattore Tech presso Allin
Performance web · Formati di file
Verificato su 3 fonti
Lo strumento lavora in quattro fasi. Prima conta le lettere in undici intervalli di scritture Unicode, e se più del 30% del testo cade in uno di essi l'alfabeto risolve la questione da solo — coreano, kana, han, greco, arabo, ebraico, devanagari, thai, armeno e georgiano non hanno bisogno di statistica. Il cirillico riceve una seconda ipotesi dentro la propria famiglia. Il testo latino incontra una soglia: sotto le dodici lettere lo strumento rifiuta di rispondere e lo dice. Sopra, affida il testo a un modello di trigrammi ristretto alle lingue di scrittura latina, poi risolve i quasi pari con liste di parole funzionali e schemi ortografici per lingua. La soglia è stata misurata e tiene: dodici troncature su dodici a dieci e undici lettere sono state rifiutate. Il problema è che sopra di essa lo strumento non rifiuta mai più. Alimentato con 90 frasi brevi che la gente incolla davvero — saluti, formule di chiusura, conferme d'ordine — nelle sei lingue di questo sito, ha risposto a tutte e 90 e ne ha indovinate 68: il 76% in totale, il 64% nella fascia da dodici a quindici lettere. Nove dei ventidue errori sono tornati con il 75% di fiducia o più e quattro con esattamente il 100%: una chiusura francese letta come italiano, uno stato d'ordine spagnolo letto come italiano, una conferma portoghese letta come spagnolo e un congedo tedesco letto come indonesiano. Il numero di fiducia è calcolato dallo scarto rispetto al secondo, quindi misura la separazione fra i candidati, non se il vincitore sia giusto. Su prosa continua il quadro è molto migliore: su 348 troncature di 24 frasi, l'accuratezza è dell'85-93% fra quindici e trenta lettere e di 200 su 201 sopra le quaranta. Considera tutto ciò che sta sotto le quaranta lettere circa come un suggerimento e leggi i secondi classificati.
Misurato, non affermato: 90 frasi brevi reali in sei lingue, nessuna rifiutata e 68 giuste — il 76%, che scende al 64% sotto le sedici lettere. Quattro delle risposte sbagliate sono tornate con il 100% di fiducia.
Che cosa fa davvero lo strumento, in quattro fasi
La fase uno è l'alfabeto, ed è il segnale affidabile più economico che esista. Il codice tiene undici espressioni regolari su blocchi Unicode — hangul, kana, han, cirillico, greco, arabo, ebraico, devanagari, thai, armeno e georgiano — conta quante lettere del testo cadono in ciascuno, e se uno di essi prende più del 30% delle lettere risponde subito. Nessun modello di trigrammi fa meglio, ed è per questo che una riga di giapponese o di greco torna con fiducia massima a partire da quattro o cinque caratteri, ben sotto la soglia che vale per il testo latino.
La fase due è quella soglia: dodici lettere. Non dodici caratteri — il codice conta le lettere con una proprietà Unicode, quindi cifre, spazi e punteggiatura non aiutano. Sotto le dodici non restituisce nulla e l'interfaccia dice che il testo è troppo breve. È questa la parte che funziona, provata troncando frasi parola per parola: a dieci e undici lettere, dodici input su dodici sono stati rifiutati.
La fase tre è un modello di trigrammi. Taglia il testo in sequenze sovrapposte di tre caratteri e ne confronta le frequenze con un profilo memorizzato per ogni lingua; vince la lingua il cui profilo è più vicino. È l'approccio classico al problema ed è davvero buono sui paragrafi, perché schemi di tre lettere come «ent», «ung», «ção» e «gli» si distribuiscono in modo molto diverso fra le lingue. È debole sui frammenti per una ragione ovvia: una frase di tre parole dà una dozzina di trigrammi, e una dozzina di campioni non identifica una distribuzione.
La fase quattro è uno spareggio, e nient'altro. I candidati il cui punteggio di trigrammi sta entro 0,4 dal capofila vengono riordinati con due indizi in più: liste di parole funzionali scritte a mano, ogni parola pesata da uno diviso il numero di liste in cui compare e scartata se compare in più di tre, e un'espressione regolare per lingua che cattura ortografie quasi decisive — ß e sch per il tedesco, ñ e il punto interrogativo rovesciato per lo spagnolo, ã, nh e lh per il portoghese, gli e zione per l'italiano. Applicato globalmente questo peggiorava i risultati, perché «du» appartiene insieme al francese, al tedesco e allo svedese. Ristretto ai candidati che i trigrammi hanno già pareggiato, risolve le confusioni che contano.
Dove comincia a sbagliare, misurato
Sono state eseguite due prove. La prima ha troncato 24 frasi — quattro in ciascuna delle sei lingue di questo sito — a ogni confine di parola, dando 348 input da sei lettere fino a circa novanta. I risultati per fascia: tutto ciò che stava a dieci e undici lettere è stato rifiutato; da dodici a quattordici lettere, 92%; da quindici a diciannove, 85%; da venti a ventiquattro, 85%; da venticinque a ventinove, 93%; da trenta a trentanove, 96%; e sopra le quaranta lettere, 200 su 201. Il punto in cui una frase diventava giusta e restava giusta aveva una mediana di quindici lettere, ma il caso peggiore arrivava a quarantasei: una frase portoghese che inizia con «Ela abriu a janela porque o quarto» veniva letta come spagnolo, con il 100% di fiducia a ventuno lettere, e così fino a quarantacinque.
La seconda prova è quella che conta, perché è fatta di ciò che la gente incolla davvero: 90 frasi brevi nelle sei lingue — saluti, formule di chiusura, conferme d'ordine, messaggi d'errore, «in allegato trovi» — da dodici a trentaquattro lettere. Nemmeno una è stata rifiutata. Sessantotto erano giuste: il 76% in totale, il 64% nella fascia dodici-quindici, il 78% da sedici a diciannove, l'82% da venti a ventiquattro. Sul materiale che a questo strumento viene dato più spesso, circa una risposta su quattro è sbagliata.
Gli errori non se ne vergognano. «Merci beaucoup», tredici lettere, torna come indonesiano con il 100% di fiducia. «Bis Montag dann» torna come indonesiano al 100%. «À lundi prochain» e «Tu pedido ha salido» tornano entrambi come italiano al 100%. «Encomenda confirmada» torna come spagnolo al 100%. «Buenos días a todos» torna come portoghese al 91%. Nove dei ventidue errori erano al 75% o sopra, cioè nella fascia che l'interfaccia colora di verde.
La fiducia misura la separazione, non la correttezza
La percentuale accanto alla risposta non è una probabilità di essere giusta, e leggerla così è il modo principale in cui questo strumento inganna. È calcolata dallo scarto relativo fra il punteggio del vincitore e quello del secondo, moltiplicato per tre e traslato: uno scarto ampio dà 100%, uno stretto dà qualcosa intorno al 45%, e il tutto è limitato fra 35% e 100%.
Significa che una risposta sicura è quella a cui nessun'altra lingua si è avvicinata, non una che sia probabilmente giusta. Su «Bis Montag dann» nulla si è avvicinato all'indonesiano, quindi lo strumento ha stampato 100% e ha sbagliato. D'altra parte significa anche che i numeri bassi informano nella direzione giusta: quando lo strumento dice 46%, il secondo candidato è davvero competitivo e spesso corretto, e l'interfaccia fa la cosa onesta elencando i secondi classificati sotto con le loro barre.
La regola di lettura è dunque semplice e ribalta l'istinto abituale. Una barra verde su un testo lungo è affidabile. Una barra verde su tre parole ti dice soltanto che il modello non era combattuto, cosa che su tre parole raramente è altrimenti. Sotto le quaranta lettere circa, guarda il secondo candidato prima di credere al primo.
Diciannove lingue che lo strumento elenca e non può mai rispondere
Questo è il difetto strutturale, ed è invisibile dall'interfaccia. Il codice tiene un elenco di trentacinque lingue a scrittura latina che chiede al modello di trigrammi di considerare, e una tabella di cinquantadue nomi di lingua scritti nella lingua stessa, pronti da stampare. Il modello di trigrammi, franc-min, ha profili solo per quarantaquattro lingue a scrittura latina, e diciassette delle trentacinque richieste sono fra queste. Le altre diciotto vengono scartate in silenzio, insieme al macedone sul lato cirillico.
Diciannove dei cinquantadue nomi di quella tabella non possono dunque mai essere la risposta: danese, norvegese bokmål, finlandese, slovacco, sloveno, lituano, lettone, estone, catalano, basco, galiziano, afrikaans, malese, albanese, gallese, irlandese, islandese, esperanto e macedone. Incolla del danese e non ottieni «non so»: ottieni altro, con sicurezza. «Jeg vil gerne bestille en kop kaffe og et stykke kage, tak.» torna come neerlandese al 75%. La versione norvegese della stessa frase torna anch'essa come neerlandese, al 48%. La versione svedese è corretta, perché lo svedese è uno dei diciassette.
Il ramo cirillico ha una versione più mite dello stesso problema. Sei delle sette lingue che considera esistono davvero nel modello, quindi il russo e l'ucraino escono giusti, ma la seconda ipotesi dentro una famiglia resta un'ipotesi: «Здравейте, как сте?» è bulgaro e torna come russo all'85%. La fase della scrittura ha indovinato la scrittura e la fase della famiglia ha sbagliato lingua, che è il riassunto onesto di ciò che il riconoscimento per alfabeto può e non può fare.
Parole isolate, cugini stretti, nomi propri e cose che non sono prosa
Una parola isolata che appartiene a più lingue è trattata correttamente, e per caso. «information» ha undici lettere, «important» nove, «national» otto — tutte sotto la soglia di dodici lettere, quindi lo strumento rifiuta tutte e tre, che è la risposta giusta per una parola che è davvero insieme inglese e francese. Incatenale in «innovation, information, important» e superi la soglia a trenta lettere: la risposta è inglese al 46%, col francese che ottiene esattamente lo stesso punteggio di trigrammi, 1,00 contro 1,00, e solo lo spareggio a separarli. Il numero basso è lo strumento che ti dice la verità.
Le coppie di lingue vicine si comportano esattamente come la letteratura prevede: bene sulle frasi, disperatamente sui frammenti. Sei frasi complete in spagnolo e portoghese sono state tutte identificate correttamente, compresa la coppia quasi minima «Es importante para todos.» e «É importante para todos.», separate da un solo accento. Accorciale e tutto crolla: «Pedido confirmado» è letto come portoghese al 95%, «Encomenda confirmada» come spagnolo al 100%, «Buenos días a todos» come portoghese al 91%. Danese e norvegese fanno di peggio che confondersi, qui: nessuno dei due può essere restituito.
Un nome proprio da solo è il caso più chiaro di uno strumento che risponde a una domanda a cui non può rispondere. «Emmanuel Macron» torna come tagalog al 100%. «Jean-Baptiste Poquelin» torna come neerlandese al 100%. «Wolfgang Amadeus Mozart» torna come tagalog al 79%. «Antonio Vivaldi» torna come italiano al 100%, giusto per fortuna e non per prove. Un nome non porta grammatica e quasi nessuna parola funzionale; il modello di trigrammi confronta schemi di lettere senza null'altro su cui appoggiarsi.
Lo stesso vale per tutto ciò che non è prosa continua. Una riga di SQL torna come inglese al 100%, il che è difendibile visto che le sue parole chiave sono parole inglesi. Una riga di JavaScript torna come portoghese al 58%. Un frammento di HTML — un div con un attributo di classe che avvolge uno span contenente la parola Hello — torna come spagnolo al 91%. Un URL torna come portoghese al 71%, un indirizzo postale francese come spagnolo al 49%, le prime dodici lettere dell'alfabeto come neerlandese al 100%, e sedici lettere a di seguito come neerlandese al 61%. Nessuna fase del processo chiede se l'input sia lingua; l'unico filtro è il conteggio delle lettere.
Testo misto, accenti e come usare l'aggeggio
Un testo plurilingue riceve una sola risposta, ed è la lingua maggioritaria anziché un avviso. «Hello, merci beaucoup for your quick reply.» torna come inglese al 100%. «Bonjour, I would like to confirm notre réunion de demain matin à dix heures.» torna come francese al 67%, con l'inglese secondo a 0,93 contro 1,00 — abbastanza vicino perché l'elenco dei secondi ti dica qualcosa. Se il tuo testo è un'e-mail bilingue o una riga di memoria di traduzione, dividilo prima di chiedere.
Un'aspettativa si è rivelata falsa, e vale la pena annotarlo. Togliere ogni accento da una frase sembra dover distruggere il rilevatore, dato che lo spareggio si appoggia su ñ, ã, ß, ç e simili. Non è così. Cinque frasi lunghe sono state ridotte ad ASCII puro e tutte e cinque sono tornate con la stessa lingua e la stessa fiducia del 100%: il modello di trigrammi decideva già, e la tabella ortografica prende la parola solo quando il modello è combattuto. Gli accenti contano per i casi brevi, e i casi brevi erano già inaffidabili.
Quindi: dagli un paragrafo. Tre o quattro frasi complete della stessa lingua ti portano sopra le quaranta lettere con margine, e sopra le quaranta lettere ha avuto ragione su 200 input su 201. Se hai solo un frammento, leggi i secondi classificati, e considera senza risposta un nome, un indirizzo, un URL o una riga di codice, qualunque percentuale compaia accanto. E se la risposta che ti aspetti è danese, norvegese, finlandese, catalano, basco, galiziano, islandese o una delle altre dodici di quell'elenco, nessuna quantità di testo la produrrà.
| Input | Risposta | Corretto? |
|---|---|---|
| Merci beaucoup — 13 lettere, francese | Indonesiano, 100% | No — e nulla vi si è avvicinato, da cui il 100 |
| Bis Montag dann — 13 lettere, tedesco | Indonesiano, 100% | No — troppo pochi trigrammi perché il modello veda il tedesco |
| Encomenda confirmada — 19 lettere, portoghese | Spagnolo, 100% | No — il classico crollo spagnolo/portoghese su un frammento |
| information — 11 lettere | Rifiutato: troppo breve | Sì — la parola è insieme inglese e francese; rifiutare è la risposta giusta |
| Emmanuel Macron — 14 lettere, un nome | Tagalog, 100% | Senza risposta — un nome non porta grammatica né quasi parole funzionali |
| Una frase danese sull'ordinare caffè e torta | Neerlandese, 75% | No — il danese è uno dei diciannove nomi che lo strumento elenca e non può mai restituire |
| Le prime dodici lettere dell'alfabeto | Neerlandese, 100% | No — esattamente dodici lettere superano la soglia, e nient'altro viene controllato |
| Un frammento di HTML attorno alla parola Hello | Spagnolo, 91% | Senza risposta — nessuna fase chiede se l'input sia lingua |
| Una frase francese completa di 67 lettere | Francese, 100% | Sì — sopra le quaranta lettere ha avuto ragione su 200 input su 201 |
Domande frequenti
- Quanto testo gli serve davvero?
- Circa quaranta lettere di prosa continua, cioè tre o quattro proposizioni. La soglia scritta nel codice è di dodici lettere, sotto le quali rifiuta seccamente, e quella parte funziona: dodici troncature su dodici a dieci e undici lettere sono state rifiutate. Fra dodici e quaranta lettere risponde sempre e sbaglia spesso — su 348 troncature di 24 frasi, l'accuratezza è stata del 92% a dodici-quattordici lettere, dell'85% da quindici a ventiquattro, del 93% da venticinque a ventinove, del 96% da trenta a trentanove, e di 200 su 201 sopra le quaranta. Su frasi brevi autonome anziché su frasi troncate è ancora peggio: 68 giuste su 90, nessuna rifiutata. Una frase completa di solito basta e un paragrafo abbonda; un saluto no.
- Perché ha detto 100% e ha sbagliato?
- Perché la percentuale non è una probabilità di essere giusta. Deriva dallo scarto relativo fra il punteggio del primo candidato e quello del secondo: uno scarto ampio dà 100, uno stretto circa 45, e il risultato è limitato fra 35 e 100. Una risposta sicura significa dunque che nessun'altra lingua si è avvicinata, non che la risposta sia probabilmente corretta. Su tredici lettere di tedesco, nessun'altra lingua si è avvicinata all'indonesiano, quindi ha stampato 100 e ha sbagliato. L'istinto abituale — numero alto uguale affidabile — è esattamente rovesciato su input brevi. Ciò per cui il numero serve davvero è il senso opposto: quando indica 46, il secondo è competitivo e spesso quello giusto, ed è proprio per questo che l'interfaccia elenca i secondi sotto.
- Dice neerlandese per il mio testo danese. È un errore?
- Sì, e strutturale. Il codice chiede al suo modello di trigrammi di considerare trentacinque lingue a scrittura latina, ma il modello — franc-min — ha profili solo per diciassette di esse. Le altre diciotto vengono scartate senza una parola, quindi danese, norvegese bokmål, finlandese, slovacco, sloveno, lituano, lettone, estone, catalano, basco, galiziano, afrikaans, malese, albanese, gallese, irlandese, islandese ed esperanto non possono mai essere la risposta, e nemmeno il macedone sul lato cirillico. Sono diciannove dei cinquantadue nomi che lo strumento è pronto a stampare. Una frase danese sull'ordinare caffè e torta è tornata come neerlandese al 75%, e la versione norvegese della stessa frase come neerlandese al 48%. Lo svedese funziona, perché è uno dei diciassette. Se la tua lingua è in quell'elenco, nessuna quantità di testo in più aiuterà.
- Distingue lo spagnolo dal portoghese, o il danese dal norvegese?
- Lo spagnolo dal portoghese sì, su una frase completa: sono state provate sei frasi complete e tutte e sei erano giuste, compresa la coppia quasi minima «Es importante para todos.» e «É importante para todos.», che differiscono per un accento. La fase di spareggio esiste soprattutto per questo — contiene schemi ortografici come ã, nh, lh e ção per il portoghese, e ñ e il punto interrogativo rovesciato per lo spagnolo. Sui frammenti fallisce: «Pedido confirmado» è stato letto come portoghese, «Encomenda confirmada» come spagnolo, entrambi al 95% o più. Il danese dal norvegese no, e non perché si somiglino: nessuna delle due lingue esiste nel modello sottostante, quindi entrambe tornano come neerlandese. Svedese e neerlandese sono le due lingue germaniche di quell'area che lo strumento può davvero nominare.
- Togliere gli accenti dal mio testo rompe il rilevamento?
- Su una frase completa no, cosa abbastanza sorprendente da meritare una prova. Cinque frasi lunghe in francese, spagnolo, portoghese, tedesco e italiano sono state ridotte ad ASCII puro e tutte e cinque sono tornate con la stessa lingua e la stessa fiducia del 100% di prima. La ragione sta nella forma del processo: gli schemi ortografici agiscono solo come spareggio, su candidati che il modello di trigrammi ha già valutato entro 0,4 l'uno dall'altro, e su una frase lunga il modello non è combattuto. Gli accenti pesano eccome sugli input brevi — ma gli input brevi erano già inaffidabili per altre ragioni, quindi il consiglio pratico non cambia. Se togli gli accenti per normalizzare una colonna in vista di una ricerca o di un ordinamento, rileva la lingua prima di spogliare, non dopo.
Articoli che potrebbero interessarti
Tutte le guide →Strumenti correlati
Tutto quanto segue descrive ciò che questi quattro strumenti fanno oggi, verificato eseguendo il loro stesso codice sugli input esatti riportati in ogni articolo, e non ciò che una norma imponga loro. Dove uno strumento sbaglia un caso, la cosa è scritta chiaramente anziché aggirata, e nulla è stato modificato perché un articolo si leggesse meglio. Due conseguenze. Esegui ogni trasformazione prima su una copia e confronta i due estremi: uno strumento di testo che cancella qualcosa non lo dice. E considera condiviso un segreto dal momento in cui lascia la pagina: incollarlo in una chat, in un ticket o in un repository lo brucia, per quanto bene sia stato generato.
Fonti
- wooorm (GitHub) — franc — the trigram language-detection library, and the reduced franc-min model this tool loads
- Unicode Consortium — UAX #24: Unicode Script Property — the block and script data behind alphabet detection
- SIL International — ISO 639-3 code tables — the three-letter language codes the tool returns
Hai notato un errore in questo articolo?