Perché n-gram viene utilizzato nell'identificazione della lingua del testo anziché nelle parole?


12

In due famose librerie di identificazione linguistica, Compact Language Detector 2 per C ++ e rivelatore di lingua per Java, entrambi utilizzavano n-grammi (basati sui caratteri) per estrarre funzionalità di testo. Perché un bag-of-word (parola singola / dizionario) non viene utilizzato e qual è il vantaggio e lo svantaggio di bag-of-word e n-grammi?

Inoltre, quali altri usi del modello n-grammi nella classificazione del testo?

Oh oops. Sembra che ci sia una domanda simile qui: riguardo all'uso del modello bigram (N-grammo) per costruire il vettore di funzioni per il documento di testo

Ma qualcuno può dare una risposta più completa? Qual è il migliore nel caso dell'identificazione della lingua?

(Spero di aver capito bene il significato di n-grammi e bag-of-word, ahah, se no, per favore, aiutami.)

Risposte:


20

Penso che le risposte più dettagliate si possano trovare nel vasto lavoro di Mehryar Mohri sull'argomento. Ecco un link ad una delle sue diapositive della lezione sull'argomento: http://www.cims.nyu.edu/~mohri/amls/lecture_3.pdf

Il problema del rilevamento del linguaggio è che il linguaggio umano (parole) ha una struttura. Ad esempio, in inglese, è molto comune che la lettera "u" segua la lettera "q", mentre ciò non è il caso dell'arabo traslitterato. Gli n-grammi funzionano catturando questa struttura. Pertanto, alcune combinazioni di lettere sono più probabili in alcune lingue rispetto ad altre. Questa è la base della classificazione n-gram.

Il bag-of-word, d'altra parte, dipende dalla ricerca in un dizionario di grandi dimensioni e essenzialmente dalla corrispondenza dei modelli. Ci sono due principali inconvenienti qui: 1) ogni lingua dovrebbe avere un vasto dizionario di parole su file, che richiederebbe un tempo relativamente lungo per la ricerca, e 2) il bag-of-word fallirà se nessuna delle parole in il set di addestramento è incluso nel set di test.

Supponendo che tu stia usando i bigrammi (n = 2) e ci siano 26 lettere nel tuo alfabeto, quindi ci sono solo 26 ^ 2 = 676 possibili bigrammi per quell'alfabeto, molti dei quali non accadranno mai. Pertanto, il "profilo" (per usare le parole del rivelatore di lingua) per ogni lingua necessita di un database molto piccolo. Un classificatore bag-of-word, d'altra parte, avrebbe bisogno di un dizionario completo per OGNI lingua per garantire che una lingua possa essere rilevata in base alla frase che è stata pronunciata.

Quindi in breve: ogni profilo di lingua può essere rapidamente generato con uno spazio di funzionalità relativamente ridotto. È interessante notare che n-grammi funziona solo perché le lettere non sono disegnate in una lingua - questo è esplicitamente leva.

Nota: l'equazione generale per il numero di n-grammi per le parole è l ^ n dove l è il numero di lettere dell'alfabeto.


Immagino che per alcune lingue vicine, sarebbe utile usare elenchi di parole oltre a n-grammi. Ho visto, a volte, un testo norvegese claasificato come danese. Dubito che n-grammi sia un buon modo per distinguere queste due lingue.
kjetil b halvorsen,

Grazie per la tua risposta dettagliata. Tuttavia, ho alcune domande al riguardo, in primo luogo potresti spiegare "il bag-of-word fallirà se nessuna delle parole nel set di addestramento è inclusa nel set di test"? e in secondo luogo, perché CLD2 utilizza 4 grammi, il che comporterà 456976 voci per la lingua inglese, quando l'utilizzo di un metodo di dizionario può comportare circa la metà delle dimensioni del profilo ( oxforddictionaries.com/words/… )?
dennis97519,

1
@ dennis97519 re: "bag-of-words ..." Supponiamo che il tuo dizionario sia composto solo dalle parole {"cane", "gatto", "tartaruga", "animale"} per inglese e {"perro", "gato" , "tortuga", "animal"} per lo spagnolo. Il tuo dizionario non sarebbe in grado di classificare la seguente frase: "Un asino è un animale" perché la parola "animale" appare in entrambi i dizionari, ma non esistono altre parole. Questo è un esempio estremo. Ri 4 grammi: 1) Ricorda che hai bisogno di un dizionario per ogni lingua, 2) gli n-grammi tendono ad essere sparsi (ricerca più veloce) e 3) come ha detto Dougal, possono essere rappresentati in pochi byte.
justanotherbrain,

1
@loretoparisi - Esistono due compromessi: il primo è tra la complessità del modello (N grande = più complesso) e l'errore di generalizzazione (quanto bene si fa su alcuni set di test) - non si vuole esagerare. Il secondo compromesso è la complessità computazionale. La complessità della memoria aumenta in modo esponenziale con N. La formazione è in genere lineare con il numero di parole nel testo, quindi avere un testo molto lungo di solito non è un problema. Detto questo, il testo di grandi dimensioni spesso significa più parole nel dizionario D. Quindi, di nuovo, la complessità della memoria è O (D ^ N). In pratica, di solito è meglio usare una N più grande possibile dal punto di vista computazionale.
justanotherbrain,

1
@loretoparisi - In seguito, come detto prima, gli N-grammi tendono ad essere scarsi, ma questo non è sempre vero. Se è scarso per il tuo particolare testo, allora la convalida incrociata con N diverso è l'approccio migliore per trovare N ottimale (di nuovo, con vincoli computazionali).
justanotherbrain,

3

La lettera N-grammi viene utilizzata al posto delle parole per diversi motivi:

1) L'elenco delle parole necessarie per una determinata lingua è abbastanza grande, forse 100.000 se si considera veloce, più veloce, più veloce, a digiuno, digiuni, digiuno, ... come tutte le parole diverse. Per 80 lingue, sono necessarie circa 80 volte il numero di parole, occupando molto spazio: oltre 50 megabyte.

2) Il numero di trigrammi di lettere per un alfabeto di 26 lettere è 26 ** 3 o circa 17.000 e per i quadgrammi (N = 4) circa 450.000 che coprono TUTTE le lingue usando quell'alfabeto. Numeri simili ma un po 'più grandi per N-grammi in alfabeti più grandi di 30-100 caratteri. Per le lingue CJK con oltre 4000 lettere nello script Han, sono sufficienti unigrammi (N = 1). Per alcuni script Unicode, esiste solo una lingua per script (greco, armeno), quindi non sono necessarie combinazioni di lettere (cosiddetti nil-grammi N = 0)

3) Con le parole, non hai alcuna informazione quando ti viene data una parola che non è nel dizionario, mentre con la lettera N-grammi spesso hai almeno alcune utili combinazioni di lettere all'interno di quella parola.

CLD2 utilizza quadgrammi per la maggior parte degli script Unicode (alfabeti) tra cui latino, cirillico e arabo, unigrammi per gli script CJK, nilgrammi per altri script e include anche un numero limitato di parole complete abbastanza distintive e abbastanza comuni e coppie di parole per distinguere all'interno di gruppi difficili di lingue statisticamente simili, come indonesiano e malese. Le lettere bigram e trigrammi sono forse utili per distinguere tra un piccolo numero di lingue (circa otto, vedi https://docs.google.com/document/d/1NtErs467Ub4yklEfK0C9AYef06G_1_9NHL5dPuKIH7k/edit), ma sono inutili per distinguere dozzine di lingue. Pertanto, CLD2 utilizza i quadgrammi, associando a ciascuna combinazione di lettere le prime tre lingue più probabili usando quella combinazione. Ciò consente di coprire 80 lingue con circa 1,5 MB di tabelle e 160 lingue in modo più dettagliato con circa 5 MB di tabelle.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.