Szövegfeldolgozás II.
Szövegfeldolgozási alapfeladatok Tömörítés: egy szöveget vagy szövegfájlt alakítsunk át úgy, hogy kevesebb helyet foglaljon (valamint alakítsuk vissza)! Keresés: egy szövegben vagy szövegfájlban keressünk egy szöveget! Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 2/33
Általános feladat: egy szöveget alakítsunk át olyan ábrázolásúra, hogy kevesebb helyet foglaljon! A tömörített szövegnek visszaalakíthatónak kell lenni! Módszerek: karakterek kódolása karaktersorozatok kódolása Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 3/33
Tömörítés TAB-karakterekkel TAB karakter jelentése: az aktuális pozíciótól a következő tabulációs-pozícióig szóközöket kell írni! Tabulációs pozíció (balra igazított): fix távolságra egymástól; beállítható pozíciókban. Tömörítés: szóközök helyére TAB. Kicsomagolás: TAB helyére szóközök. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 4/33
Tömörítés TAB-karakterekkel A bemenő elemek csoportosítása: nem szóköz karakter; szóközök TAB-pozícióig; szóközök nem szóközig. A kimenő elemek csoportosítása: nem szóköz karakter; TAB-karakter; szóközök nem szóközig. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 5/33
Tömörítés TAB-karakterekkel Csoport: fajta az eset sorszáma, kar a beolvasott karakter, db a szóközök száma, k az előreolvasott karakter, oszlop aktuális pozíció. Eljárás Tömörítés: Nyitás(f); Nyit(g) Ciklus amíg nem FileVége?(f) Csoportolvasás(f,fajta,kar,db) Csoportírás(g,fajta,kar,db) Ír(g,k); Zár(f); Zár(g) Eljárás Nyitás(f): Nyit(f); Olvas(f,k); oszlop:=1 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 6/33
Tömörítés TAB-karakterekkel Eljárás Csoportolvasás(f,fajta,kar,db): kar:=k Ha k ' ' akkor Betűolvasás(f,fajta,kar) különben Szóközolvasás(f,fajta,kar,db) Eljárás Betűolvasás(f,fajta,kar): fajta:=1; Olvas(f,k) Ha kar=sorvég akkor oszlop:=1 különben oszlop:=oszlop+1 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 7/33
Tömörítés TAB-karakterekkel Eljárás Szóközolvasás(f,fajta,kar,db): db:=0 Ciklus amíg k=' ' és nem TAB-pozíció(oszlop) db:=db+1; Olvas(f,k) oszlop:=oszlop+1 Ha TAB-pozíció(oszlop) akkor fajta:=2 különben fajta:=3 Elágazás vége Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 8/33
Tömörítés TAB-karakterekkel Eljárás Csoportírás(g,fajta,kar,db): Ha fajta=1 akkor Ír(g,kar) különben ha fajta=2 akkor Ír(g,TAB) különben Ciklus i=1-től db-ig Ír(g,' ') Elágazás vége Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 9/33
TAB-ok kicsomagolása Szövegfeldolgozás: A bemenő elemek csoportosítása: TAB karakter; egyéb karakter. A kimenő elemek csoportosítása: szóközök TAB-pozícióig; egyéb karakter. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 10/33
TAB-ok kicsomagolása Eljárás TABtalanítás: Nyit(f); Nyitás(g) Ciklus amíg nem FileVége?(f) Olvas(f,kar) Csoportírás(g,kar) Zár(f); Zár(g) Eljárás Nyitás(g): Nyit(g); oszlop:=1 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 11/33
TAB-ok kicsomagolása Eljárás Csoportírás(g,kar): Ha kar=tab akkor Szóközökírása(g) különben Betűírás(g,kar) Eljárás Szóközökírása(g): Ciklus Ír(g,' '); oszlop:=oszlop+1 amíg nem TAB-pozíció(oszlop) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 12/33
TAB-ok kicsomagolása Eljárás Betűírás(g,kar): Ír(g,kar) Ha kar=sorvég akkor oszlop:=1 különben oszlop:=oszlop+1 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 13/33
Tömörítés futamhossz kódolással Futam jelentése: azonos karakterből álló karaktersorozat. Futam vége: előreolvasás. A elve: a legalább 4 hosszú futamokról tároljuk a bennük szereplő karaktert, valamint a karakterek darabszámát. Kicsomagoláshoz tudnunk kell, hogy kódolt értékről van szó, azaz kell egy speciális karakter (pl. Escape). Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 14/33
Tömörítés futamhossz kódolással Futam: kar a futam karaktere, db a karakterek száma. Eljárás Tömörítés: Nyitás(f); Nyit(g) Ciklus amíg nem FileVége?(f) Futamolvasás(f,kar,db) Futamírás(g,kar,db) Ír(g,k); Zár(f); Zár(g) Eljárás Nyitás(f): Nyit(f); Olvas(f,k) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 15/33
Tömörítés futamhossz kódolással Eljárás Futamolvasás(f,kar,db): kar:=k; db:=1 Olvas(f,k) Ciklus amíg nem FileVége?(f) és k=kar és db<255 db:=db+1; Olvas(f,k) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 16/33
Tömörítés futamhossz kódolással Eljárás Futamírás(g,kar,db): Ha db<4 akkor Ciklus i=1-től db-ig Ír(g,kar) különben Ír(g,Esc+Karakter(db)+kar) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 17/33
Futamhossz kód kicsomagolása Eljárás Kifejtés: Nyit(f,g) Ciklus amíg nem FileVége?(f) Elemolvasás(f,db,kar) Csoportírás(g,db,kar) Zár(f,g) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 18/33
Futamhossz kód kicsomagolása Eljárás Elemolvasás(f,db,kar): Olvas(f,kar) Ha kar=esc akkor Olvas(f,kar); db:=egész(kar); Olvas(f,kar) különben db:=1 Eljárás Csoportírás(g,db,kar) Ciklus i=1-től db-ig Ír(g,kar) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 19/33
Tömörítés szótárral Szövegfeldolgozás: Szótár szerepe: a gyakori szavakat egy szótárban tároljuk, majd minden helyen a szótárra hivatkozunk. Kicsomagoláshoz tudnunk kell, hogy szótári hivatkozásról van szó, azaz kell egy speciális karakter (pl. Escape). A szótárban csak 256 szó lehet, azaz a szótárbeli sorszámot egyetlen karakterrel adhatjuk meg. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 20/33
Tömörítés szótárral Eljárás Tömörítés: Nyit(f); Nyit(g) Ciklus amíg nem FileVége?(f) Szóolvasás(f,szó,elv) Keresés(szó,Szótár,van,sorszám) Ha van akkor Ír(g,Esc+Karakter(sorszám)+elv) különben Ír(g,szó+elv) Zár(f); Zár(g) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 21/33
Tömörítés szótárral Szövegfeldolgozás: Eljárás Szóolvasás(f,szó,k): szó:= ; k:= Ciklus amíg k és k ElvJel szó:=szó+k; Olvas(f,k) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 22/33
Szótáros kód kicsomagolása Eljárás Kifejtés: Nyit(f,g) Ciklus amíg nem FileVége?(f) Olvas(f,kar) Ha kar Esc akkor Ír(g,kar) különben Olvas(f,kar) Ír(g,Szótár(egész(kar))) Zár(f,g) Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 23/33
Huffmann kódolás Szövegfeldolgozás: http://valdar.web.elte.hu/downloads/algoadat2_gy11. pdf Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 24/33
keresés Általános feladat: egy szövegben vagy szövegfájlban keressünk egy szöveget! Elemi módszer: A keresett szöveg minden karakterét hasonlítsuk a hosszú szöveg elejétől a megfelelő számú karakterrel! Ha nem egyezik, akkor a hosszú szövegben 1 karakterrel lépjünk tovább és újra hasonlítsunk! Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 25/33
keresés Elemi módszer Eljárás Keresés(s,minta,siker,i): siker:=hamis; i:=1; h:=hossz(s)-hossz(minta)+1 Ciklus amíg i h és nem siker j:=1 Ciklus amíg j Hossz(minta) és minta(j)=s(i+j-1) j:+1 siker:=(j>hossz(minta)) Ha nem siker akkor i:+1 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 26/33
keresés Elemi módszer egyszerűbben (lásd mátrixban keresés) Eljárás Keresés(s,minta,siker,i): siker:=hamis; i:=0; j:=1 h:=hossz(s)-hossz(minta) Ciklus amíg i h és j Hossz(minta) Ha minta(j)=s(i+j) akkor j:+1 különben i:+1; j:=1 siker:=(i h) 1-1 2-2 3-3 2-1 3-2 4-3 3-1 4-2 5-3 4-1 5-2 6-3 Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 27/33
keresés Knuth-Morris-Pratt módszer próbáljunk a szöveg karakterein előre haladni! s: abababac minta: ababac Eltolás 2-vel jobbra! Ha az utolsó helyen eltérés van, hogyan lehetne megúszni, hogy a korábbi karaktereket ne kelljen még egyszer hasonlítani? http://people.inf.elte.hu/fekete/algoritmusok_jegyzet/32_fejezet_knuth _Morris_Pratt_alg.pdf Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 28/33
s: abababac minta: Szövegfeldolgozás: ababac keresés Olyan eltolás kell, hogy az eddig illeszkedő betűk továbbra is illeszkedjenek! Az a-betű miatt 2 vagy 4 vagy 5, a b betű miatt 2 vagy 4 lehetne az eltolás. Azaz az adott rész elejét (prefix) olyan helyre tolhatjuk, ahol éppen megegyezik az adott rész végével (szuffix), s ebből a legnagyobbat kell venni. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 29/33
keresés köv(j) mi a következő jó mintabeli hasonlítandó, ha a minta j+1-edik tagja nem illeszkedett. Azaz legyen köv(j) a leghosszabb mintabeli kezdőszelet (prefix) és vele egyező minta(1..j) végszelete (szuffix) távolsága! s: abudabudabusz minta: abudabusz Ha nincs ilyen kezdőszelet, akkor köv(j)=1. Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 30/33
keresés Következőre lépő vektor készítése Eltolás(minta,köv): i:=1; j:=0; köv[0]:=0 Ciklus amíg i hossz(minta) Ha minta(i)=minta(j) vagy j=0 akkor i:=i+1; j:=j+1; köv[i]:=j különben j:=köv[j] Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 31/33
keresés Knuth-Morris-Pratt Keresés(s,minta,siker,hol): i:=1; j:=1; m:=hossz(minta) Ciklus amíg i hossz(s) és j m Ha minta(j)=s(i)vagy j=0 akkor i:=i+1; j:=j+1 különben j:=köv(j) siker:=(j>m) Ha siker akkor hol:=i-m Zsakó László: Szövegfeldolgozás 2018. 05. 08. 7:33 32/33
Szövegfeldolgozás előadás vége