A seconda del caso, potresti essere interessato a utilizzare uno dei seguenti metodi:
Metodo 0: utilizza un'API o una libreria
Di solito, ci sono alcuni problemi con queste librerie perché alcune di esse non sono accurate per testi di piccole dimensioni, alcune lingue mancano, sono lente, richiedono una connessione a Internet, non sono libere, ... Ma in generale, soddisfano la maggior parte delle esigenze .
Metodo 1: modelli linguistici
Un modello linguistico ci dà la probabilità di una sequenza di parole. Questo è importante perché ci permette di rilevare in modo affidabile la lingua di un testo, anche quando il testo contiene parole in altre lingue (es: "'Hola' significa 'ciao' in spagnolo" ).
Puoi utilizzare N modelli linguistici (uno per lingua) per assegnare un punteggio al testo. La lingua rilevata sarà la lingua del modello che ti ha dato il punteggio più alto.
Se vuoi costruire un semplice modello di linguaggio per questo, sceglierei 1 grammo. Per fare questo, devi solo contare il numero di volte in cui ogni parola di un testo grande (es. Wikipedia Corpus in lingua "X") è apparsa.
Quindi, la probabilità di una parola sarà la sua frequenza divisa per il numero totale di parole analizzate (somma di tutte le frequenze).
the 23135851162
of 13151942776
and 12997637966
to 12136980858
a 9081174698
in 8469404971
for 5933321709
...
=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")
Se il testo da rilevare è abbastanza grande, consiglio di campionare N parole casuali e quindi utilizzare la somma dei logaritmi invece delle moltiplicazioni per evitare problemi di precisione in virgola mobile.
P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376
Metodo 2: insiemi intersecanti
Un approccio ancora più semplice consiste nel preparare N set (uno per lingua) con le M prime parole più frequenti. Quindi interseca il testo con ogni set. Il set con il maggior numero di incroci sarà la tua lingua rilevata.
spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...
text_set = {"hola", "means", "hello", "in", "spanish"}
spanish_votes = text_set.intersection(spanish_set)
english_votes = text_set.intersection(english_set)
czech_votes = text_set.intersection(czech_set)
...
Metodo 3: compressione zip
Questa è più una curiosità che altro, ma eccola qui ... Puoi comprimere il tuo testo (es. LZ77) e quindi misurare la distanza zip rispetto a un testo compresso di riferimento (lingua di destinazione). Personalmente non mi è piaciuto perché è più lento, meno accurato e meno descrittivo di altri metodi. Tuttavia, potrebbero esserci applicazioni interessanti per questo metodo. Per saperne di più: Alberi delle lingue e compressione