import re import os import pandas as pd from collections import Counter sonaandmed=[rida.rstrip() for rida in open("K1_referentskorpus_visl3.txt", "r", encoding="utf-8").readlines()] def laused_sonad(parserivaljund): puhver=[] lause=[] sona="" uussona=False for rida in parserivaljund: if len(rida)>0: if rida=='""': lause=[] elif rida=='""': if lause: puhver.append(lause[:]) elif rida[0]=='"': sona=rida uussona=True elif uussona: sona+=" "+rida.strip() uussona=False lause.append(sona) return puhver def laused_kokku(lausepuu): return [[sona for lause in lausepuu for sona in lause]] def sona(rida): return re.findall('"<(.*)>"', rida)[0] def sonaliik(rida): return re.findall(' ([A-Z]) ', rida)[0] def morfo(rida): return re.findall(' ([A-Z] [^\\@\\#]*)', rida)[0].strip() def synt(rida): return " ".join(re.findall("(\\@[^ ]*)", rida)) def morfosynt(rida): return morfo(rida)+" // "+synt(rida) def sonad(ryhm): return ",".join([" ".join([sona(rida) for rida in vaste]) for vaste in ryhm]) def kogus(ryhm): return str(len(ryhm)) def vastab(muster, vordlus): for nr in range(len(muster)): if muster[nr]!=".": if muster[nr]!=vordlus[nr]: return False return True def otsi(lausepuu, muster, z="eemalda"): #muster nt ..VVD #z tykelda/eemalda/tavasona mustripikkus=len(muster) v=[] for lause in lausepuu: if z=="eemalda": lause=[sona for sona in lause if not sonaliik(sona)=="Z"] liigid="".join([sonaliik(sona) for sona in lause]) koht=0 while koht<=(len(lause)-mustripikkus): if vastab(muster, liigid[koht:koht+mustripikkus]): if not (z=="tykelda" and ("Z" in liigid[koht:koht+mustripikkus])): v.append(lause[koht:koht+mustripikkus]) koht+=1 return v def ryhmita(vasted, ryhmitusfunktsioon): v={} for kirje in vasted: ryhmitustunnus=ryhmitusfunktsioon(kirje) if ryhmitustunnus in v: v[ryhmitustunnus].append(kirje) else: v[ryhmitustunnus]=[kirje] return v def tryki(ryhmad, kuvamisfunktsioon, fnimi="", veerud=None, sep=";"): m=[kuvamisfunktsioon(ryhmad[ryhmatunnus]) for ryhmatunnus in sorted(ryhmad.keys())] df=pd.DataFrame(m, columns=veerud) if fnimi.endswith("xlsx"): df.to_excel(fnimi, index=False) elif fnimi.endswith("csv"): df.to_csv(fnimi, index=False, sep=sep) else: print(df) def tryki_mitu(ryhmad, kuvamisfunktsioon, fnimi="", veerud=None, sep=";", laiendid=["csv", "xlsx"]): for laiend in laiendid: tryki(ryhmad, kuvamisfunktsioon, fnimi+"."+laiend, veerud, sep) def arvuta(kaust, jada): if not os.path.exists(kaust): os.makedirs(kaust) vasted=otsi(lausepuu, ".."+jada) ryhmad=ryhmita(vasted, lambda kirje: "-".join([morfosynt(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][0])+sonaliik(ryhm[0][1]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3)), *[morfosynt(rida) for rida in ryhm[0]], sonad(ryhm)], kaust+"/"+jada+"_vasak_2sona", ["paar", "kogus", "osakaal", *["märgend"+str(nr+1) for nr in range(len(list(ryhmad.values())[0][0]))] , "tekstid"]) vasted=otsi(lausepuu, jada+"..") ryhmad=ryhmita(vasted, lambda kirje: "-".join([morfosynt(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][3])+sonaliik(ryhm[0][4]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3)), *[morfosynt(rida) for rida in ryhm[0]], sonad(ryhm)], kaust+"/"+jada+"_parem_2sona", ["paar", "kogus", "osakaal", *["märgend"+str(nr+1) for nr in range(len(list(ryhmad.values())[0][0]))] , "tekstid"]) vasted=otsi(lausepuu, "."+jada) ryhmad=ryhmita(vasted, lambda kirje: "-".join([morfosynt(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][0]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3)), *[morfosynt(rida) for rida in ryhm[0]], sonad(ryhm)], kaust+"/"+jada+"_vasak_1sona", ["vasak", "kogus", "osakaal", *["märgend"+str(nr+1) for nr in range(len(list(ryhmad.values())[0][0]))] , "tekstid"]) vasted=otsi(lausepuu, jada+".") ryhmad=ryhmita(vasted, lambda kirje: "-".join([morfosynt(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][3]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3)), *[morfosynt(rida) for rida in ryhm[0]], sonad(ryhm)], kaust+"/"+jada+"_parem_1sona", ["parem", "kogus", "osakaal", *["märgend"+str(nr+1) for nr in range(len(list(ryhmad.values())[0][0]))] , "tekstid"]) vasted=otsi(lausepuu, "."+jada) ryhmad=ryhmita(vasted, lambda kirje: "-".join([sonaliik(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][0]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3))], kaust+"/"+jada+"_vasak_1sona_sagedused", ["vasak", "kogus", "osakaal"]) vasted=otsi(lausepuu, jada+".") ryhmad=ryhmita(vasted, lambda kirje: "-".join([sonaliik(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][3]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3))], kaust+"/"+jada+"_parem_1sona_sagedused", ["parem", "kogus", "osakaal"]) vasted=otsi(lausepuu, ".."+jada) ryhmad=ryhmita(vasted, lambda kirje: "-".join([sonaliik(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][0])+sonaliik(ryhm[0][1]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3))], kaust+"/"+jada+"_vasak_2sona_sagedused", ["vasakpaar", "kogus", "osakaal"]) vasted=otsi(lausepuu, jada+"..") ryhmad=ryhmita(vasted, lambda kirje: "-".join([sonaliik(rida) for rida in kirje])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][3])+sonaliik(ryhm[0][4]), kogus(ryhm), str(round(100*len(ryhm)/len(vasted), 3))], kaust+"/"+jada+"_parem_2sona_sagedused", ["parempaar", "kogus", "osakaal"]) vasted=otsi(lausepuu, ".."+jada) ryhmad=ryhmita(vasted, lambda kirje: "-".join( [sonaliik(rida) for rida in kirje[:2]]+[morfosynt(rida) for rida in kirje[2:]])) tryki_mitu(ryhmad, lambda ryhm: [sonaliik(ryhm[0][0])+sonaliik(ryhm[0][1]), kogus(ryhm), "+".join([" - ".join([morfosynt(rida)+" // "+sona(rida) for rida in vaste[:2]]) for vaste in ryhm]), Counter([" - ".join([morfosynt(rida) for rida in vaste[:2]]) for vaste in ryhm ]).most_common(), str(round(100*len(ryhm)/len(vasted), 3)), *[morfosynt(rida) for rida in ryhm[0][2:]], sonad(ryhm)], kaust+"/"+jada+"_vasak_2sona_kokku", ["paar", "kogus", "paarid", "paarikogused", "osakaal", *["märgend"+str(nr+1) for nr in range(2, len(list(ryhmad.values())[0][0]))] , "tekstid"]) mustrid={ "morfosyhtaktiline_stereotyyp":["SKD", "DAV", "DVA", "DAJ", "DSK", "DPV", "VJD", "VDJ", "PSD"], "yks_lingvistiline_tunnus":["SJD", "SDD", "DDS", "DSS", "DAS", "DGS", "DDA", "DSJ", "DVS", "JDS", "JVD", "JSD", "JDA", "VDS", "ASD", "PDD"], "aheltunnus":["VDD", "VVD", "SVD", "DVV", "DDV", "DVD", "DSV"], "komplekstunnus":["DPS", "VSD", "VDA", "PVD"], "formaaltunnus":["DDD", "DJD", "DDJ", "JDD", "JDJ"], } lausepuu=laused_kokku(laused_sonad(sonaandmed)) def arvuta_mustrid(): for tyyp in mustrid.keys(): for ahel in mustrid[tyyp]: print(ahel) arvuta("laused_koos_kirjavahemarkideta/"+tyyp+"/"+ahel, ahel) arvuta_mustrid()