In [9]:
import estnltk
import pandas as pd
from collections import Counter
from estnltk.taggers.adjective_phrase_tagger.adj_phrase_tagger import AdjectivePhraseTagger
import re

In [5]:
data = pd.read_csv("../../data/meediadata.csv")

In [6]:
def read_keywords(filename):
    keywords = []
    with open(filename) as infile:
        for line in infile:
            keywords.append(line.strip())
            
    return keywords

keywords = read_keywords("ohtuleht_keywords.txt")
fotod_videod = read_keywords("fotod.txt")

In [10]:
def split_sentence(sentence):
    pattern = "(" + "|".join([k for k in keywords if "|" not in k]) + ")" + "([A-Z]|[0-9])"
    res = re.search(pattern, sentence)
    if res is None:
        return([sentence.strip()])
    else:
        return(split_sentence(sentence[:res.start()]) + split_sentence(sentence[res.end() - 1:]))

def clean_data(sentence, allikas):
    sentence = sentence.strip().replace("«", "")
    if allikas != "ohtuleht":
        return [sentence]
    
    res = [(m.start(0), m.end(0)) for m in re.finditer("\([0-9]+\)", sentence)]

    sentences = split_sentence(sentence)
    
    if len(res) == 1 and res[0][1] != len(sentence):
        res = [res[0], [len(sentence), len(sentence)]]
        
    
    if len(res) > 1:
        sentences = []
        start = 0
        for c in res:
            temp = sentence[start:c[1]]
            temp_sentences = split_sentence(temp)
            
            for s in temp_sentences:
                sentences.append(s)   
            start = c[1]
    
    
    for j in range(len(sentences)):
        sentences[j] = sentences[j].strip()
        if sentences[j] == "":
            continue
        parts = sentences[j].strip().split()
        if len(parts) > 1 and len(parts[-1]) >= 3 and parts[-1][0] == "(" and parts[-1][-1] == ")" and parts[-1][1:-1].isdigit():
            sentences[j] = " ".join(parts[:-1])
        parts = sentences[j].strip().split()
        upper = [i for i in range(len(parts[0])) if parts[0][i].isupper()]
        if len(upper) >= 2 and min(upper[1:]) >= 1 and parts[0][0].isalpha() and upper[1] - upper[0] > 1:
            if "-" in parts[0] and parts[0].index("-") < min(upper[1:]):
                pass
            else:
                parts[0] = parts[0][min(upper[1:]):]
                sentences[j] = " ".join(parts).strip()
        for k in keywords:
            if sentences[j].startswith(k) and len(sentences[j]) > len(k) and (sentences[j][len(k)].isupper() or sentences[j][len(k)].isdigit()):
                sentences[j] = sentences[j][len(k):].strip()

    return [s for s in sentences if len(s) > 0]

def remove_foto_video(sentence):
    current_k = ""
    for k in fotod_videod:
        if sentence.startswith(k) and len(sentence) > len(k) and len(k) > len(current_k):
            current_k = k
    return sentence.lstrip(current_k)

In [11]:
pealkirjad = []
allikad = []
ajad = []
cleaned_pealkirjad = []
altered_pealkirjad = []
for row in data.iterrows():
    row = row[1]
    cleaned = clean_data(row["pealkiri"], row["allikas"])
    if len(cleaned) > 1:
        pass
        #print(cleaned)
    for sentence in cleaned:
        pealkirjad.append(row["pealkiri"])
        allikad.append(row["allikas"])
        ajad.append(row["aeg"])
        cleaned_pealkirjad.append(sentence)
        altered_pealkirjad.append(remove_foto_video(sentence))

In [12]:
data = pd.DataFrame({"pealkiri": pealkirjad, "allikas": allikad, "aeg": ajad, "cleaned_pealkiri": cleaned_pealkirjad,
                    "altered_pealkiri": altered_pealkirjad})
print(data.shape)
data.head()


(8979, 5)
Out[12]:
aeg allikas altered_pealkiri cleaned_pealkiri pealkiri
0 2017-04-12 15:06:49 postimees Küberpättidel õnnestus Eestist tundlikku infot... Küberpättidel õnnestus Eestist tundlikku infot... Küberpättidel õnnestus Eestist tundlikku infot...
1 2017-04-12 15:06:49 postimees Trumpi poeg: isa otsust rünnata Süüriat mõjuta... Trumpi poeg: isa otsust rünnata Süüriat mõjuta... Trumpi poeg: isa otsust rünnata Süüriat mõjuta...
2 2017-04-12 15:06:49 postimees Stockholmi ründaja polegi usbekk Rakhmat Akilov? Stockholmi ründaja polegi usbekk Rakhmat Akilov? Stockholmi ründaja polegi usbekk Rakhmat Akilov?
3 2017-04-12 15:06:49 postimees Vanasadamas ristiti viimaks ka parvlaev Piret Fotod: Vanasadamas ristiti viimaks ka parvlaev... Fotod: Vanasadamas ristiti viimaks ka parvlaev...
4 2017-04-12 15:06:49 postimees Lauri uutest maksudest: miks proovida asju, mi... Lauri uutest maksudest: miks proovida asju, mi... Lauri uutest maksudest: miks proovida asju, mi...

In [20]:
data2 = data.drop_duplicates(subset = ["cleaned_pealkiri", "allikas"])
print(data2.shape)
df_all = pd.DataFrame(columns=['word_texts', 'lemmas', 'postags', 'postag_descriptions', 'id',
       'pealkiri', 'allikas', 'aeg', 'cleaned_pealkiri', 'altered_pealkiri'])

i = 1
for row in data2.iterrows():
    t = row[1]["cleaned_pealkiri"]
    df = estnltk.Text(t).get.word_texts.lemmas.postags.postag_descriptions.as_dataframe
    df["id"] = i
    df["pealkiri"] = row[1]["pealkiri"]
    df["allikas"] = row[1]["allikas"]
    df["aeg"] = row[1]["aeg"]
    df["cleaned_pealkiri"] = row[1]["cleaned_pealkiri"]
    df["altered_pealkiri"] = row[1]["altered_pealkiri"]
    df_all = pd.concat([df_all, df])
    i += 1
    if i % 500 == 0:
        print(i)


(6352, 5)
500
1000
1500
2000
2500
3000
3500
4000
4500
5000
5500
6000

In [21]:
def split_word(word):
    if "|" in word:
        parts = word.split("|")
        if len(parts[0]) > 0:
            return parts[0]
    return word

df_all["lemmas_clean"] = df_all["lemmas"].apply(split_word)

In [22]:
df_all["id"] = df_all["id"].astype("int")
df_all.to_csv("../../data/meediadata_cleaned2.csv")

Old experimental code


In [5]:
def sonad(data, ajakiri, sonatyyp):
    laused = list(data[data["allikas"] == ajakiri]["pealkiri"].drop_duplicates())
    dfs = [estnltk.Text(l).get.word_texts.lemmas.postags.postag_descriptions.as_dataframe for l in laused]
    sonad = pd.concat(dfs)
    sonad_lemmad = sonad[["lemmas", "postags", "postag_descriptions"]]
    sonad_count = pd.DataFrame(sonad_lemmad.groupby(["lemmas", "postags", "postag_descriptions"]).size()).reset_index()
    sonad_count.columns = ["sona", "tag", "tag_desc", "count"]
    sonad_count = sonad_count.sort_values("count", ascending=False)
    return sonad_count[sonad_count["tag_desc"].isin(sonatyyp)]

In [16]:
omadus = ["omadussõna algvõrre", "omadussõna keskvõrre", "omadussõna ülivõrre"]
omadus = ["omadussõna ülivõrre"]
sonad(data, "postimees", omadus).head()


Out[16]:
sona tag tag_desc count
2226 suurim U omadussõna ülivõrre 11
775 enim U omadussõna ülivõrre 2
1784 parim U omadussõna ülivõrre 2
1590 moodsaim U omadussõna ülivõrre 1
1514 mainekaim U omadussõna ülivõrre 1

In [17]:
sonad(data, "delfi", omadus).head()


Out[17]:
sona tag tag_desc count
2818 parim U omadussõna ülivõrre 9
3456 suurim U omadussõna ülivõrre 7
1324 enim U omadussõna ülivõrre 2
3994 vanim U omadussõna ülivõrre 2
2882 pikim U omadussõna ülivõrre 2

In [18]:
sonad(data, "ohtuleht", omadus).head()


Out[18]:
sona tag tag_desc count
2291 parim U omadussõna ülivõrre 14
2768 suurim U omadussõna ülivõrre 4
3130 vanim U omadussõna ülivõrre 3
2082 moodsaim U omadussõna ülivõrre 3
601 Meeledparim U omadussõna ülivõrre 2

In [19]:
sonad(data, "err", omadus).head()


Out[19]:
sona tag tag_desc count
1582 vanim U omadussõna ülivõrre 2
1189 populaarseim U omadussõna ülivõrre 1
1694 ülim U omadussõna ülivõrre 1
1136 parim U omadussõna ülivõrre 1
1540 vaadatuim U omadussõna ülivõrre 1

In [104]:
estnltk.Text(laused[1]).get.word_texts.lemmas.postags.postag_descriptions.as_dataframe


Out[104]:
word_texts lemmas postags postag_descriptions
0 Trumpi Trump|Trumpi H pärisnimi
1 poeg poeg S nimisõna
2 : : Z lausemärk
3 isa isa S nimisõna
4 otsust otsus S nimisõna
5 rünnata ründama V tegusõna
6 Süüriat Süüria H pärisnimi
7 mõjutas mõjutama V tegusõna
8 Ivanka Ivanka|Ivankas H pärisnimi

In [27]:
data[data["allikas"] == "ohtuleht"]


Out[27]:
Unnamed: 0 pealkiri allikas aeg
1949 1950 PROPAGANDA MISSUGUNE: Venemaa saatis Sinimäged... ohtuleht 2017-04-12 15:06:49
1950 1951 VANDENÕUTEOREETIK: Estonia uputati, et saada l... ohtuleht 2017-04-12 15:06:49
1951 1952 RETRODRIFT | Kalvi-Kalle oli abieluks valmis j... ohtuleht 2017-04-12 15:06:49
1952 1953 FANTASTILINE! Anett Kontaveit sai maailma 78. ... ohtuleht 2017-04-12 15:06:49
1953 1954 ÕHTULEHE EKSPERIMENT | Kahe kuuga pani kõhu pe... ohtuleht 2017-04-12 15:06:49
1954 1955 Putin: Venemaa ja USA suhted lähevad aina halv... ohtuleht 2017-04-12 15:06:49
1955 1956 SAKSLASED PAHANDAVAD: kuidas peaks Dortmundi B... ohtuleht 2017-04-12 15:06:49
1956 1957 KEVADINE DETOX: 11 nõksu, kuidas oma keha igap... ohtuleht 2017-04-12 15:06:49
1957 1958 "PROOVIABIELU" JÕUAB TÄNA ÕHTUL FINAALINI: kel... ohtuleht 2017-04-12 15:06:49
1958 1959 KGB "hamster" kogus Eesti kultuurieliidi eraki... ohtuleht 2017-04-12 15:06:49
1959 1960 Venemaa kodanik üritas Eesti panga kaudu Donet... ohtuleht 2017-04-12 15:06:49
1960 1961 INFOPAKETT | Kõik oluline Dortmundi Borussia p... ohtuleht 2017-04-12 15:06:49
1961 1962 KÕMUTEOS: printsess Diana pilkas ja peksis pri... ohtuleht 2017-04-12 15:06:49
1962 1963 ... ohtuleht 2017-04-12 15:06:49
1963 1964 ... ohtuleht 2017-04-12 15:06:49
1964 1965 ... ohtuleht 2017-04-12 15:06:49
1965 1966 ... ohtuleht 2017-04-12 15:06:49
1966 1967 Viimased ohtuleht 2017-04-12 15:06:49
1967 1968 KAPO: Eesti moslemikogukond on üldiselt rahume... ohtuleht 2017-04-12 15:06:49
1968 1969 Rangest kontrollist hoolimata on Eestisse satt... ohtuleht 2017-04-12 15:06:49
1969 1970 FOTOD | Kapo tabas kaks Vene eriteenistuse hea... ohtuleht 2017-04-12 15:06:49
1970 1971 PILTUUDIS | Lisaks Toomile on Süürias käinud k... ohtuleht 2017-04-12 15:06:49
1971 1972 Sinisalu: sotsiaalmeedia mõju kasvuga kaasneb ... ohtuleht 2017-04-12 15:06:49
1972 1973 Katrin Karisma ja Helgi Sallo klaarivad arveid ohtuleht 2017-04-12 15:06:49
1973 1974 GALERII | Kukerpillid Võrus: Küll seal tehti p... ohtuleht 2017-04-12 15:06:49
1974 1975 "Mati häbelikus naeratuses on midagi vastupand... ohtuleht 2017-04-12 15:06:49
1975 1976 ÕHTULEHT ESITLEB: võida menubändi Põhja-Tallin... ohtuleht 2017-04-12 15:06:49
1976 1977 JÄRGMINE PEATUS | Mis on kääbusriikides müstil... ohtuleht 2017-04-12 15:06:49
1977 1978 EluOSSIKÜKK: hoia kükitades kannad maas, muid... ohtuleht 2017-04-12 15:06:49
1978 1979 OSSIKÜKK: hoia kükitades kannad maas, muidu ol... ohtuleht 2017-04-12 15:06:49
... ... ... ... ...
3163 3164 Kas üksikema ei kõlbagi aasta emaks? (218) ohtuleht 2017-04-19 13:15:01
3164 3165 SisuturundusLõõgastav massaaž koos üllatusega!... ohtuleht 2017-04-19 13:15:01
3165 3166 Lõõgastav massaaž koos üllatusega! ohtuleht 2017-04-19 13:15:01
3166 3167 Minipuhkus olgu lõõgastav ja aktiivne! ohtuleht 2017-04-19 13:15:01
3167 3168 Naudid kiirust ja adrenaliini? Siis on see mid... ohtuleht 2017-04-19 13:15:01
3168 3169 Keha ja käed alati siidpehmeks! ohtuleht 2017-04-19 13:15:01
3169 3170 UUS KUUM TREND? Fitness-blogijanna viskas žile... ohtuleht 2017-04-19 13:15:01
3170 3171 VIDEO | KALVI-KALLE VS HELEN: Kumb alustab roh... ohtuleht 2017-04-19 13:15:01
3171 3172 TV3 VIDEO | USKUMATU! Hinnanguliselt 5 protsen... ohtuleht 2017-04-19 13:15:01
3172 3173 POOL ELU VANGIS ISTUNUD KIRJANIK: mõni inimene... ohtuleht 2017-04-19 13:15:01
3173 3174 USKUMATU VANDENÕUTEOORIA: parvlaev Estonia upu... ohtuleht 2017-04-19 13:15:01
3174 3175 MAITSEV KATSE | Milline kaste ja moos on kõige... ohtuleht 2017-04-19 13:15:01
3175 3176 NÄDALA TAROSKOOP: mida toob 17. kuni 23. april... ohtuleht 2017-04-19 13:15:01
3176 3177 PRINTS HARRY EMA DIANA SURMAST: "Surusin tunde... ohtuleht 2017-04-19 13:15:01
3177 3178 Ott Kiivikas võitis Maltal kaks medalit (12) ohtuleht 2017-04-19 13:15:01
3178 3179 Ekspoliitik Priit Toobal tabati autoroolist jä... ohtuleht 2017-04-19 13:15:01
3179 3180 "Minu unistus on ühel päeval koos naisega taas... ohtuleht 2017-04-19 13:15:01
3180 3181 ÕHTULEHT ESITLEB: võida menubändi Põhja-Tallin... ohtuleht 2017-04-19 13:15:01
3181 3182 ÕHTULEHE EKSPERIMENT | Kahe kuuga pani kõhult ... ohtuleht 2017-04-19 13:15:01
3182 3183 SÕJA JULM NÄGU: punapartisanide metsikused Soo... ohtuleht 2017-04-19 13:15:01
3183 3184 KUULA! Ameerikas õppiv eestlane raius Sildarud... ohtuleht 2017-04-19 13:15:01
3184 3185 VIDEO | Kuidas ma Liivimaa kubermangu piiri ku... ohtuleht 2017-04-19 13:15:01
3185 3186 EBU: Venemaa jääb Eurovisioni lauluvõistluselt... ohtuleht 2017-04-19 13:15:01
3186 3187 FOTOD | Eesti Eurovisioni postkaart valmis rab... ohtuleht 2017-04-19 13:15:01
3187 3188 Laura särab eurolaval ülikallis kleidis! ohtuleht 2017-04-19 13:15:01
3188 3189 Ilm Eestis ohtuleht 2017-04-19 13:15:01
3189 3190 Ilmakaart ohtuleht 2017-04-19 13:15:01
3190 3191 Ilmauudised ohtuleht 2017-04-19 13:15:01
3191 3192 Koosta oma sünnikaart ohtuleht 2017-04-19 13:15:01
3192 3193 Suhtehoroskoop ohtuleht 2017-04-19 13:15:01

1244 rows × 4 columns