Szövegbányászat Információ Visszakeresés és egyéb alkalmazások A diák nagyban támaszkodnak a Stanford Egyetem Information Retrieval and Web-mining kurzusának anyagára: http://www-csli.stanford.edu/~schuetze/information-retrieval-book.html
Áttekintés Mi az IR? Indexelés Egyszerű index Invertált index, Gamma-kódolás Rangsorolás TF-IDF rangsor PageRank Egyéb alkalmazások és feladatok
Információ Visszakeresés IR alapprobléma Adott egy korpusz (dokumentumok halmaza, internet) Felhasználó az információigényét leginkább kielégítő dokumentumokat keresi Lekérdezést fogalmaz meg Cél a lekérdezésnek megfelelő dokumentumok listájának visszaadása
Egy IR rendszer legfontosabb jellemzői Indexelés sebessége Kevésbé fontos Lekérdezés sebessége Kritikus szempont Lekérdező nyelv kifejezőereje Mi kérdezhető meg és mi nem? Pontosság A legfontosabb, de mérése összetett feladat
Egy keresőmotor sémája
Egyszerű index Szó-dokumentum mátrix (D i,j : i. szó szerepel-e a j. dokumentumban) Antony and Cleopatra Julius Caesar The Tempest Hamlet Othello Macbeth Antony 1 1 0 0 0 1 Brutus 1 1 0 1 0 0 Caesar 1 1 0 1 1 1 Calpurnia 0 1 0 0 0 0 Cleopatra 1 0 0 0 0 0 mercy 1 0 1 1 1 1 worser 1 0 1 1 1 0
Gyors Egyszerű indexelés Az élet nem ilyen szép Kivitelezhetetlen 1 millió dokumentum, ~1000 token/dok, ~6byte/token ~6GB korpusz Legyen 500K különböző szóalak 500K x 1M mátrix ~60 GB index!
Invertált index ~1 milliárd egyest tartalmaz csupán a szó-dokumentum mátrix Rendkívül ritka Egyszerűbb, és jobb reprezentáció, ha csak az 1-esek pozícióit tároljuk ekkor invertált indexről beszélünk
Invertált index Minden T tokenre, tároljuk a T-t tartalmazó dokumentumok listáját. Miben tároljuk? Tömb? Brutus Calpurnia Caesar 2 4 8 16 32 64 128 1 2 3 5 8 13 21 34 13 16 Mi van akkor ha a Caesar szó bekerül a 14-es dokumentumba?
Listás megvalósítás jobb Dinamikus helyfoglalás (különböző gyakoriságú szavak!!!) Könnyű beszúrás Pointerek extra helyfoglalás Brutus Calpurnia Caesar 2 4 8 16 32 64 128 1 2 3 5 8 13 21 34 13 16 Szótár Napló Dokumentum ID szerint rendezve!
Invertált index létrehozása Dokumentumok Friends, Romans, countrymen. Tokenizáló Token stream Friends Romans Countrymen Nyelvi modulok Normalizált tokenek friend roman countryman Invertált index Indexelő friend roman countryman 2 4 1 2 13 16
Az index használata Hogyan dolgozunk fel 1 lekérdezést? Milyen jellegű lekérdezéseket kezelünk? Mit indexelünk? Mindent, vagy csak fontos szavakat? (Mi fontos?) Stopword lista: a leggyakoribb szavak elhagyhatók az indexből (sok hely, kevés haszon) pl., the, a, an, of, to Nyelvfüggő elem, minden nyelvre kell stopword lista.
Lekérdezés (naplólisták egyesítése) Párhuzamosan megyünk végig a két naplólistán, időigény így arányos a listák összhosszával 2 8 2 4 8 16 32 64 128 1 2 3 5 8 13 21 34 Brutus Caesar Ha a két lista hossza m és n, az összefésülés időigénye O(m+n) Fontos: a listák dokid szerint rendezve legyenek!!
Mit kapunk, milyen áron? Logikai (igen/nem) keresésre Csak pontos egyezést ad vissza Nincs rangsorolás Sokáig ez volt az uralkodó technológia Becslés a méretre? Vegyük az előző példát: 1M dokumentum, átl. 1000 token hossz, átlalában 6 byte/szó, ~500K különböző token
Becslés az invertált index méretére Két különálló tényező szabja meg a méretet Szótár mérete Naplók mérete Különböző dolgok jönnek szóba a méret optimalizálásakor Szótárnál: pl. szótövezés (magyarban különösen fontos!) Naplónál: dokid-ket tárolunk, tömörítés!
Napló tárolása Tároljuk rendezve a dokumentum ID listát! Ekkor elegendő csak az ID-k különbségeit tárolni ( lyukak ) ezek várhatóan átlagosan sokkal kisebb számok Brutus: 33, 47, 154, 159, 202, Brutus: 33, 14, 107, 5, 43, Használjunk változó kódhosszúságú kódolást! Calpurnia szó átlag minden egymilliomodik dokumentumban fordul elő, akkor azt log 2 1M = ~20 biten szeretnénk tárolni Az az szó szinte minden dokumentumban benne van, ezt az infot jó lenne ~1 bit helyen tárolni
γ kódolás K számot egy <hossz, eltolás> párral írjuk le hossz érték unáris kódolású (a számot leíró kód (eltolás) hosszát adja meg) az eltolás bináris kódolású (megadja magát a számot) K kódja 1 log 2 K + bites unáris kód log 2 K bites bináris kód log2 K ahol: eltolás = K 2
γ kódolás Példák: 9 = <1110,001> (7 bit) 23 = <11110, 0111> (9 bit) 1040 = <11111111110,0000010000> (21 bit) Ennél számottevően jobb tömörítést csak úgy érhetünk el, ha rendelkezünk információval a számok eloszlásáról V.ö. Huffman-kód
Zipf törvénye A k-adik leggyakoribb szó gyakorisága nagyságrendileg ~1/k
Becslés Zipf törvénye alapján A leggyakoribb szó N dokumentumban fordul elő (minden lyuk 1-es) 2. leggyakoribb N/2 dokumentumban (lyukak átlagosan 2 nagyságúak) k-adik leggyakoribb N/k dokumentumban (átlagos lyuk nagyság N/k), 2log 2 k bit tárolásra Összegezve k = 1 500 ezerig Összegzést végezzük úgy, hogy k darab csoportot tekintünk: i i az i-edik csoportra 2 1 1 k < 2, 2 i elemű, egyenként max i 1. 2Ni / 2 N = 1 millió, i = 1 19-re szummázva kb 340 millió bit, azaz ~45 MB az index Napló részének mérete.
Szótár mérete, első gondolat Fix hosszú bejegyzések tömbje 500K token; 28 byte/token = ~14MB. Terms Freq. Postings ptr. a 999,712 aardvark 71.. zzzz 99 20 byte Egyenként 4 byte
Szótár tömörítése A szótár egyetlen karakterlánc Pointer a szó kezdetére Köv. pointer mutatja a szó végét.systilesyzygeticsyzygialsyzygyszaibelyiteszczecinszomo. Gyakoiság Napló ptr Szó ptr. 33 29 44 126 Binary search these pointers Teljes hossz = 500KB x 8 = 4MB Pointerek 4M pozícióra log 2 4M = 22bits = 3bytes
Napló Kb 45 MB Szótár 4 byte gyakoriságra Index mérete 4 byte a Napló pointer 3 byte a szó pointer Átl. 8 byte szavanként a szóláncban 500K token ~9.5MB Index ~55 MB
Indexméret Szótövezés / kis-nagybetűs alak Tokenek számát ~40%-al Pointerek számát 10-20%-al Méretet ~30%-al Stopwords 30-as szabály: ~30 szó tesz ki ~30%-ot az írott szövegekben! A leggyakoribb szavak kivágása ~25% helyspórolást hozhat
Pár szó a lekérdezés sebességéről Napló-listák lineáris időben egyesíthetők Optimalizálás: Célszerű a rövid listákkal kezdeni a műveletek elvégzését Ugrólisták használata (index mérete növekszik)
Feldolgozás ugrólistákkal 16 128 2 4 8 16 32 64 128 8 371 1 2 3 5 8 13 0 211 371
Invertált index vége Célszerű tárolni a dokumentumban a szóalak helyét Kifejezés alapú lekérdezés támogatására Ezzel az előbb nem törődtünk Nagyobb index, de ezt használják a gyakorlatban Alternatívája a bi- trigram alapú indexelés
Rangsorolás Általában jó sok dokumentum illeszkedik 1-1 lekérdezésre Több milliárdos korpuszból milliós nagyságrendű találat Fontos, hogy a dokumentumokat rangsoroljuk, relevancia szerint! Megoldás: pl. PageRank Elosztott számítások Hadoop, Mahout, NoSQL, stb...
tf-idf rangsorolás Szavak súlya a tf, és idf szorzata: wt, d = tf t, d log( n df t ) Index készítésekor legyártható a súlyozás Ezt tároljuk el a szó-dokumentum mátrixban A lekérdezést is egy mini dokumentumra nézve a 2 vektor koszinusza adja a hasonlóságot: d j d sim( d j, dk ) = d d j k k = n i= 1 n i= 1 i, j i, k w 2 i, j w w n i= 1 w 2 i, k
Precízió, fedés Kiértékelés Precízió-fedés görbe Kitüntetett fedésértékhez tartozó precíziók meghatározása, majd interpoláció MAP
IR rokonteületek Információ kivonatolás Kivonat: az eredetinél rövidebb, emellett pontos reprezentánsa a dokumentum tartalmának Olvastam a Háború és Békét Oroszországról szól Kérdésmegválaszolás Természetes nyelven megfogalmazott kérdésre a releváns oldal visszaadása helyett a releváns információ visszaadása
Egyéb szövegbányászati alkalmazások és feladatok Alkalmazások Dokumentumosztályozás Véleménykinyerés Információkinyerés X Y cég W áron fölvásárolta QR céget. gépi tanulás Feladatok Lemmatizálás (szótövesítés) Jelentésegyértelműsítés Legvalószínűbb szófaji kódsorozatok, szövegbeli névelemek meghatározása Elemzési fák felállítása