<jupyter_start><jupyter_text>1 - e-posta baten histogramaAhalik eta funtzio gehien sortuko ditugu, azpiproblema bakoitza funtzio beten bidez adierazteko. Adibidez:* e-posta batetako testua, ilara zerrenda moduan (goiburua deskartatu)* hitz batetako ertzetatik puntuazio zeinuak kendu* hitz bat soilik karaktere alfabetikoez osotua ote dagoen<jupyter_code>def eposta(bideizena,kodifikazioa="utf-8"):
    with open(bideizena,encoding=kodifikazioa) as f:
        for ilara in f:
            if ilara == "\n" :
                break
        return list(f)<jupyter_output><empty_output><jupyter_text>`string` modulua erabil dezakegu puntuazio zeinu guztiak lortzeko (seguruenik batenbat ahaztuko genuke...):<jupyter_code>import string
string.punctuation
def hitza_garbitu(w):
    
    return ...<jupyter_output><empty_output><jupyter_text>Prozesatzera goazen testuak ingelesez daudenez, `string.ascii_letters` erabil dezakegu:<jupyter_code>string.ascii_letters
def soilik_alfa(w):
    
    return True/False<jupyter_output><empty_output><jupyter_text>Aurreko funtzioak erabiliz, `histograma` funtzioa askozaz errazagoa izango da:<jupyter_code>def histograma(bideizena):
    h = {}
    for ilara in eposta(bideizena):
        for w in ilara.split():
            w = hitza_garbitu(w)
            if soilik_alfa(w) :
                w = w.lower()
                h[w] ...
    return h<jupyter_output><empty_output><jupyter_text>2 - histogramen *batura*Bi histograma ditugularik, beraien batura histograma bat izango da. Histograma horretan, batutako bi histogrametako hitz guztiak agertuko dira eta balioak hi histogrametako balioen batura izango da.<jupyter_code>def hist_batura(h1,h2):
    # h1 = h1 + h2
    # return h1 + h2<jupyter_output><empty_output><jupyter_text>3 - histogramen normalizazioaAgerpen kopuruetatik maiztasunetara<jupyter_code>def hist_norm(h):
    ...
    return hnorm
h = ...
h_norm = hist_norm(h)
sum(h_norm.values()) == 1<jupyter_output><empty_output><jupyter_text>4 - Gai baten eredua sortuGai batetako eredua (histograma normalizatua) lortzeko, gai horretako korreo guztien histogramen batura kalkulatuko dugu eta azkenik histograma hori normalizatu:$$h_{gaia} = norm \left( \sum_{posta \in gaia}{h_{posta}} \right)$$Hau lortzeko ondoko pausuak emango ditugu:* Gai batetako entrenamenduko fitxategi bideizenen zerrenda lortu* Bideizen zerrenda batetako korrreoen histogramen batura lortu* Histogramen baturaren normalizazioa egin  Entrenamenduko fitxategiakGai bat dugularik, adibidez `alt.atheism`, bere entrenamenduko fitxategien bideizen zerrenda `20news-bydate/listas_train/alt.atheism.txt` fitxategian egongo da. Gure kasuan:<jupyter_code>karpeta = '/home/data/'
gaia = 'alt.atheism'
bideizena = karpeta + '20news-bydate/listas_train/' + gaia + '.txt'<jupyter_output><empty_output><jupyter_text>Fitxategi horretan, ilara bakoitzean entrenamenduko korreo baten bideizen **erlatiboa** agertzen da:```20news-bydate-train/alt.atheism/4996020news-bydate-train/alt.atheism/5106020news-bydate-train/alt.atheism/5111920news-bydate-train/alt.atheism/5112020news-bydate-train/alt.atheism/51121...```Ondoko kodeak, esaterako, bideizen guzti horiek dituen zerrenda lortuko du:<jupyter_code>karpeta = '/home/data/'
gaia = 'alt.atheism'
bideizena = karpeta + '20news-bydate/listas_train/' + gaia + '.txt'
with open(bideizena,encoding="utf8") as f:
    izenak = f.readlines()<jupyter_output><empty_output><jupyter_text>Baina bideizen horiek ez dira absolutuak (aurretik '/home/data/20news-bydate/') gehitu behar zaie eta amaieran duten `"\n"`-a kendu behar zaie. Sortu gai baten entrenamenduko bideizen absolutuen zerrenda bueltatuko duen funtzioa:<jupyter_code>def gaiko_entrenamendu_bideizenak(gaia):
    z = []
    ...
    return z<jupyter_output><empty_output><jupyter_text>Sortu gai batetako eredua, hau da, histogramen batura normalizatua lortuko duen funtzioa:<jupyter_code>def eredua(gaia):
    H = {}
    for bideizena in gaiko_entrenamendu_bideizenak(gaia):
        # h = histograma(...)
        # joan H-n h guztiak batzen
    # H normalizatu
    # emaitza buetatu<jupyter_output><empty_output><jupyter_text>5 - Gai guztien ereduak sortu`20news-bydate/gaiak.txt` fitxategian gai guztiak ditugu. Sortu gai guztien izen zerrenda bueltatuko duen funtzioa:<jupyter_code>def gai_zerrenda():
    ...<jupyter_output><empty_output><jupyter_text>Azkenik sortu gai bakoitzaren eredua.<jupyter_code>def Ereduak():
    # Eredu guztiak gordetzen dituen (hiztegien) hiztegia sortu
    # E[gaia] = eredua(gaia)
    return E<jupyter_output><empty_output><jupyter_text>6 - Histograma normalizatuen arteko distantzia Gainjartze distantzia$$d(h_{a},h_{b}) = 1 - \sum_{w \in a}{\min(h_{a}(w),h_{b}(w))}$$ Euklidesen distantzia$$d(h_{a},h_{b}) = \sqrt{ \sum_{w \in a,b}{(h_{a}(w)-h_{b}(w))^2} }$$ korrelazio distantzia$$d(h_{a},h_{b}) = 1 - \sum_{w \in a}{h_{a}(w) \cdot h_{b}(w)}$$<jupyter_code>def dist_gainjartze(ha,hb):
def dist_euklides(ha,hb):
def dist_korrelazio(ha,hb):<jupyter_output><empty_output><jupyter_text>7 - Histograma normalizatua sailkatu<jupyter_code>def sailkatu(h,E,dist=dist_gainjartze):
    #dist()
    z = [ (d,gaia) , (d,gaia) , (d,gaia), ... ]
    z.sort()
    return z<jupyter_output><empty_output><jupyter_text>8 - Errore tasa neurtuTest-eko posta elektroniko bat sailkatzen dugunean lehenengo posizioan postari dagokion gaia ez badago, sailkapen errore bat dugu. Errore tasa, $k$ errore kopurua eta $N$ posta kopuru arteko zatidura izango da:$$errore\_tasa = \frac{k}{N}$$  test-eko fitxategiakGai bat dugularik, adibidez `alt.atheism`, bere test-eko fitxategien bideizen zerrenda `20news-bydate/listas_test/alt.atheism.txt` fitxategian egongo da. Gure kasuan:<jupyter_code>karpeta = '/home/data/'
gaia = 'alt.atheism'
#frogak egiteko
#bideizena = karpeta + '20news-bydate/listas_minitest/' + gaia + '.txt'
bideizena = karpeta + '20news-bydate/listas_test/' + gaia + '.txt'
def gaiko_test_bideizenak(gaia):
    z = []
    ...
    return z<jupyter_output><empty_output><jupyter_text>Errore tasa lortu<jupyter_code>def errore_tasa(E,dist=dist_gainjartze):
    #gai bakoitza zeharkatu
    for gaia in ... :
        #gaiko test-eko bideizenak zeharkatu
        for bideizena in ...
            #histograma normalizatua lortu
            #sailkatu
            #lehenengo gaia zuzena ez bada, errorea kontabilizatu
    return k/N<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11170296099013004, 'fraction_numerical': 0.011279962400125333, 'mean_word_length': 5.011299435028248, 'pattern_counts': {'":': 0, '<': 65, '<?xml version=': 0, '>': 65, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '3509', 'license': 'MIT', 'n_tokens_mistral': 2726, 'n_tokens_neox': 2643, 'n_words': 496, 'path': 'Laborategia/.ipynb_checkpoints/Laborategia 1-checkpoint.ipynb', 'repo_name': 'mpenagar/Programazioaren-Oinarriak', 'size': '6383'}