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.