Statisztika egyszerűen

Mágikus jelek nélkül...

Tanítsuk a gépet szöveget értelmezni!

2020. május 08. 08:00 - glantos70

Szerencsére Dani nem hagyta abba az írást, és ígéretéhez híven időben küldte előző írása folytatását.

Előző írásunkban bemutattuk a ’kmeans’ algoritmus lényegét és matematikai hátterét (Tanítsuk a gépet klaszterezni! – A ’kmeans’-algoritmus). Ahogy ígértük, a második részben egy konkrét problémát oldunk meg az első lépéstől az utolsóig, így az előző cikkben bemutatott klaszterezési technika gyakorlati felhasználása mellett betekintést adunk abba is hogy gépi tanulás alatt milyen folyamatot, folyamatokat értünk.

Cikkünkben különböző témájú szövegek halmazát bontjuk csoportokba aszerint, hogy jelentésük mennyire lehet hasonló azok alapján, hogy milyen szavak alkotják. A való életben a szövegbányászat vagy másnéven ’text mining’ egy konkrét tudományág. Még ha nem is tudunk róla, napi szinten találkozhatunk vele ha neten keresgélünk, vagy online rendelünk. Nem is sejtjük hogy hány esetben futhatunk bele olyan virtuális kommunikációba ahol a másik oldalon nem egy ember, hanem egy algoritmus áll. A jövőben ennek a lehetősége csak nőni fog, hiszen ahogy haladunk előre ezek a rendszerek egyre pontosabbak lesznek és egyre aprólékosabban tudják értelmezni a szövegeket, ezáltal jobban tudják szűrni a kérdésünkre a legjobb választ egy hatalmas szövegből. Már most léteznek olyan könyvek melyek történetet mesélnek el és ezeket neurális háló hozta létre.

Mi most egy nagyon egyszerű, de való életből vett példát nézünk meg. Különböző hírek szalagcímeit fogjuk kategóriákba sorolni aszerint hogy mi a téma. Tesszük mindezt úgy, hogy nem készítünk külön szótárt annak érdekében, hogy „ha ez a szó szerepel benne, akkor ez az x, de ha az, akkor az az y kategóriába tartozik, hiszen ennek a megközelítésnek komoly korlátai vannak. Csak a kapott szöveg alapján dolgozunk. Bármilyen problémát szeretnénk megoldani gépi tanulás által, az első feladatunk, hogy adatainkat alkalmassá tegyük a gépi feldolgozásra hiszen akármennyire is futurisztikusan hangzik, hogy mesterséges intelligencia, a műveletek elvégzését mégis egy gép végzi, aki csak a számok nyelvén ért. Így a feladatunk témája akár kép, akár szöveg, ezeket valahogy át kell alakítani számokká. A szövegbányászatban ezt nevezik 'pre-process'-nek. Gondolom, egy kicsit nehezen elképzelhető, hogy szövegből hogyan lesznek számok. Ezért, hogy ne tartsunk senkit kétségek közt gyorsan nézzünk meg egy egyszerű példát, ami egyúttal ízelítő a szövegbányászatból.

Adott két mondatunk:

nagyon szeretem ha meleg a pizza

nem szeretem a nagyon meleg napokat

Két nagyon rövid mondatról van szó, de ez most tökéletes nekünk. Nézzük meg hogy milyen szavak szerepelnek a mondatokban és írjuk ki őket egymás mellé. Egy szót csak egyszer kell leírni.

’nagyon’, ’szeretem’, ’ha’, ’meleg’, ’a’, ’pizza’, ’nem’, ’napokat’

Ez így nem egy hosszú felsorolás, de ha megnézzük ezzel a 8 szóval mindkét mondatot le tudjuk írni. A későbbiekben látni fogjuk hogy még ezt is lehetne szűkíteni hiszen nem minden szó tesz hozzá a mondat értelméhez. Ilyen például itt az ’a’, mint névelő. De majd erre visszatérünk később. Szóval adott 8 szó, amelyek használatával le tudjuk képezni mind a 2 mondatot. Írjuk a felsorolt szavak alá, hogy az adott mondatban hányszor szerepel az adott szó:

nagyon                szeretem             ha          meleg    a             pizza      nem       napokat

1                           1                           1             1             1             1             0             0

1                           1                           0             1             1             1             1             1

tehát az első mondat a mondat(1) = [1,1,1,1,1,1,0,0], a második mondat pedig a mondat(2) = [1,1,0,1,1,1,1,1] szöveg vektorokkal írható le. A probléma jellegétől függően más súlyozásokat, vektor típusokat is használhatunk, de erről majd egy kicsit később…

Most, hogy láthattuk, hogy miként lehet szöveg vektorba rendezni a szavakat, kifejteném picit bővebben, hogy mire utaltam fentebb azzal, hogy ennek a 8 szónak is lehet csökkenteni a számát. Minden nyelvben, legyen az angol vagy magyar stb., vannak szöveg bányászat tekintetében olyan szavak vagy karakterek, amik nem változtatnak egy egy szöveg jelentésén, de torzíthatják azt az algoritmus számára. Itt meg kell jegyzenem hogy a mi agyunknak furcsa olyan szöveget olvasni ahol nincs névelő, de ha jobban belegondolunk anélkül is megérthető a szöveg. Ilyenek lehetnek még a 'hogy', 'ezt', 'mivel' szavak, az írásjelek stb. Ezzel a módszerrel egyrészt csökkenthetjük a szó vektorunk hosszát ,ezáltal csökkentve számításaink költségeit, másrészt az adatainkat megtisztítjuk a zajoktól. Gyakran előfordulhatnak olyan mondatok ahol a szóvektorok megegyeznek, hiszen a szavak ugyanolyan számban fordulnak elő a mondatokban, azonban a szavak sorrendje megváltoztatja a mondatok értelmét, vagy szükségünk van előre jelezni, hogy egy minta alapján egy adott szót milyen szavak követnek leggyakrabban. Ennek a megoldására alkalmazzuk az ’ngramm’ módszert. Bár az elnevezés nem hiszem, hogy ismerős, de gyanítom, hogy szinte mindenki futott bele az alkalmazásába, amikor is a telefonunk az általunk beírt szöveget kiegészíti egy lehetséges következő szóval vagy szótaggal. Gyorsan nézzük meg hogy miről is van szó:

Nem szeretem, ha nem meleg a pizza.

Nézzük a szavakat: nem, szeretem, ha, nem, elég, meleg, pizza

Most menjünk végig a szavakon egyesével és fűzzük hozzá az azt követő szót:

nem - szeretem,

szeretem - ha,

ha - nem,

nem - elég,

elég - meleg,

meleg - pizza,

Ezek alapján, ha a telefonunkba beírjuk azt a szót, hogy 'nem', akkor a telefonunk lehetséges folytatásként a ’szeretem’ vagy az ’elég’ szavakat fogja kiadni. Természetesen ennyire nem egyszerű a dolog, de körülbelül erre a folyamatra épül. Ha egy pici matekot is beleviszünk, akkor ezzel a módszerrel számokat is tudunk hozzárendelni az egyes folytatások valószínűségéhez. Én szeretem alkalmazni ezt, mert bár növeli a vektorunk hosszát, de ebben megjelenik bizonyos szavak sorrendje is, ami által pontosabb képet kaphatunk az adott szöveg jelentéséről. Van még egy mutató, amit muszáj megemlítenünk. Ez a TF-IDF, ami egy számot rendel a szavakhoz aszerint, hogy mennyire fontos az adott szó a mondaton belül ahhoz képest, hogy a szöveg összességéhez (másnéven a corpus-hoz) képest mennyire fontos. Segítségével kiemelhetünk számunkra fontos és nélkülözhető szavakat. Nagyon sok kereső motor használja ezt a módszert annak eldöntésére hogy az általunk feltett kérdésre vajon melyik szöveghalmaz lehet a legjobb válasz. Ennek módszernek az a lényege, hogy ki tudjuk szűrni segítségével a szövegből azokat a szavakat melyek, vagy gyakoriságuk miatt, vagy akár ritka előfordulásuk miatt nem bírnak jelentőséggel az adott szöveg feldolgozásánál. Segítségével a fenti két példa mondatból ki tudnánk a szűrni az a, meleg, nagyon, szeretem szavakat hiszen ezek minkét mondatban előfordulnak. Így, ha csoportosítani akarnánk a mondatokat ezek feleslegesek hiszen ugyanannyira tartoznak az első mondathoz, mint a másodikhoz. (természetesen ennek a csoportosításnak 3 mondattól lenne igazán értelme). Rengeteg módja van a szövegünk előkészítéséhez (text pre-process) és feldolgozásához, de mivel a cikkünk lényege a ’kmeans’ szerintem ennyi elég ahhoz, hogy lássuk hogy kell elképzelni a szövegekkel a munkát, és esetleg felkeltsük az érdeklődésedet a szövegbányászat iránt.

És akkor nézzünk egy konkrét példát!

Különböző hírek szalagcímeit válogattam össze, hogy majd bináris súlyozást használva a 'kmeans' által klaszterezzük őket. A bináris súlyozástól nem kell megijedni, pusztán annyit jelent, hogy az előállított szóvektornál a szavak előfordulási számai csak két értéket vehetnek fel: nullát vagy egyet, azaz csak azt nézzük hogy szerepel-e benne az adott szó, de az nem érdekel minket hogy hányszor.

Lássuk a címeket, melyek még aktuálisak is:

Estére sem jött formába a forint, 353-nál az euró
Megijedt a forint a 350-től
Már 357 felett az euró
Tömegével utaznának a magyarok a járvány után - A kormány besegít
Érettségi koronavírus-járvány idején: minden, amit tudni érdemes

Egyszerű, rövid címek, de arra pont jók, hogy elfogadható terjedelem mellett bemutassuk vele a folyamatot. Mielőtt nekikezdenénk, kicsit gondoljuk át, hogy mit is látunk. Adott 5 mondat melyből az első 3 a forintról és euróról a másik kettő pedig a koronavírussal kapcsolatban szól valamiről. Mivel a mi agyunk tudja hogy az euró és forint mint pénznem egy témakörbe tartozik, és árfolyamokat is látunk így mi egyből átlátjuk hogy ez leginkább a deviza témakörbe tartozik. A másik két mondatot elolvasva a olvasottakat a jelenlegi vírushoz tudjuk kötni. Mivel a szalagcímek nem csak körül írják, esetleg csak homályosan utalnak arra, hogy a cikk tárgya mi lehet, ezért vannak fontos szavak melyekkel fel tudják hívni a figyelmet arra, hogy miről is olvashatunk, ha kibontjuk a cikket. Ilyen szavak az ’euró’, a ’forint’, a ’koronavírus’, a ’koronavírus-járvány’.  Ezek a szavak kulcsszavak a számunkra, hogy tudjuk, miről szólhat a cikk és eldöntsük, hogy melyik cikkek lehetnek hasonlóak. A programunk és a ’kmeans’ algoritmus csak számokban és távolságokban képes gondolkodni, így neki fontosabb lesz az hogy mely szavak hol fordulnak elő. Természetesen van még több szó is, de ha kiszedjük azokat a szavakat melyek nem tesznek hozzá a mondatok jelentéséhez akkor a maradék szavak előfordulása a teljes szövegben az euró, forint és járvány szavak kivételével 1 lesz. Mikor kiválasztottam a mondatokat, nem volt cél, hogy ez így legyen, ezt csak utólag vettem észre, de ha nem így lenne, akkor sem kell kétségbe esni. Ezért is nagyon fontos lépés a kivonatolás, azaz az adatok megtisztítása a zajoktól. Tehát a mi agyunk számára, ha az lenne a feladat, hogy osszuk a fent felsorolt 5 mondatot két kategóriára akkor az első 3 lenne egy csoport, az utolsó 2 pedig egy másik csoport. Na akkor lássuk, hogyan tudjuk ezt megcsináltatni a géppel!

Első lépésben alakítsuk át a szöveget kis betűssé. Ez egy könnyű, de igen fontos lépés, majd tisztítsuk meg azoktól a kifejezésektől melyek ha csoportosítani akarunk szövegeket akkor elhanyagolhatóak. Fentebb említettem hogy ez mennyire fontos lépés. Kiszedjük a névelőket, írásjeleket,  a gondolat jelet,  az olyan szavakat mint az ahogy, hogy, mert stb. Bár azt írtam, hogy nem írkálunk össze szavakat, de azokból a szavakból melyekről tudjuk, hogy nem fontosak azokból nyugodtan elkészíthetjük a saját STOP WORDS listánkat. Nálam ezek után az eredeti szöveg már így néz ki:

estére jött formába forint euró
megijedt forint
felett euró
tömegével utaznának magyarok járvány után  kormány besegít
érettségi koronavírus járvány idején tudni érdemes

Ahogy látjuk, eltűntek az írásjelek, a névelők, a számok, a számok után szereplő toldalékok, azonban a szövegek tartalma nagyjából még így elolvasva is érthető maradt. Most gyűjtsük ki a szavakat melyek felépítik a corpusunkat:

euró, magyarok, megijedt, estére, tömegével, forint, formába, felett, járvány, után, kormány, koronavírus, tudni, jött, utaznának, idején, érettségi, besegít, érdemes

írjuk ezeket egymás mellé, majd írjuk be alá a súlyokat, azaz hogy az adott mondatban előfordul-e a szó:

Amit a fenti táblázatban látunk az az, hogy az egyes mondatokban mely szavak fordulnak elő. A sorrend itt nem fontos. Ha megnézzük az első sort akkor látjuk hogy az első mondatot, az 'euró', 'estére', 'forint', 'formába', 'jött' szavak alkotják, melyeket ha sorba rendezünk megkapjuk az első átszűrt mondatunkat:

estére jött formába forint euró

Ha ez megvan, innentől kezdve már csak futtatni kell a 'kmeans'-t mely remélhetőleg valami olyasmi eredményt fog adni, hogy az első 3 mondat alkot egy klasztert és az utolsó kettő egy másikat, hiszen az első három a deviza témából, utóbbi kettő pedig a járványt érintő hírekből lett kiszedve. Az első cikkben átnéztük hogyan jutunk el a klaszterek meghatározásához, a lépések most is ugyanazok csak nagyobb dimenzió szám mellett. Mivel az oszlopok száma azért már nem kevés, és van 6 sorunk így most a számolást nem mi végezzük el, hanem rábízom az Orange nevű kis okos programra. Az Orange egy szabadon felhasználható (open-source) adatbányász és adatvizualizációs program, amelyet például az R-rel vagy a python-nal szemben nem programozni kell, hanem egy intuitív kezelőfelületen keresztül tudjuk kezelni, ami átláthatóbbá teszi az adatkezelési folyamatainkat.

A fenti táblázatot lementettem .xlsx formátumban, majd beolvastam. Mivel már tökéletesen előkészítettünk mindent, így Orangeban nincs más dolgunk mint az adat file-unkhoz hozzá kapcsolni egy ’kmeans’ algoritmust ahol a k értékét kettőre állítjuk (a k értéke azért kettő, mert jelen esetben tudjuk a k értékét, egyébként kísérletezgetni kellene vele), mert két csoportra szeretnénk osztani a mondatokat (két centroid köré szeretnénk csoportorítani a mondatokat), a többit pedig a ’kmeans’ elvégzi.

És lássuk az eredményt:

Mit is látunk? A K-means által elvégzett klaszterezés eredményét, mely szerint az első, második és harmadik mondat a C1 centorid köré csoportosul, míg az utolsó két mondat a C2 centorid köré. A 'Silhouette' oszlopban szereplő értékek az egyes mondatokhoz tartozó távolságokat jelölik, ahogyan azt az előző cikkemben már bemutattam. Ha egymás mellé írjuk a klasztereket és a kiinduló mondatokat, akkor még szemléletesebb a kimenet:

C1 - Estére sem jött formába a forint, 353-nál az euró
C1 - Megijedt a forint a 350-től
C1 - Már 357 felett az euró
C2 - Tömegével utaznának a magyarok a járvány után - A kormány besegít
C2 - Érettségi koronavírus-járvány idején: minden, amit tudni érdemes

Ez megegyezik az általunk is elvárt eredménnyel, azaz az első 3 mondat alkot egy klasztert az utolsó kettő pedig egy másikat! Bár a szalagcímek a valóságból lettek kiemelve, és a végeredmény 100%-os lett ennek ellenére azt ne feledjük el, hogy a nagyobb, komplexebb adathalmazoknál nem feltétlen elvárható ez a pontosság. Ezek az algoritmusok, ha csak a klaszterezéseket nézzük, nagyon könnyen adhatnak ugyanazon a halmazon más eredményeket, ezért érdemes tehát egy kijelölt teszt soron több módszert is kipróbálni, majd a legeredményesebbet kiválasztani. Emellett fontos tényező a mintánk nagysága mely bizonyos algoritmusoknál sokkal pontosabb végeredményt hozhat, ha belegondolunk ez logikus is.

Nagyon remélem, hogy ezzel a két nagyon egyszerű cikkel tudtam egy kis bepillantást nyújtani abba, hogy miként működhetnek a gépi tanuló algoritmusok, és milyen lépések vezethetnek el a problémánk megoldásáig. Az pedig, hogy ezen a blogon oszthattam meg a gondolataimat a témában az hatalmas megtiszteltetés, hiszen mai napig nagyon sokat olvasom, és tanulok innen!

2 komment

A bejegyzés trackback címe:

https://statisztikaegyszeruen.blog.hu/api/trackback/id/tr2915658852

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

KBajó 2020.05.11. 18:22:47

Nagyon jó weboldal. Gratulálok, csak így tovább!

glantos70 2020.05.11. 20:15:43

@KBajó: Nagyon szépen köszönöm az elismerő szavakat Dani nevében és a saját nevemben is. Remélem más cikkeket is elolvasol majd a blogon! Szép estét!
süti beállítások módosítása