☠ 8. feladat

Listák - II.

Ábrázold hisztogramon az Anyám tyúkja versben a szavak hosszának eloszlását.

Megoldás

Mivel a megoldás során használni fogjuk a numpy csomag funkcióit, először hívjuk meg!

In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Mivel a versben írásjelek is vannak, amik nem számítanak bele a szavak hosszába, ezért először készítsünk egy függvényt, ami eldönti, hogy egy kapott string benne van-e a magyar nyelv 35 különböző egybetűs betűjében! (Ezt a függvényt nyilvánvalóan úgy van értelme használni, hogy a neki átadott string egy darab karakter.)

In [2]:
betuk = ['a', 'á', 'b', 'c', 'd', 'e', 'é', 'f', 'g', 'h', 'i', 'í', 'j', 'k', 'l', 'm', 'n', 'o',
         'ó', 'ö', 'ő', 'p', 'q', 'r', 's', 't', 'u', 'ú', 'ü', 'ű', 'v', 'w', 'x', 'y', 'z']   # A betűket tartalmazó lista, ez lesz a referencia
def betue(s):
    for c in betuk:
        if c == s.lower():    # Ha a kapott string megegyezik az egyik betűvel, akkor a függvény visszatérési értéke True
            return True
    return False              # Egyébként False

Ezután, egy adott szóban ki kell szűrni az írásjeleket, hogy ténylegesen csak a betűk számát nézzük! Erre írjunk egy függvényt, ami egy kapott stringet a benne lévő nem hangot jelölő karakterek nélkül ad vissza. Ehhez minden karakterét megvizsgálja az előbb elkészített betue függvénnyel.

In [3]:
def normal(normalando):
    normalt = ""
    for c in normalando:    # Végigmegy a kapott string karakterein
        if betue(c):        # és csak akkor írja bele a visszaadandó stringbe, ha valóban betű
            normalt += c
    return normalt

És végül elkészíthetjük a függvényt, amely tetszőleges szöveget felbont szavakra, és megszámolja a hosszukat.

In [4]:
def elemzo(szoveg):
    szohossz = list()
    for szo in szoveg.split():                # Végigmegy a megvizsgálandó szöveg szavain egyesével.
        if len(normal(szo))>0:                # Előfordulhat, hogy gépelési hiba, miatt, vagy önmagában álló írásjel miatt lesznek 0 karakterű szavak, ezek nyilvánvalóan nem számítanak
            szohossz += [len(normal(szo))]    # A szavak hosszát egy listához hozzáadjuk
    szohossz = array(szohossz)                # Majd a listát tömbbé alakítjuk, hogy a hist függvény kezelni tudja
    hist(szohossz, szohossz.max() - szohossz.min() + 1)             # És végül ábrázoljuk, annyi oszlopban, ahány különböző szóhossz van
    xlabel("szóhossz")
    ylabel("gyakoriság")

Most már kipróbálhatjuk a függvényt, nézzük meg a feladatul kapott verset!

In [5]:
anyamtyukja = "Ej mi a kő! tyúkanyó, kend A szobában lakik itt bent? Lám, csak jó az isten, jót ád, Hogy fölvitte a kend dolgát! Itt szaladgál föl és alá, Még a ládára is fölszáll, Eszébe jut, kotkodákol, S nem verik ki a szobábol. Dehogy verik, dehogy verik! Mint a galambot etetik, Válogat a kendermagban, A kiskirály sem él jobban. Ezért aztán, tyúkanyó, hát Jól megbecsűlje kend magát, Iparkodjék, ne legyen ám Tojás szűkében az anyám. – Morzsa kutyánk, hegyezd füled, Hadd beszélek mostan veled, Régi cseléd vagy a háznál, Mindig emberűl szolgáltál, Ezután is jó légy, Morzsa, Kedvet ne kapj a tyúkhusra, Élj a tyúkkal barátságba’... Anyám egyetlen jószága."
In [6]:
elemzo(anyamtyukja)