Miért kell számmá alakítani a szöveget
Egy neurális háló nem betűkkel és szavakkal dolgozik, hanem számokkal, pontosabban tenzorokkal. A számítógép már eleve számokként tárolja a szöveges karaktereket, hiszen az ASCII vagy az UTF-8 kódolás minden betűhöz egy számot rendel, amelyből aztán a képernyőn megjelenő betűtípus rajzolódik ki. Ez azonban önmagában nem elég egy tanuló modellhez, mert a kódolás csak azt rögzíti, hogy melyik karakterről van szó, azt nem, hogy mit jelent.
Mi, emberek, magától értetődőnek vesszük, hogy egy betű mit jelöl, és hogyan állnak össze a karakterek egy mondat szavaivá. A gép azonban semmilyen ilyen előzetes tudással nem rendelkezik, a jelentést a tanítás során kell megtanulnia. Ehhez a szöveget először tokenekre kell bontani, ahol egy token lehet egy karakter, egy egész szó, vagy akár egy szórészlet is, majd minden tokenhez egy számot kell rendelni, jellemzően egy szókincs, vagyis egy előre felépített szótár segítségével. Ez a szám aztán one-hot kódolással táplálható be a hálóba.
Karakter szintű és szó szintű reprezentáció
A szöveg számmá alakítására két alapvető megközelítés létezik. A karakter szintű reprezentációnál minden egyes karaktert külön számként kezelünk. Ha a szövegkorpuszunkban összesen C különböző karakter fordul elő, akkor egy öt karakteres szó egy 5-ször-C méretű tenzorként ábrázolható, ahol minden betű egy külön oszlopnak felel meg a one-hot kódolásban.
A szó szintű reprezentációnál ehelyett a szöveg összes egyedi szavából építünk egy szókincset, majd magukat a szavakat kódoljuk one-hot módon. Ez a megközelítés általában jobb eredményt ad, mert egy önálló betű ritkán hordoz önmagában jelentést, míg egy szó már egy magasabb szintű szemantikai egység, ami leegyszerűsíti a háló dolgát. A hátránya viszont, hogy a szókincs mérete könnyen több tízezres nagyságrendűre nőhet, így nagyon magas dimenziójú, ritkán kitöltött tenzorokkal kell számolnunk.
N-gramok, avagy a szavak környezete
A természetes nyelvben egy szó pontos jelentését csak a szövegkörnyezet adja meg. A "neurális háló" és a "halászháló" szóösszetétel teljesen mást jelent, holott mindkettőben szerepel a "háló" szó. Az egyik módja annak, hogy ezt a kontextust figyelembe vegyük, ha nemcsak önálló szavakat, hanem szópárokat is önálló szókincsbeli egységként kezelünk. Így a "szeretek horgászni menni" mondat a "szeretek horgászni" és a "horgászni menni" tokenpárokból állna össze.
Ennek a megközelítésnek az a neve, hogy n-gram, ahol n a szóösszetétel hosszát jelöli, tehát a szópárok bigramok, a háromszavas kombinációk trigramok. A módszer ára az, hogy a szótár mérete drasztikusan megnő, ráadásul olyan kifejezések, mint a "horgászni menni" és a "vásárolni menni" teljesen különálló tokenként jelennek meg, holott ugyanaz az ige szerepel bennük, tehát valójában van köztük szemantikai hasonlóság, amit a modell így elveszít. N-gramokat karakter szintű reprezentációval is érdemes lehet kombinálni, ilyenkor a kapott egységek nagyjából szótagoknak felelnek meg.
Bag of Words
Szövegosztályozási feladatoknál a cél az, hogy a teljes szöveget egyetlen, fix méretű vektorral írjuk le, amit aztán egy sűrű, klasszikus osztályozó rétegnek adhatunk át bemenetként. Az egyik legegyszerűbb megoldás erre, ha a szöveg összes szavának one-hot kódolt vektorát összeadjuk. Az eredmény egy gyakorisági vektor lesz, amely megmutatja, az adott szöveg egyes szavai hányszor fordulnak elő benne. Ezt a reprezentációt bag of words modellnek, röviden BoW-nak nevezzük.
A bag of words lényegében azt rögzíti, mely szavak jelennek meg egy szövegben és milyen gyakorisággal, ami sok esetben valóban jó támpontot ad a szöveg témájáról. Egy politikai hírben valószínűleg gyakran előfordul olyan szó, mint "elnök" vagy "ország", egy tudományos publikációban pedig inkább olyanok, mint "ütköztető" vagy "felfedezés". A szógyakoriság tehát gyakran árulkodó jel a tartalomra nézve, még akkor is, ha a szavak sorrendjét a modell teljesen figyelmen kívül hagyja.
TF-IDF, avagy a fontos szavak kiemelése
A bag of words egyik gyengesége, hogy a leggyakoribb szavak jellemzően nem is a legfontosabbak. Az "és", "van" és hasonló kötőszavak, névelők szinte minden szövegben nagy számban előfordulnak, ezért a nyers gyakorisági vektorban ők dominálnak, miközben elnyomják azokat a szavakat, amelyek valójában jellemzik a szöveg témáját. Erre a problémára ad választ a TF-IDF, vagyis a Term Frequency Inverse Document Frequency megközelítés.
Az alapötlet az, hogy egy szó fontosságát ne csak az adott szövegen belüli gyakorisága határozza meg, hanem azt is figyelembe vegyük, milyen gyakran fordul elő a szó a teljes dokumentumgyűjteményben. Ha egy szó szinte minden dokumentumban megjelenik, akkor kevésbé megkülönböztető, tehát az összesített dokumentumgyakoriság alapján lecsökkentjük a súlyát. Ha viszont egy szó ritkán fordul elő a gyűjteményben, de az adott szövegben annál gyakrabban, akkor nagyobb súlyt kap, hiszen valószínűleg éppen ez a szó jellemzi leginkább a szöveg tartalmát. Ez a kombinált mérőszám sokkal informatívabb bemenetet ad egy osztályozó modellnek, mint a nyers szógyakoriság.
Fontos ugyanakkor tisztában lenni azzal, hogy sem a bag of words, sem a TF-IDF nem képes megragadni a szöveg valódi jelentését, csak a szavak gyakoriságát súlyozza különböző módokon. A sorrendet és a mondatszerkezetet egyik módszer sem veszi figyelembe. Ahogy a nyelvész J. R. Firth fogalmazott 1935-ben, egy szó teljes jelentése mindig kontextuális, és a jelentés kontextus nélküli vizsgálata nem vehető komolyan. Ahhoz, hogy a szöveg valódi szemantikáját is megragadjuk, erősebb neurális modellekre, szóbeágyazásokra és nyelvi modellezésre van szükség, amivel a következő leckékben foglalkozunk.
Gyakorlati kód
Ha szeretnéd saját magad is kipróbálni a bag of words és a TF-IDF felépítését, a Microsoft eredeti jegyzetfüzete PyTorchban, lépésről lépésre bemutatja a folyamatot. Gyakorlati kód a GitHubon.
Forrás
Ez a lecke a Microsoft nyílt forráskódú, MIT licenc alatt elérhető "AI For Beginners" tananyagának magyar adaptációja. Eredeti angol lecke. GitHub. Felhasznált magyar gépi fordítás. GitHub.
Workshop
AI Transformation Day
Egésznapos, vezetőknek szóló program. Feltérképezzük, hol tart a szervezet, mi az első reális lépés, és milyen belső feltételek szükségesek a sikerhez. A nap végén konkrét, prioritizált cselekvési lista.
Érdekel a program →