İçeriğe geç
academia.sh

Ders 08 / 16

Belge Hazırlama

Aynı kurgu dağarcığın ham hâlinden başlayarak dört hazırlık düzeyinin aynı kırk sorguda ölçülmesi: belge başına tek blok olarak bırakılan kaynak erişim anmasını 1,0000 ile en yükseğe çıkarıyor ama isteklerin tamamı bağlam penceresini aşıyor ve üretim 0,0000'a iniyor, yani tek sütun basılsaydı en kötü kurulum kazanırdı. Satır bazlı kaba bölme 1805 parça saklıyor ve üretimde 0,9000 veriyor, yapıya duyarlı hazırlık ise 693 parçayla 0,9250 ve önceki dersin başladığı yeri birebir üretiyor; aradaki 0,0250 bu kursun 0,0750 eşiğinin altındadır ve ölçülmemiş sayılır. Yinelenen satır süzgeci 798 satır ve 6962 belirteç atarken 568 kavram-belge bağının 96'sını yok ediyor ve sekiz belgede ana kavramın kanıtını siliyor; eşik ikiye indiğinde kayıp 283 bağa ve altmış belgeye çıkıyor. Erişim ve üretim sütunları bu kaybın hiçbirini göstermiyor.

İçindekiler

Önceki ders dağarcığı hazır bulmuştu: iki yüz belge, altı yüz doksan üç temiz paragraf, ayrı tutulmuş kod ve sınıf alanları. O hazırlık kendiliğinden olmadı. Saha ekibinin kayıtları bir form başlığı, bir kod satırı, satır ortasından bölünmüş cümleler ve bir sayfa altlığı taşır; erişim hattına giren şey bunların hepsidir.

Bu dersin sorusu tek: hazırlık erişim anmasına ne katıyor, ve hazırlığın kendisi neyi atıyor. İkinci yarısı birincisi kadar önemlidir, çünkü temizleme bir seçme işidir ve seçilmeyen her satır dağarcıktan silinir. Ayrıştırma, temizleme ve meta veri çıkarma yordamı M26/K03’ün veri toplama ve hazırlama kursunda ölçüldü ve burada tekrarlanmaz; buraya eklenen tek şey, o yordamın erişim hattındaki karşılığıdır.

  • EH8. Kod bir benzeticidir; dağarcık, ham kaynak biçimi ve sorgular kurgudur, tohum 20260218. Gömme ve dil modeli önceki dersteki tanımlardır.
  • EH9. Ham kaynak dört artık taşır: her belgede yinelenen form başlığı, metnin içine gömülü kod ve sınıf alanı, paragrafların 0,45’inde satır ortasından bölünme, ve her belgede yinelenen sayfa altlığı. Devam satırı iki boşlukla girintilidir.
  • EH10. Bölünme noktası paragrafın birinci, beşinci ya da yedinci sözcüğünden sonradır. Birinci ve yedinci nokta bir belge yüzeyini ortadan böler ve o yüzeyi arama için görünmez kılar; beşinci nokta iki yüzeyi de sağlam bırakır.
  • EH11. Ham blok belge başına tek parça bırakır. Satır bazlı her ham satırı ayrı parça sayar. Yinelenen satır süzgeci üçten çok belgede geçen satırı atar. Yapıya duyarlı hazırlık devam satırlarını birleştirir, bilinen başlık ile altlığı atar, kod ve sınıf alanını metinden çıkarıp alana yazar.
  • EH12. Ölçütler önceki dersin tanımlarıdır ve ilk üç parça getirilir; eşik 0,0750. Bedel iki birimledir: saklanan parça sayısı (her parça bir vektör tutar, vektör başına otuz iki sayı) ve saklanan belirteç.
  • EH13. Kavram-belge bağı, bir belgenin metninde bir kavramın belge yüzeyinin geçmesidir. Bu sayı sorgu kümesinden ve koşumdan bağımsızdır.

Ham Kaynağın Hâli

İlk blok kurgu dağarcığı kurar, üstüne ham kaynak biçimini uygular ve bir belgenin ham hâlini basar. Yazdırılan belgede üç bölünme vardır ve üçü de ayrı noktadadır.

# KURGUDUR. Dagarcik, kavram ekseni, gomme ve ham kaynak bicimi benzeticidir; gercek bir
# gomme uc noktasi cagrilmaz. Tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF
BOYUT = 32


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


def belirtecle(m):
    b = []
    for s in m.lower().replace(",", " , ").split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


# ---- KURGU anlam ekseni: her kavramin belge dilinde ve sorgu dilinde ayri yuzeyi var
SINIF = ["tarife", "ariza", "sayac", "kesinti", "bakim"]
KOD = {"tarife": "TR", "ariza": "AR", "sayac": "SY", "kesinti": "KS", "bakim": "BK"}
KAVRAM = {                       # kavram: (sinif, belge yuzeyi, sorgu yuzeyi)
    "basamak":   ("tarife", "kademe esigi", "hangi dilimdeyim"),
    "birim":     ("tarife", "birim ucret", "metrekup fiyati"),
    "abonetip":  ("tarife", "abone tipi", "mesken mi isyeri mi"),
    "gecis":     ("tarife", "tarife gecisi", "plan degistirme"),
    "arizakod":  ("ariza", "ariza kodu", "hata numarasi"),
    "sizinti":   ("ariza", "hat sizintisi", "su kacagi"),
    "basinc":    ("ariza", "basinc dususu", "zayif akis"),
    "ekip":      ("ariza", "saha ekibi", "gorevli ne zaman gelir"),
    "endeks":    ("sayac", "endeks degeri", "sayac ustundeki rakam"),
    "okuma":     ("sayac", "okuma yordami", "nasil kaydediliyor"),
    "degisim":   ("sayac", "sayac degisimi", "cihaz yenileme"),
    "dogrula":   ("sayac", "okuma dogrulamasi", "yanlis girilmis mi"),
    "planli":    ("kesinti", "planli kesinti", "onceden duyurulan durma"),
    "duyuru":    ("kesinti", "duyuru kanali", "nereden ogrenirim"),
    "sure":      ("kesinti", "kesinti suresi", "ne kadar surer"),
    "geridonus": ("kesinti", "yeniden verme", "ne zaman gelir"),
    "periyot":   ("bakim", "periyodik bakim", "duzenli kontrol"),
    "vana":      ("bakim", "vana kontrolu", "musluk kapatma duzeni"),
    "filtre":    ("bakim", "filtre degisimi", "temizleme parcasi"),
    "kalib":     ("bakim", "kalibrasyon kaydi", "olcum ayari"),
}
ANAHTAR = list(KAVRAM)
ORTAK = ["kayit", "bolge", "donem", "islem", "form", "onay", "not"]

# ---- KURGU dagarcik
BELGE = []
for i in range(200):
    r = uretec(TOHUM + 7919 * i)
    s = SINIF[ayrik(r(), [0.22, 0.24, 0.20, 0.18, 0.16])]
    kav = [k for k in ANAHTAR if KAVRAM[k][0] == s]
    ana = kav[int(r() * len(kav))]
    n = 2 + int(r() * 4)
    par, kavlar = [], [ana]
    for _ in range(n):
        y = kav[int(r() * len(kav))]
        kavlar.append(y)
        o = ORTAK[int(r() * len(ORTAK))]
        par.append(f"{KAVRAM[y][1]} icin {o} tutulur ve {KAVRAM[ana][1]} ile birlikte yazilir")
    BELGE.append({"kod": f"{KOD[s]}{i + 1:03d}", "sinif": s, "ana": ana, "kavram": kavlar,
                  "baslik": f"{KAVRAM[ana][1]} yordami", "par": par})


# ---- KURGU gomme: yuzey once kavrama, kavram sonra boyuta dusuruluyor
def _kavramla(m, alan=True):
    v = [0.0] * len(ANAHTAR)
    dm = " " + m.lower() + " "
    for i, k in enumerate(ANAHTAR):
        bel, sor = KAVRAM[k][1], KAVRAM[k][2]
        if bel in dm:
            v[i] += 1.0
        if sor in dm:
            v[i] += 1.0 if alan else 0.0
    if not alan:
        for o in ORTAK:
            if " " + o + " " in dm:
                for i in range(len(ANAHTAR)):
                    v[i] += 0.05
    return v


IZDUS = []
for i in range(len(ANAHTAR)):
    r = uretec(TOHUM ^ (i + 1) * 2654435761)
    IZDUS.append([r() * 2 - 1 for _ in range(64)])


def gom(m, boyut=BOYUT, alan=True):
    k = _kavramla(m, alan)
    v = [0.0] * boyut
    for i, a in enumerate(k):
        if a:
            for j in range(boyut):
                v[j] += a * IZDUS[i][j % 64]
    n = sum(x * x for x in v) ** 0.5
    return [x / n for x in v] if n else v


def aci(a, b):
    return sum(x * y for x, y in zip(a, b))


# ---- KURGU sorgu kumesi: sorgu dili belge dilinden ayri
SORGU = []
for i in range(40):
    r = uretec(TOHUM + 104729 * i)
    d = BELGE[int(r() * len(BELGE))]
    SORGU.append({"metin": f"{KAVRAM[d['ana']][2]} {ORTAK[int(r() * len(ORTAK))]}",
                  "sinif": d["sinif"], "kavram": d["ana"]})

# ---- KURGU ham kaynak: form basligi, kod alani, bolunmus paragraflar, sayfa altligi
BASLIK, ALTLIK = "bolge mudurlugu saha kayit formu", "ic kullanim icindir dagitilamaz"
HAM = []
for i, d in enumerate(BELGE):
    r = uretec(TOHUM + 3011 * i)
    s = [BASLIK, f"belge kodu {d['kod']} sinif {d['sinif']}", d["baslik"]]
    for p in d["par"]:
        w = p.split()
        if r() < 0.45:
            k = [1, 5, 7][ayrik(r(), [0.4, 0.25, 0.35])]
            s += [" ".join(w[:k]), "  " + " ".join(w[k:])]   # devam satiri iki bosluk girintili
        else:
            s.append(p)
    HAM.append(s + [ALTLIK])

j = next(i for i, s in enumerate(HAM)
         if sum(x.startswith("  ") for x in s) >= 2 and len(s) <= 10)
print("ham kaynak %s, %d satir:" % (BELGE[j]["kod"], len(HAM[j])))
for x in HAM[j]:
    print("  |" + x)
print("toplam ham satir %d, hazir paragraf %d"
      % (sum(len(s) for s in HAM), sum(len(d["par"]) for d in BELGE)))
ham kaynak SY003, 10 satir:
  |bolge mudurlugu saha kayit formu
  |belge kodu SY003 sinif sayac
  |okuma yordami yordami
  |okuma dogrulamasi icin not tutulur
  |  ve okuma yordami ile birlikte yazilir
  |sayac degisimi icin form tutulur ve okuma
  |  yordami ile birlikte yazilir
  |okuma
  |  yordami icin islem tutulur ve okuma yordami ile birlikte yazilir
  |ic kullanim icindir dagitilamaz
toplam ham satir 1805, hazir paragraf 693

Sekizinci satır tek bir sözcüktür: okuma. Devamı bir alt satırdadır. Bu belgede okuma yordami yüzeyi üç kez geçiyor ama satır sınırı yüzeyi ortadan böldüğü için o geçişlerden biri arama tarafında yok sayılır. Altıncı satır da aynı şeyi yapıyor. Bölünme kayıp değildir; hazırlık yapılmadığı sürece kayıptır.

Dört Hazırlık Düzeyi

İkinci blok dil modeli benzeticisini kurar, dört hazırlık düzeyini üretir ve dördünü aynı kırk sorguda ölçer. Yönerge tek kavramlık yanıt dayattığı için model doğrudan etiketi yazar.

import math
# ---- KURGU dil modeli benzeticisi: onceki dersin benzeticisi, yanit uzayi yirmi kavram
PENCERE = 240
ON_BILGI = {"sizinti", "basinc", "sure", "degisim", "vana", "duyuru", "gecis"}
SAYAC = [0]


def izno(m):
    h = 2166136261
    for c in m:
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


def cagir(istem, tohum=TOHUM, sicaklik=0.6):
    SAYAC[0] += 1
    b = belirtecle(istem)
    if len(b) > PENCERE:
        return {"durum": "baglam_asimi", "giris": len(b), "cikis": 0, "yanit": ""}
    if SAYAC[0] % 37 == 0:
        return {"durum": "hiz_siniri", "giris": len(b), "cikis": 0, "yanit": ""}
    r = uretec(tohum ^ izno(istem))
    dm = " " + istem.lower() + " "
    p = {k: 0.15 for k in ANAHTAR}
    for k in ANAHTAR:
        p[k] += 2.0 * dm.count(KAVRAM[k][1])             # belge dilini model taniyor
        if k in ON_BILGI and KAVRAM[k][2] in dm:
            p[k] += 2.0
    w = [math.exp(p[a] / sicaklik) for a in sorted(p)]
    y = sorted(p)[ayrik(r(), [x / sum(w) for x in w])]
    return {"durum": "tamam", "giris": len(b), "cikis": len(belirtecle(y)), "yanit": y}


YONERGE = ("Talebi su kavramlardan birine bagla: " + " , ".join(ANAHTAR) +
           " . Yanit olarak tek kavram yaz . ")


def birlestir(s):
    c = []
    for x in s:
        if x.startswith("  ") and c:
            c[-1] += " " + x.strip()                     # devam satiri geriye eklenir
        else:
            c.append(x)
    return c


SAY = {}
for s in HAM:
    for x in set(birlestir(s)):
        SAY[x] = SAY.get(x, 0) + 1


def hazirla(kip, esik=3):
    p, atilan = [], []
    for i, s in enumerate(HAM):
        if kip == "ham blok":
            c = [" ".join(s)]
        elif kip == "satir bazli":
            c = [x.strip() for x in s]
        elif kip == "yinelenen suzme":
            c = [x for x in birlestir(s) if SAY[x] < esik]
            atilan += [x for x in birlestir(s) if SAY[x] >= esik]
        else:
            c = [x for x in birlestir(s) if x not in (BASLIK, ALTLIK, BELGE[i]["baslik"])
                 and not x.startswith("belge kodu")]
        p += [{"kod": BELGE[i]["kod"], "sinif": BELGE[i]["sinif"], "metin": x,
               "kavram": [k for k in ANAHTAR if KAVRAM[k][1] in x]} for x in c]
    return p, atilan


def olc(p, k=3):
    SAYAC[0] = 0
    v = [gom(x["metin"]) for x in p]
    a = [0] * 6
    for s in SORGU:
        q = gom(s["metin"])
        ug = sorted(range(len(p)), key=lambda i: -aci(q, v[i]))[:k]
        h = [s["kavram"] in p[i]["kavram"] for i in ug]
        a[0] += any(h)
        a[1] += sum(h) / k
        a[2] += sum(p[i]["sinif"] == s["sinif"] for i in ug) / k
        y = cagir(YONERGE + "Kaynak: " + " . ".join(p[i]["metin"] for i in ug) +
                  " . Talep: " + s["metin"])
        a[3] += y["durum"] == "baglam_asimi"
        a[4] += y["giris"] + y["cikis"]
        a[5] += y["yanit"] == s["kavram"]
    return [x / len(SORGU) for x in a[:4]] + [a[4], a[5] / len(SORGU)]


print("hazirlik         parca saklanan   anma kesinlik  sinif  uretim  asim belirtec")
for kip in ("ham blok", "satir bazli", "yinelenen suzme", "yapiya duyarli"):
    p, at = hazirla(kip)
    m = olc(p)
    print("%-16s%6d %8d %6.4f %8.4f %6.4f %7.4f %5.2f %8d"
          % (kip, len(p), sum(len(belirtecle(x["metin"])) for x in p),
             m[0], m[1], m[2], m[5], m[3], m[4]))
hazirlik         parca saklanan   anma kesinlik  sinif  uretim  asim belirtec
ham blok           200    16183 1.0000   0.9667 0.9667  0.0000  1.00    12345
satir bazli       1805    16183 0.9500   0.9500 0.9500  0.9000  0.00     4412
yinelenen suzme    695     9221 0.9500   0.9500 0.9500  0.9250  0.00     5341
yapiya duyarli     693    11281 0.9500   0.9500 0.9500  0.9250  0.00     5343

Birinci satır bu dersin en önemli sayısıdır. Hazırlanmamış kaynak, erişim sütununun en iyisidir: anma 1,0000, kesinlik ve sınıf isabeti 0,9667. Sebep açık, çünkü belge başına tek parça tutulduğunda o parça belgedeki bütün kavramları taşır ve hedefi kaçırması güçleşir. Aynı satırın üretim isabeti 0,0000’dır. Bağlam aşımı payı 1,00: kırk isteğin kırkı da pencereye sığmamıştır, çünkü üç belge birden istemin içine konmuştur. Tek sütun basılsaydı bu kurulum kazanırdı.

Satır bazlı bölme öbür uçtur. Anma 0,9500’e iner, çünkü bölünmüş yüzeyler artık aranamaz; buna karşılık istek başına belirteç en düşük değerdedir (4412), zira getirilen satırlar kısadır. Bedeli saklanan parça sayısında ödenir: 1805 vektör, yani yapıya duyarlı hazırlığın 2,6 katı, üstelik saklanan belirteç aynı kalarak. Üretim 0,9000’dır ve yapıya duyarlı hazırlığın 0,9250’siyle arasındaki fark 0,0250, yani bu kursun 0,0750 eşiğinin altındadır: ölçülmemiş sayılır. Bu iki kurulum arasındaki ölçülmüş fark isabette değil, saklanan vektör sayısındadır.

Son satır önceki dersin başladığı yerdir: 693 parça, 0,9500 anma, 0,9250 üretim, 5343 belirteç. Yapıya duyarlı hazırlığın çıktısı, birinci dersin girdisidir.

Hazırlığın Attığı

Üçüncü satır ucuz görünüyor: saklanan belirteci 11281’den 9221’e indiriyor ve isabetin hiçbir sütununu oynatmıyor. Yinelenen satır süzgeci bir tahmine dayanır: aynı metin çok belgede geçiyorsa artıktır. Form başlığı ve sayfa altlığı için doğrudur. Kayıt dili kalıplı olduğu için gerçek paragraflar da yinelenir.

def baglar(p):
    return {(x["kod"], k) for x in p for k in x["kavram"]}


tam = baglar(hazirla("yapiya duyarli")[0])
print("yapiya duyarli hazirligin kurdugu kavram-belge bagi:", len(tam))
print("esik  parca  atilan satir  atilan belirtec  kaybolan bag  anasiz belge    anma  uretim")
for e in (2, 3, 4):
    p, at = hazirla("yinelenen suzme", e)
    b = baglar(p)
    m = olc(p)
    print("%4d %6d %13d %16d %13d %13d  %6.4f  %6.4f"
          % (e, len(p), len(at), sum(len(belirtecle(x)) for x in at), len(tam - b),
             sum((d["kod"], d["ana"]) not in b for d in BELGE), m[0], m[5]))
yapiya duyarli hazirligin kurdugu kavram-belge bagi: 568
esik  parca  atilan satir  atilan belirtec  kaybolan bag  anasiz belge    anma  uretim
   2    427          1066            11357           283            60  0.9500  0.9250
   3    695           798             6962            96             8  0.9500  0.9250
   4    835           658             4714            17             0  0.9500  0.9250

Üç eşiğin üçünde de anma 0,9500, üretim 0,9250. Sorgu kümesi hiçbir şey görmüyor. Oysa eşik üçte süzgeç 798 satır ve 6962 belirteç atıyor; dağarcığın kurduğu 568 kavram-belge bağının 96’sı yok oluyor ve sekiz belgede o belgenin kendi ana kavramının kanıtı kalmıyor. Eşik ikiye indirildiğinde kayıp 283 bağa ve altmış belgeye çıkıyor, saklanan belirtecin üçte ikisi gidiyor, ve iki ölçüt sütunu hâlâ kımıldamıyor.

Buradaki asıl ders ölçme üzerinedir. Kırk sorgu iki yüz belgenin yirmi kavramını örneklemez; sorulmayan bir kavramın kanıtının silinmesi bu ölçümde görünmez. Kavram-belge bağı sayısı ise koşumdan ve sorgu kümesinden bağımsızdır: dağarcığın ne kadarının hâlâ aranabilir olduğunu, hiç sorgu koşturmadan söyler. Temizleme kuralı seçilirken bakılacak sayı budur.

Özet

  • Hazırlığın erişim hattındaki karşılığı iki ayrı sorudur: anmaya ne kattığı ve neyi attığı. İkincisi erişim ve üretim sütunlarında görünmeyebilir.
  • Hazırlanmamış kaynak erişim sütununun en iyisidir (anma 1,0000) ve üretim sütununun en kötüsü (0,0000); kırk isteğin kırkı da bağlam penceresini aşıyor.
  • Satır bazlı kaba bölme 1805 vektör saklıyor, yapıya duyarlı hazırlık 693; aradaki üretim farkı 0,0250, yani eşiğin altında. Ölçülmüş kazanç isabette değil, saklanan vektör sayısındadır.
  • Yapıya duyarlı hazırlık 693 parça, 0,9500 anma ve 0,9250 üretim verir; bu, önceki dersin başladığı noktadır.
  • Yinelenen satır süzgeci eşik üçte 798 satır ve 6962 belirteç atarken 568 kavram-belge bağının 96’sını siliyor; eşik ikide kayıp 283 bağ ve altmış belgedir.
  • Kavram-belge bağı sayısı sorgu kümesinden bağımsız bir ölçüdür ve temizleme kararının asıl ölçütüdür.

Sonraki Adım

Yapıya duyarlı hazırlık bir sınırı verili kabul etti: kaynağın kendi paragraf sınırı. Devam satırları birleştirildi, başlık ve altlık atıldı, ama paragrafın nerede biteceği kaynağın kararı olarak bırakıldı. O sınır bir karardır ve erişim hattının ölçtüğü her şeyi değiştirir. Parça küçüldükçe kesinlik yükselir ve sınır üstündeki yüzeyler kaybolur; büyüdükçe anma yükselir ve bağlam penceresi doluverir. Sonraki ders bu sınırı eline alır: parça boyutu ile örtüşmeyi süpürür, her kurulumun anmasını, saklanan parça sayısını ve saklanan belirtecini yan yana basar, ve örtüşmenin kazandırdığının maliyetini karşılamayı bıraktığı noktayı sayar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat