Cvičenie je zamerané na trénovanie štatistických modelov slovenského jazyka. V rámci cvičenia budú predstavené dostupné nástroje a techniky na tvorbu jazykových modelov. Pomocou sprístupnených textových korpusov realizujte trénovanie n-gramových modelov zvolenými metódami riešenia. Pomocou perplexity modelu vypočítajte kvalitu jazykových modelov. V závere cvičenia, v rámci moderovanej diskusie, predstavte svoje riešenie a dosiahnuté výsledky.
Ciele cvičenia sú nasledovné:
ngram-merge
. Všeobecne najznámejším a najpoužívanejším programovým balíkom na štatistické modelovanie jazyka je SRILM Toolkit, ktorá obsahuje množstvo prepracovaných nástrojov na estimáciu, evaluáciu, kombináciu, adaptáciu a tvorbu rôznych druhov jazykových modelov, ako aj ďalšie dodatočné nástroje na počítačové spracovanie prirodzeného jazyka. V rámci cvičenia využijeme manuály k vybraným nástrojom dostupné na webovej stránke SRILM:
http://www.speech.sri.com/projects/srilm/manpages/
Pri trénovaní modelov slovenského jazyka budeme vychádzať najmä z manuálov programových nástrojov ngram
, ngram-count
a ngram-merge
, dostupných na webovej stránke SRILM:
http://www.speech.sri.com/projects/srilm/manpages/ngram.1.html
http://www.speech.sri.com/projects/srilm/manpages/ngram-count.1.html
http://www.speech.sri.com/projects/srilm/manpages/ngram-merge.1.html
Prípad generovania n-gramových početností pomocou programového nástroja ngram-count
v SRILM je jednoduchý:
ngram-count –text train_0.dat –order 3 –sort –write train_0.counts
alebo
ngram-count –text train_0.dat –vocab wlist.vocab –order 3 –write train_0.counts
Vysvetlivky:
-text vstupný textový súbor; -order rád n-gramového modelu; -sort zoradenie n-gramových početností v lexikografickom poradí; -write vystupný súbor s n-gramovými početnosťami; -vocab vstupný zoznam slov reprezentujúci slovník.
Výstupné n-gramové početnosti sú základom pri tvorbe štatistických modelov jazyka a v prípade obmedzenia slovníkom wlist.vocab môžu výrazne redukovať nároky na pamäť v procese trénovania. Potom výstupný súbor s početnoťami trigramov train_0.counts
bude mať nasledujúci tvar:
word1 word2 word3 count
Úloha 1: Z dostupných korpusov textových dát train_0.dat, train_1.dat a train_2.dat vygenerujte súbory s početnosťami trigramov. Z programového balíka SRILM použite nástroj ngram-count
.
V prípadoch, kedy máme k dispozícii viacero rôznych textových korpusov je z dôvodu pamäťových nárokov v procese generovania n-gramových početností vhodnejšie vytvoriť samostatné súbory (train_0.counts
, train_1.counts
, train_2.counts
, ...) a tie následne pospájať do jedného výsledného súboru. V SRILM je na tento účel vytvorený programový nástroj ngram-merge
, ktorého jediným argumentom je názov vystupného súboru, do ktorého majú byť vstupné n-gramové početnosti pospájané a uložené.
ngram-merge –write output.counts train_0.counts train_1.counts train_2.counts ...
Vysvetlivky:
-write vystupný súbor s n-gramovými početnosťami.
Poznámka: Pri spájaní početností n-gramov musia byť všetky vstupné súbory (train_0.counts
, train_1.counts
, train_2.counts
, atď.) zoradené lexikograficky pomocou argumentu –sort
. Nie je potrebné zachovať rád n-gramu v jednotlivých súboroch s n-gramovými početnosťami.
Úloha 2: Zo súborov train_0.counts
, train_1.counts
a train_2.counts
vytvorte jeden súbor s početnosťami trigramov. Z programového balíka SRILM použite nástroj ngram-merge
.
Pri tvorbe jazykových modelov sa vychádza z predpokladu, že k dispozícii máme už vopred vygenerované n-gramové početnosti vopred zvoleného rádu n. Jednoduchý jazykový model môžeme tak natrénovať pomocou nasledujúcich argumentov:
ngram-count –read train_0.counts –vocab wlist.vocab -order 3 –sort -unk –lm train_0.srilm
Vysvetlivky:
-read načítanie súboru s n-gramovými početnosťami; -vocab vstupný zoznam slov reprezentujúci slovník; -order rád n-gramového modelu; -sort zoradenie n-gramových početností v lexikografickom poradí; -unk pri trénovaní jazykového modelu sa uvažuje s otvoreným slovníkom; -lm súbor s jazykovým modelom.
Výstupný súbor s jazykovým modelom train_0.srilm
bude v nasledujúcom formáte:
\data\
ngram 1=n1
ngram 2=n2
...
ngram N=nN
\1-grams:
p word1 [bow]
...
\2-grams:
p word1 word2 [bow]
...
\N-grams:
p word1 ... wordN
...
Úloha 3: Zo súborov train_0.counts
, train_1.counts
a train_2.counts
vytvorte (natrénujte) samostatné jazykové modely. Z programového balíka SRILM použite nástroj ngram-count
.
Medzi základné hodnotiace miery n-gramových modelov patrí perplexita (v angl. perplexity), alebo zložitosť jazykového modelu. Táto je pre postupnosť slov \(W\) daná pravdepodobnosťou \(P(W)\) tejto postupnosti a normalizovaná počtom \(N\) slov nasledovne:
$$ PPL_{W}=P(w_{1}w_{2}...w_{n})^{-1/N}.$$
Zo vzťahu je vidieť, že vysoká podmienená pravdepodobnosť postupnosti slov spôsobuje nízku perplexitu. Potom minimalizácia perplexity korpusu je ekvivalentná maximalizácii vierohodnosti funkcie, a tým úspešnosť rozpoznávania reči narastá. Perplexita modelu vychádza predovšetkým z konštrukcie samotného jazyka a mení sa v závislosti od veľkosti slovníka a pravidiel formovania slov do viet. Táto hodnotiaca miera však sama o sebe nemusí garantovať zlepšenie presnosti rozpoznávania systémom na automatické rozpoznávanie reči, pretože neberie do úvahy akustickú podobu slov, no zvyčajne s takýmto zlepšením koreluje.
Perplexitu jazykového modelu v SRILM je možné vypočítať veľmi jednoducho použitím príkazu:
ngram –debug 0 –ppl eval.dat –order 3 –lm train_0.srilm
Vysvetlivky:
-debug 0 zobrazená je výsledná perplexita modelu na celom korpuse testovacích dát; -debug 1 zobrazená je perplexita modelu pre každú vetu v testovacích dátach; -debug 2 zobrazená je perplexita modelu pre každú vetu v testovacích dátach a pravdepodobnosť slova v závislosti od jeho histórie pre zvolený rád n-gramu; -debug 3 zobrazená je výsledná hodnota pravdepodobnosti každého slova v kontexte n-gramu; -debug 4 zobrazené sú ďalšie podrobné štatistiky slov v jednotlivých vetách.
Potom výstup programu na štandardný výstup obrazovky (pri použití –debug 0
) bude vyzerať nasledovne:
file eval.dat: 3426 sentences, 41870 words, 567 OOVs
0 zeroprobs, logprob= -75835.7 ppl= 49.5963 ppl1= 68.5620
V prípade otvoreného slovníka (pri trénovaní n-gramového modelu bol použitý argument -unk
) bude výstup programu vyzerať približne takto:
file eval.dat: 3426 sentences, 41870 words, 0 OOVs
0 zeroprobs, logprob= -77136.9 ppl= 50.4606 ppl1= 69.5498
Okrem základných informácií o počte viet, slov a mimoslovníkových slov (z angl. out-of-vocabulary, skr. OOVs) v korpuse testovacích dát nás najviac zaujíma výsledná perplexita modelu, ktorú možno vyčítať z hodnoty ppl
. Hodnota ppl1
navyše udáva perplexitu modelu, ak pri hodnotení uvažujeme aj zo značkami začiatkov (<s>
) a koncov viet (</s>
).
Úloha 4: Kvalitu vytvorených jazykových modelov train_0.srilm
, train_1.srilm
a train_2.srilm
vyhodnoďte pomocou perplexity na testovacej množine eval.dat. Z programového balíka SRILM použite nástroj ngram
.
Keďže každý trénovací textový korpus je konečný, nemôže obsahovať všetky možné kombinácie slov. Nulový výskyt nepozorovaných javov potom vedie k chybám v rozpoznávaní, pretože môže nastať prípad, že rečník vysloví takú kombináciu slov, ktorá sa v danom trénovacom korpuse a jazykovom modeli vôbec nevyskytuje. Vyhladzovanie (z angl. smoothing) rieši tento problém rovnomernejším prerozdelením časti pravdepodobnosti pozorovaných n-gramov v trénovacích dátach medzi nepozorované n-gramy, zvýšením pravdepodobnosti nulových výskytov a výskytov s veľmi malou pravdepodobnosťou a následným znížením pravdepodobnosti pozorovaných javov s vysokou frekvenciou v dôsledku vety o úplnej pravdepodobnosti.
Vo všeobecnosti je možné metódy vyhladzovania zadeliť do dvoch základných skupín. K prvej skupine tzv. základných schém vyhladzovania patria metódy, ktoré sa snažia zvýšiť výskyt každého n-gramu v jazykovom o vhodné kladné číslo. Ako príklad je možné uviesť metódu aditívneho vyhladzovania Add-One (Laplaceovo pravidlo), ktorá v prípade n-gramového modelu, zvýši každému n-gramu výskyt o 1. Obdobným spôsobom je možné zvýšiť výskyt n-gramov o menej než 1, v intervale (0, 1). Takáto modifikácia sa označuje aj ako Add-\(δ\) (Lindstoneovo pravidlo), pričom výber koeficientu \(δ\) sa uskutočňuje zvyčajne dynamickým spôsobom. K základným schémam vyhladzovania možno zaradiť aj dobre známy Goodov-Turingov odhad, diskontný algoritmus, ktorý na odhad celkovej pravdepodobnosti všetkých nepozorovaných javov využíva početnosti tých javov, ktoré sa v celom korpuse vyskytujú práve raz.
Aj keď Goodov-Turingov odhad dosahuje v praxi často veľmi uspokojivé výsledky, nezahŕňa kombináciu modelov vyššieho rádu s modelmi nižšieho rádu. Takýto spôsob modifikácie parametrov jazykového modelu možno vykonať pomocou tzv. ústupových a interpolačných schém. Zatiaľ čo princíp vyhladzovania v ústupovej schéme spočíva v tom, že vyhladené odhady pravdepodobností sú určené buď z pôvodných relatívnych početností n-gramov, alebo z relatívnych početností (n-1)-gramov vážených pomocou tzv. ústupových váh (v angl. back-off weights), v prípade že vyššia (pôvodná) úroveň mala nulovú hodnotu, v interpolačnej schéme sú pri výpočte odhadov podmienených pravdepodobností vyšších úrovní použité vždy vážené kombinácie všetkých n-gramov nižšej úrovne. Z najbežnejšie používaných algoritmov vyhladzovania obsiahnutých v ústupových a interpolačných schémach možno spomenúť Katzov diskontný model, model s absolútnym a lineárnym diskontom, Wittenov-Bellov model, Kneserov-Neyov model a jeho modifikácie. Pri modelovaní slovenského jazyka sa najviac osvedčil Wittenov-Bellov algoritmus v ústupovej schéme.
V SRILM môžeme proces trénovania jazykového modelu s vyhladzovaním unigramov, bigramov a trigramov pomocou Wittenovho-Bellovho algoritmu zapísať v nasledujúcom tvare:
ngram-count –read train_0.counts –vocab wlist.vocab –order 3 –sort -wbdiscount1 -wbdiscount2 -wbdiscount3 -lm train_0_wbs.srilm
Vysvetlivky:
-read načítanie súboru s n-gramovými početnosťami; -vocab vstupný zoznam slov reprezentujúci slovník; -order rád n-gramového modelu; -sort zoradenie n-gramových početností v lexikografickom poradí; -wbdiscountn vyhladzovanie modelu podľa Wittenovho-Bellovho algoritmu a pre zvolený rád n použitého n-gramového modelu, na ktorý ma byť vyhladzovanie aplikované; -lm súbor s jazykovým modelom.
Je vhodné poznamenať, že v prípade, ak nebude definované vyhladzovanie jazykového modelu pre bigramy, trigramy, príp. n-gramy vyššieho rádu, použije sa vyhladzovanie pomocou Goodovho-Turingovho odhadu.
-addsmoothn delta aditívne vyhladzovanie jazykového modelu pre zvolený koeficient delta a rád n použitého n-gramového modelu, na ktorý má byť vyhladzovanie aplikované; -gtn gtn.params vyhladzovanie jazykového modelu pomocou Goodovho-Turingovho algoritmu pre zvolený rád n použitého n-gramého modelu a parametre vyhladzovania zapísané v súbore gtn.params (informácie k súboru gtn.params nájdete v manuáli ngram-count na webovej stránke SRILM); -ndiscountn vyhladzovanie jazykového modelu podľa Ristadovho pravidla a pre zvolený rád n použitého n-gramového modelu, na ktorý ma byť vyhladzovanie aplikované; -ukndiscountn vyhladzovanie jazykového modelu podľa pôvodného Kneserovho-Neyovho algoritmu a pre zvolený rád n použitého n-gramového modelu; -kndiscountn vyhladzovanie jazykového modelu podľa modifikovaného Kneserovho-Neyovho algoritmu a pre zvolený rád n použitého n-gramového modelu.
Úloha 5: Pri trénovaní jazykových modelov train_0.srilm
, train_1.srilm
a train_2.srilm
aplikujte jednu z techník vyhladzovania jazykových modelov. Z programového balíka SRILM použite nástroj ngram-count
. Po natrénovaní jazykových modelov vypočítajte ich perplexitu. Sledujte vplyv jednotlivých techník vyhladzovania na kvalitu jazykových modelov.
Hlavným problémom rozsiahlych korpusov textových dát je ich tematická rôznorodosť. V úlohách doménovo-orientovaného rozpoznávania plynulej reči častokrát takýto typ dát vnáša do procesu dekódovania reči mnoho nejednoznačností, ktoré sú spôsobené nadhodnotením aj takých odhadov pravdepodobnosti n-gramov, ktoré typicky s danou oblasťou rozpoznávania nesúvisia. Z tohto dôvodu je žiaduce znížiť tieto mimodoménové odhady pravdepodobnosti na úroveň, ktorá posilní štatistiky vnútrodoménových slov a rozšíri štatistiky o také slovné spojenia, ktoré sa v rámci domény môžu vyskytovať len raz alebo s veľmi malou pravdepodobnosťou. Takýto spôsob modifikácie pôvodných odhadov pravdepodobností jednotlivých n-gramových početností v procese trénovania jazykového modelu, alebo na úrovni modelu, možno uskutočniť kombináciou viacerých čiastkových doménovo-orientovaných jazykových modelov s následnou adaptáciou na vybranú tému. Medzi najviac používané metódy kombinácie modelov, ktoré sa osvedčili aj pri tvorbe modelov slovenského jazyka patria metódy vychádzajúce z lineárnej interpolácie jazykových modelov s následnou adaptáciou využívajúcu metódy minimalizácie perplexity modelu na množine odložených dát.
V prípade lineárnej interpolácie dvoch jazykových modelov v SRILM môžeme písať:
ngram –lm train_0.srilm –lambda 0.2 –mix-lm train_1.srilm –write-lm interpolated_0_1.srilm
V prípade lineárnej interpolácie viacerých n-gramových modelov zápis bude mať nasledujúci tvar:
ngram –lm train_0.srilm –lambda 0.2 –mix-lm train_1.srilm –mix-lm2 train_2.srilm -mix–lambda2 0.3 –write-lm interpolated_0_1_2.srilm
Vysvetlivky:
-lm súbor so základným jazykovým modelom; -mix-lm súbor s ďalším jazykovým modelom; -mix-lmn súbor s n-tým jazykovým modelom v poradí; -lambda koeficient lambda (interpolačná váha) pre základný jazykový model; -mix-lambdan koeficient lambda (interpolačná váha) pre n-tý jazykový model v poradí; -write-lm zapíše jazykový model do výstupného súboru.
Poznámka: Hodnoty interpolačných váh musia byť v intervale (0-1), pričom ich súčet nesmie prekročiť hodnotu 1. Hodnota interpolačnej váhy pre jazykový model train_0.srilm
je dopočítaná automaticky do hodnoty 1.
Úloha 6: Vytvorte lineárne interpolovanú verziu jazykového modelu z doposiaľ natrénovaných modelov train_0.srilm
, train_1.srilm
a train_2.srilm
. Z programového balíka SRILM použite nástroj ngram
. Zvoľte optimálne hodnoty interpolačných váh tak, aby perplexita výsledného modelu bola čo najnižšia. Vypočítajte perplexitu lineárne interpolovaného modelu. Sledujte vplyv interpolačných váh na kvalitu jazykového modelu.
Keďže jazykové modely v systémoch na automatické rozpoznávanie reči sú typicky trénované na stovkách miliónov, resp. miliárd slov, nekomprimovaný model v praxi nadobúda porovnateľnú veľkosť s množstvom dát, na ktorých je trénovaný, pričom táto veľkosť kladie vysoké pamäťové nároky na jeho uchovávanie, a proces dekódovania sa tak stáva časovo náročným. Cieľom prerezávania je redukovať veľkosť n-gramového modelu odstránením explicitných odhadov pravdepodobností z modelu, s ohľadom na čo najmenšiu degradáciu v perplexite modelu a presnosti systému na automatické rozpoznávanie reči. Prerezávanie môže byť tak použité pri návrhu kompaktného a účinného jazykového modelu.
Z najznámejších metód prerezávania modelu možno spomenúť prerezávanie založené na relatívnej entropii (z angl. relative entropy-based pruning), kde sa vychádza z predpokladu, že ak sa určitý n-gram v jazykovom modeli nevyskytuje, model tento odhad pravdepodobnosti nahrádza odhadom pravdepodobnosti vyhladeného (n-1)-gramu namiesto pôvodného odhadu. Ak odhad vyhladenej pravdepodobnosti je blízky pôvodnému odhadu (je rovný alebo nižší ako vopred stanovený prah), nie je potrebné pôvodný odhad uchovávať. Ako vhodné kritérium na určenie takejto odchýlky sa javí napr. minimalizácia vzdialenosti pomocou Kullbackovej-Leiblerovej vzdialenosti, ktorá bola použitá aj v prerezávaní založenom na relatívnej entropii.
V SRILM je entropicky-založené prerezávanie definované argumentom -prune
, a to nasledovným spôsobom:
ngram –lm train_0.srilm –prune 1e-10 –write-lm pruned_0.srilm
kde 1e-10
predstavuje hodnotu prahu. Všeobecne sa prahové hodnoty pohybujú v rozmedzí: 1e-9
až 1e-11
.
Vysvetlivky:
-lm súbor s jazykovým modelom; -prune threshold prerezávanie založené na relatívnej entrópii pre zvolený prah (threshold); -write-lm zapíše jazykový model do výstupného súboru.
Úloha 7: Aplikujte entropicky-založené prerezávanie na doposiaľ vytvorené jazykové modely. Z programového balíka SRILM použite nástroj ngram
. Vypočítajte hodnoty perplexity prerezaných jazykových modelov. Sledujte vplyv hodnoty prahu prerezávania na kvalitu jazykových modelov.