import pandas as pd tekst = pd.read_csv("vilde_m.txt", sep = "\t") #sisendiks Stanza abil märgendatud tekst laused = tekst[tekst.Id == 1].Id.count() #lausete loendamine lause algussõnade arvu järgi print("Lauseid tekstis:", laused) tekst = tekst[tekst.Xpos != "Z"] #kirjavahemärgid tuleb sõnade loendamiseks kõrvale jätta sonad = tekst.Sona.count() print("Sõnu tekstis:", sonad) kesklause = sonad / laused print("Lause keskmine pikkus sõnades:", round(kesklause, 1 )) tekst["Sonapikkus"] = [len(sona) for sona in tekst.Sona] #sõnade pikkuse tulba lisamine andmetabelile kesksona = tekst["Sonapikkus"].mean() print("Sõna keskmine pikkus tähtedes:", round(kesksona, 1)) pikadsonad = tekst[tekst.Sonapikkus > 6].Sona.count() / sonad * 100 print("Pikkade sõnade osakaal: ", round(pikadsonad, 1), "%", sep="") #vaikimisi trükitakse print-käsu komponendid tühikuga eraldatult, siin on tühik ära jäetud lix = round(kesklause + pikadsonad) #LIX-indeks ümardatakse täisarvuks print("LIX-indeks:", lix) sonaliigid = tekst.groupby("Xpos").Xpos.count().to_frame() #eraldi andmetabel sõnaliikide sagedustega sonaliigid.rename(columns={"Xpos":"Sagedus"}, inplace=True) #tulba ümbernimetamine sonaliigid["Sonaliik"] = sonaliigid.index #indeksitulp kopeeritakse tavaliseks tulbaks, millega saab teha arvutusi sonaliigid["Osakaal"] = sonaliigid["Sagedus"] / sonad * 100 #sõnaliikide osakaalu jaoks tulba lisamine nimisonad = sonaliigid[sonaliigid.Sonaliik == "S"].Osakaal.sum() #sum() on vajalik üksiku arvväärtuse väljalugemiseks tabelist print("Nimisõnade osakaal: ", round(nimisonad, 1), "%", sep = "") #üks viis väljendada teksti nominaalsust e nimisõnalisusttegusonad = sonaliigid[sonaliigid.Sonaliik == "V"].Osakaal.sum() n_nimisonad = sonaliigid[sonaliigid.Sonaliik == "S"].Sagedus.sum() n_tegusonad = sonaliigid[sonaliigid.Sonaliik == "V"].Sagedus.sum() NT_suhtarv = n_nimisonad / n_tegusonad print("Nimi- ja tegusõnade suhtarv:", round(NT_suhtarv, 1)) #teine viis, kuidas teksti nominaalsust väljendada #Suhtarvu saab tähistada ka teisiti, 50:50 stiilis: osak_nimisonad = round(n_nimisonad / (n_nimisonad + n_tegusonad) * 100) print("Nimi- ja tegusõnade suhtarv teisiti: ", osak_nimisonad, ":", 100 - osak_nimisonad, sep = "") omadussonad = sonaliigid[sonaliigid.Sonaliik == "A"].Osakaal.sum() kaassonad = sonaliigid[sonaliigid.Sonaliik == "K"].Osakaal.sum() asesonad = sonaliigid[sonaliigid.Sonaliik == "P"].Osakaal.sum() tegusonad = sonaliigid[sonaliigid.Sonaliik == "V"].Osakaal.sum() maarsonad = sonaliigid[sonaliigid.Sonaliik == "D"].Osakaal.sum() hyydsonad = sonaliigid[sonaliigid.Sonaliik == "I"].Osakaal.sum() F = ((nimisonad + omadussonad + kaassonad) - (asesonad + tegusonad + maarsonad + hyydsonad) + 100) / 2 #NB! Sulud! #Valemi võib kirja panna ka nii: #F = (nimisonad + omadussonad + kaassonad - asesonad - tegusonad - maarsonad - hyydsonad + 100) / 2 print("F-indeks:", round(F, 1)) lemmad = tekst.groupby("Lemma").Lemma.count().to_frame() #eraldi andmetabel sõnade grupeerimiseks algvormi e lemma järgi lemmad.rename(columns={"Lemma":"Sagedus"}, inplace=True) lemmad["Lemma"] = lemmad.index erilemmad = lemmad.Lemma.count() print("Erinevaid sõnu tekstis:", erilemmad) leksvar = erilemmad / sonad print("Lemmade ja tekstisõnade suhtarv:", round(leksvar, 2)) #tõlgendatav protsendina, kui 100-ga korrutada #Sõnavara mitmekesisuse arvutamisel jäetakse sageli kõrvale pärisnimed. Praegusel juhul on tulemus sarnane. nimed = tekst[tekst.Upos == "PROPN"].groupby("Lemma").Lemma.count().to_frame() #eraldi andmetabel pärisnimede loendamiseks lemmad_nimedeta = erilemmad - nimed.Lemma.count() #lemmade arvust tuleb lahutada erinevate nimede arv print("Erinevaid sõnu ilma pärisnimedeta:", lemmad_nimedeta) sonad_nimedeta = sonad - nimed.Lemma.sum() #tekstisõnade arvust tuleb lahutada nimede kogusagedus print("Sõnade arv tekstis pärisnimedeta:", sonad_nimedeta) leksvar2 = lemmad_nimedeta / sonad_nimedeta print("Lemmade ja tekstisõnade suhtarv pärisnimedeta:", round(leksvar2, 2)) #Leksikaalse tiheduse arvutamisel võib funktsioonisõnadeks (mittesisusõnadeks) lugeda stoppsõnade loendis olevad sõnad. stoppsonad = pd.read_csv("estonian-stopwords-lemmas.txt") stopplemmad = stoppsonad["Stopplemma"].tolist() #stoppsõnade loendile on antud pealkiri, et Pandas käsitleks seda andmetabeli tulbana tekstilemmad = tekst["Lemma"].tolist() #Funktsioonisõnade loendamiseks tuleb kõiki tekstisõnu võrrelda stoppsõnade loendiga. funktsioonisonad = 0 for i in range(len(tekstilemmad)): if tekstilemmad[i] in stopplemmad: funktsioonisonad += 1 #Võib kirjutada ka: funktsioonisõnad = funktsioonisonad + 1 tekst = tekst[tekst.Xpos != "N"] #Ka arvsõnu ei loeta sisusõnadeks, kuid neid pole stoppsõnade loendis. sonad_arvsonadeta = tekst.Sona.count() sisusonad = sonad_arvsonadeta - funktsioonisonad tihedus = sisusonad / sonad * 100 print("Leksikaalne tihedus:", round(tihedus))