Ders 07 / 14
Metin Üretimi ve Özetleme
Çıktının bir etiket değil metin olduğu görevlerde ölçütün ne ödüllendirdiğinin sayılması: girdiyi olduğu gibi geri veren, hiçbir şey öğrenmemiş bir yordam örtüşme temelli ölçütün duyarlılık yönünde 1,0000 alıyor ve dört yordamın birincisi oluyor. Aynı yordam kesinlik yönünde 0,6362, dengeli biçimde 0,7777 veriyor ve üçüncülüğe düşüyor. Kopyanın sonuna sekiz ilgisiz sözcük eklendiğinde duyarlılık 1,0000'de kalırken kesinlik 0,6362'den 0,2700'e iniyor. Kaynak metnin içeriğini doğru bildiren ama başka sözcüklerle yazan üretici yordam dengeli biçimde 0,0684, iki'li dizide 0,0114 alıyor; içerik denetiminde 0,9320 ile ikinci sırada.
İçindekiler
Altı derste modelin çıktısı hep bir etiketti ve doğru cevap elde vardı. Bir saha notunun özeti istendiğinde bu kurulum çöker: aynı içeriği taşıyan birden çok doğru özet vardır ve hiçbiri “doğru cevap” listesinde yazılı değildir. Denetçinin yazdığı özet bir örnektir, tek doğru değil.
Bu durumda ölçüt, aday metin ile kaynak metin arasındaki örtüşmeye çevrilir: kaç sözcük, kaç ikili dizi ortaktır. Ölçüt böylece hesaplanabilir olur — ama ne ödüllendirdiği ayrı bir sorudur ve bu ders o soruyu sayıyla cevaplar. Cevabın en sert biçimi şudur: girdiyi olduğu gibi geri veren, hiçbir şey öğrenmemiş bir yordam bu ölçütte alınabilecek en yüksek sayıyı alır.
- NL56. Metin kurgusu önceki derslerinkiyle aynıdır ve kurgudur; tohum 20260218.
- NL57. Kaynak özet de kurgudur ve bir kuralla üretilir: notun kendi olay türünden gelen öbekler tutulur, ödünç alınan yan kayıt, gürültü ifadesi ve hat işareti atılır. Bu, özetin notun kendi sözcüklerinden kurulduğu anlamına gelir ve dersin sonucunun kaynağıdır.
- NL58. Kurgu, kararı bildiren öbeğin notun başında yazıldığını varsayar. “İlk öbek” yordamının içerik ölçüsündeki sayısı bu varsayımın sonucudur, bir yöntem üstünlüğü değil.
- NL59. Örtüşme iki yönde ayrı ayrı hesaplanır: kesinlik yönü (adayın n’li dizilerinin kaçı kaynakta var) ve duyarlılık yönü (kaynağın n’li dizilerinin kaçı adayda var). Dengeli biçim ikisinin uyumlu ortalamasıdır. Ölçüt tekil sözcük (1’li) ve ikili dizi (2’li) üzerinde ölçülür.
- NL60. Tekrarlı n’li diziler kırpılarak sayılır: adaydaki bir dizi kaynakta kaç kez geçiyorsa o kadar sayılır. Aksi hâlde aynı sözcüğü yineleyen bir aday kesinliği şişirir.
- NL61. Alanın tabanı girdiyi olduğu gibi geri vermektir. Özetleme görevinde bu, en aptal yordamdır: hiçbir seçim yapmaz, hiçbir şey öğrenmez, girdiyi çıktı diye yazar.
- NL62. İçerik denetimi ölçütten ayrı bir sayıdır: adayın işaret ettiği olay türleri kümesi, notun gerçek türüne eşit mi. Bu sayı örtüşme ölçütünün göremediğini ölçer.
- NL63. Seçici ve üretici yordamların ağırlıkları yalnız eğitim kümesinden öğrenilir; ayrılmış küme son 500 nottur.
Kaynak Metin ve Aday Metin
Ölçütün iki ucu vardır: denetçinin yazdığı kaynak metin ve yordamın ürettiği aday metin. Kurgu, kaynak metni notun kendi öbeklerinden seçerek kurar — gerçek özetleyicilerin de sıkça yaptığı gibi. Bu seçimin bedeli dersin sonunda ortaya çıkar.
# KURGU saha notlari — M27/K02'nin not alaninin genisletilmis hali. Tohum 20260218. TOHUM, M32 = 20260218, 0xFFFFFFFF TUR = ("olagan", "erisilemedi", "sayac arizasi", "kacak suphesi") PAY = (0.46, 0.22, 0.19, 0.13) OBEK = {t: s.split("|") for t, s in zip(TUR, ( "okuma normal|okuma normaldi|sayac erisimi saglandi|sayaca erisildi|olcum tekrarlandi|" "olcumu yineledik|vana kontrol edildi|vanada sorun yok|kapak temiz|kapakta iz yok|" "gosterge okunakli|gostergede rakam net", "abone evde degildi|abone bulunamadi|erisim saglanamadi|erisim yok|kapi zili calismiyor|" "zil calismadi|bahce kapisi kilitli|bahce kapisi kapali|bodrum katina inilemedi|" "bodrum kilitli|adres bulunamadi|adres eksik", "gosterge donmuyor|gostergede hareket yok|sayac cami kirik|sayacin cami catlak|" "rakam okunmuyor|rakamlar silik|ibre sabit kalmis|ibre kilitli|mekanizma takilmis|" "mekanizmada takilma|sayac durmus|sayac calismiyor", "muhur izi var|muhurde iz goruldu|muhur kopmus|muhurler kopuk|baglanti degistirilmis|" "baglantida degisiklik|kelepce gevsek|kelepcede gevseme|boru ek yeri yeni|boruda yeni ek|" "sayac ters takilmis|sayaci ters takmislar"))} GURULTU = ("arac park halinde|kapak kirli|hava yagisli|adres teyit edildi|not kisa tutuldu|" "ikinci ziyaret|bahce icinde|kaldirim uzerinde").split("|") BOLGE = "kuzey hatti|guney hatti|dogu hatti|bati hatti|merkez hatti".split("|") KLM = {c: t for t in TUR for c in OBEK[t]} 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 not_ozet(no): r = uretec(TOHUM + 41000 + no) u, k = r(), 0.0 for i, p in enumerate(PAY): k += p if u < k: t = TUR[i] break p = [OBEK[t][int(r() * 12)]] if r() < 0.55: p.append(OBEK[t][int(r() * 12)]) if r() < 0.34: p.append(OBEK[TUR[int(r() * 4)]][int(r() * 12)]) if r() < 0.62: p.append(GURULTU[int(r() * 8)]) if r() < 0.30: p.append(BOLGE[int(r() * 5)]) return {"metin": ", ".join(p), "tur": t, "obek": p, "ozet": ", ".join(c for c in p if KLM.get(c) == t)} VERI = [not_ozet(i) for i in range(1600)] EGT, SIN = VERI[:1100], VERI[1100:] for i in (25, 40): print(f"not : {VERI[i]['metin']}") print(f"ozet : {VERI[i]['ozet']} ({VERI[i]['tur']})") print("ort not", round(sum(len(x["metin"].split()) for x in SIN) / len(SIN), 2), "ort ozet", round(sum(len(x["ozet"].split()) for x in SIN) / len(SIN), 2))
not : bodrum katina inilemedi, abone evde degildi, sayac cami kirik, bahce icinde ozet : bodrum katina inilemedi, abone evde degildi (erisilemedi) not : vanada sorun yok, gostergede rakam net, sayac durmus, kuzey hatti ozet : vanada sorun yok, gostergede rakam net (olagan) ort not 6.61 ort ozet 3.99
Ortalama not 6,61 belirteç, ortalama özet 3,99 belirteç. Özet notun yaklaşık beşte üçü uzunluğunda ve tamamı notun içinden geliyor. Bu iki cümle, sonraki tablonun ilk satırını önceden belirler.
Dört Yordam, Altı Sayı
Dört yordam karşılaştırılır. Girdiyi kopyala notu olduğu gibi yazar. İlk öbek yalnız ilk virgüle kadarını yazar. Öğrenilmiş seçici her öbek için “bu öbek eğitim kümesinde özete kaç kez girdi” oranını sayar ve yarıdan yukarısını tutar. Üretici yordam hiçbir öbeği kopyalamaz: notun öbeklerinden olay türünü kestirir ve o türün kanonik cümlesini yazar — çıktısı notta geçmeyen sözcüklerden kurulur.
def blr(m): return [w.strip(",").lower() for w in m.split() if w.strip(",")] def nli(z, n): return [tuple(z[i:i + n]) for i in range(len(z) - n + 1)] def ortusme(aday, kaynak, n=1): a, k = nli(blr(aday), n), nli(blr(kaynak), n) if not a or not k: return 0.0, 0.0 ort = 0 kalan = list(k) for g in a: if g in kalan: kalan.remove(g) ort += 1 return ort / len(a), ort / len(k) # --- yordamlar def y_kopya(x): return x["metin"] def y_ilk(x): return x["obek"][0] AGIR = {} for x in EGT: for c in x["obek"]: a = AGIR.setdefault(c, [0, 0]) a[0] += 1 a[1] += c in x["ozet"].split(", ") SEC = {c: (a[1] / a[0]) for c, a in AGIR.items()} def y_secici(x): p = [c for c in x["obek"] if SEC.get(c, 0.0) > 0.5] return ", ".join(p) if p else x["obek"][0] OZ = {"olagan": "olagan okuma", "erisilemedi": "erisim yok", "sayac arizasi": "sayac arizasi", "kacak suphesi": "kacak suphesi"} PUAN = {} for x in EGT: for c in x["obek"]: if c in KLM: PUAN.setdefault(c, {}) PUAN[c][x["tur"]] = PUAN[c].get(x["tur"], 0) + 1 def y_uretici(x): s = {} for c in x["obek"]: for t, v in PUAN.get(c, {}).items(): s[t] = s.get(t, 0) + v t = max(s, key=s.get) if s else "olagan" return OZ[t] + " bildirildi" ISARET = dict(KLM, **{OZ[t]: t for t in TUR}) def icerik(aday, x): var = {ISARET[c] for c in ISARET if c in aday} return 1 if var == {x["tur"]} else 0 YORDAM = (("girdiyi kopyala", y_kopya), ("ilk obek", y_ilk), ("ogrenilmis secici", y_secici), ("uretici yordam", y_uretici)) SONUC = {} print(f"{'yordam':<19}{'uzunluk':>8}{'duyarlilik':>11}{'kesinlik':>9}" f"{'dengeli':>8}{'2li dengeli':>12}{'icerik':>8}") for ad, f in YORDAM: u = d1 = k1 = d2 = k2 = ic = 0.0 for x in SIN: a = f(x) u += len(blr(a)) p, r = ortusme(a, x["ozet"], 1) k1 += p d1 += r p2, r2 = ortusme(a, x["ozet"], 2) k2 += p2 d2 += r2 ic += icerik(a, x) n = len(SIN) u, d1, k1, d2, k2, ic = u / n, d1 / n, k1 / n, d2 / n, k2 / n, ic / n g1 = 2 * d1 * k1 / (d1 + k1) if d1 + k1 else 0.0 g2 = 2 * d2 * k2 / (d2 + k2) if d2 + k2 else 0.0 SONUC[ad] = (u, d1, k1, g1, g2, ic) print(f"{ad:<19}{u:>8.2f}{d1:>11.4f}{k1:>9.4f}{g1:>8.4f}{g2:>12.4f}{ic:>8.4f}") for j, ad in ((1, "duyarlilik"), (3, "dengeli"), (5, "icerik")): s = sorted(SONUC, key=lambda a: -SONUC[a][j]) print(f"{ad:<11} siralama: " + " > ".join(s))
yordam uzunluk duyarlilik kesinlik dengeli 2li dengeli icerik girdiyi kopyala 6.61 1.0000 0.6362 0.7777 0.7265 0.7440 ilk obek 2.41 0.6901 1.0000 0.8167 0.7576 1.0000 ogrenilmis secici 4.60 1.0000 0.8948 0.9445 0.9312 0.7440 uretici yordam 3.00 0.0622 0.0760 0.0684 0.0114 0.9320 duyarlilik siralama: girdiyi kopyala > ogrenilmis secici > ilk obek > uretici yordam dengeli siralama: ogrenilmis secici > ilk obek > girdiyi kopyala > uretici yordam icerik siralama: ilk obek > uretici yordam > girdiyi kopyala > ogrenilmis secici
İlk satır bu dersin kursa ödediği borçtur. Girdiyi olduğu gibi geri veren yordam duyarlılık yönünde 1,0000 alıyor — ölçekte alınabilecek en yüksek sayı — ve dört yordamın birincisi oluyor. Bu yordam hiçbir eğitim görmedi, hiçbir parametresi yok, hiçbir seçim yapmıyor. Sayının nedeni kurgunun tanımındadır: kaynak özet notun kendi sözcüklerinden kurulduğu için, notun tamamını yazan bir aday kaynağın her dizisini zorunlu olarak kapsar. Duyarlılık yönü kapsamayı ölçer ve kapsamanın en ucuz yolu her şeyi yazmaktır.
Aynı yordam kesinlik yönünde 0,6362, dengeli biçimde 0,7777 alıyor ve üçüncülüğe düşüyor. Üç sıralama satırı yan yana okunduğunda dört yordamın sırası üç ölçütte üç ayrı biçimde çıkıyor; “hangi yordam daha iyi” sorusunun cevabı hangi sayının basıldığına bağlı.
Son satır ikinci borçtur. Üretici yordam içerik denetiminde 0,9320 alıyor — dört yordamın ikincisi — ama örtüşme ölçütünün dengeli biçiminde 0,0684, iki’li dizide 0,0114. Ölçüt bu yordamı neredeyse hiç göremiyor, çünkü doğru şeyi başka sözcüklerle söylüyor. Örtüşme temelli bir ölçüt sözcük paylaşımını ölçer, bildirimin doğruluğunu değil.
İkinci satır bir uyarı taşır. “İlk öbek” yordamı içerik denetiminde 1,0000 alıyor ve bu sayı bir yöntem üstünlüğü değildir: kurgu, kararı bildiren öbeğin notun başında yazıldığını varsayar, o yüzden ilk öbeği almak türü hiçbir zaman kaçırmaz. Aynı yordam duyarlılıkta 0,6901’de kalıyor, çünkü notların bir bölümünde kaynak özet iki öbekten oluşuyor ve ikincisi atılıyor. Bir sayının kurgunun hangi maddesinden geldiği yazılmadığında, bu satır “en iyi özetleyici en kısa olanıdır” gibi okunabilir; kurgu yazıldığında öyle okunamaz.
İki’li dizi sütunu tekil sözcük sütununu tekrarlamaz. Kopyanın dengeli biçimi 0,7777’den 0,7265’e, seçicininki 0,9445’ten 0,9312’ye, üretici yordamınki 0,0684’ten 0,0114’e iniyor. Dizi uzunluğu arttıkça ölçüt sözcük seçimine değil sıraya da bakmaya başlar ve başka sözcüklerle yazılmış bir aday için ceza altı katına çıkar.
Öğrenilmiş seçicinin 0,9445’i ile içerik ölçüsündeki 0,7440’ı arasındaki mesafe aynı boşluğun öbür yüzüdür: seçici kaynak özetin sözcüklerini isabetle buluyor ama ödünç alınmış yan kaydı da tutuyor, yani özetin bildirdiği olay türü dörtte bir olayda yanlış çıkıyor. Ölçüt bunu görmez, çünkü o yan kayıt da notun içindedir ve kaynakta yoksa yalnız kesinliği bir miktar düşürür.
Ölçüt Neyi Ödüllendiriyor
Duyarlılık yönünün kapsamayı ödüllendirdiği iddiası doğrudan sınanabilir: kopyanın sonuna kaynak özette hiç geçmeyen sözcükler eklenir ve sayıların hangisinin kımıldadığına bakılır.
# Olcut neyi odullendiriyor: adayin sonuna ilgisiz sozcuk eklendiginde ne oluyor. DOLGU = "kayit alindi ekip donusu form imzalandi saat girildi".split() print(f"{'aday':<26}{'uzunluk':>8}{'duyarlilik':>11}{'kesinlik':>9}" f"{'dengeli':>8}{'icerik':>8}") for e in (0, 2, 4, 8): u = d = k = ic = 0.0 for x in SIN: a = x["metin"] + ("" if e == 0 else " " + " ".join(DOLGU[:e])) u += len(blr(a)) p, r = ortusme(a, x["ozet"], 1) k += p d += r ic += icerik(a, x) n = len(SIN) u, d, k, ic = u / n, d / n, k / n, ic / n print(f"{'girdiyi kopyala + ' + str(e) + ' dolgu':<26}{u:>8.2f}{d:>11.4f}" f"{k:>9.4f}{2 * d * k / (d + k):>8.4f}{ic:>8.4f}") d0, k0, g0, i0 = SONUC["uretici yordam"][1], SONUC["uretici yordam"][2], \ SONUC["uretici yordam"][3], SONUC["uretici yordam"][5] print(f"{'uretici yordam':<26}{SONUC['uretici yordam'][0]:>8.2f}{d0:>11.4f}" f"{k0:>9.4f}{g0:>8.4f}{i0:>8.4f}") esit = [c for c in SIN if ortusme(y_kopya(c), c["ozet"], 1)[1] < 1.0] print(f"kopyada duyarliligi 1,0000'in altinda kalan not: {len(esit)}/{len(SIN)}")
aday uzunluk duyarlilik kesinlik dengeli icerik girdiyi kopyala + 0 dolgu 6.61 1.0000 0.6362 0.7777 0.7440 girdiyi kopyala + 2 dolgu 8.61 1.0000 0.4685 0.6381 0.7440 girdiyi kopyala + 4 dolgu 10.61 1.0000 0.3750 0.5454 0.7440 girdiyi kopyala + 8 dolgu 14.61 1.0000 0.2700 0.4252 0.7440 uretici yordam 3.00 0.0622 0.0760 0.0684 0.9320 kopyada duyarliligi 1,0000'in altinda kalan not: 0/500
Duyarlılık sütunu dört satırda da tam olarak 1,0000. Aday metnin uzunluğu 6,61’den 14,61’e, iki katından fazlasına çıkarken bu sayı bir basamak bile oynamıyor; içerik denetimi de oynamıyor, çünkü eklenen sözcükler hiçbir olay türüne işaret etmiyor. Kımıldayan tek sayı kesinliktir: 0,6362’den 0,2700’e iniyor ve dengeli biçimi 0,7777’den 0,4252’ye çekiyor. Yalnız duyarlılık yönü basılan bir raporda, aday metne ilgisiz sözcük eklemek bedava bir işlemdir.
Son satır kopyanın 1,0000’ini beş yüz notun beş yüzünde de aldığını söylüyor. Bu bir ortalama değil, bir kimliktir: kurgunun kaynak özeti notun alt kümesi olduğu sürece kopya duyarlılıkta hiçbir zaman 1,0000’in altına düşemez. Gerçek özetlerin çoğu da bu özelliği taşır, çünkü özetleyiciler kaynağın sözcüklerini yeniden kullanır. Ölçütün bir yordamı ödüllendirmesi ile o yordamın bir şey öğrenmiş olması arasında bu kurulumda hiçbir bağ yoktur.
Özet
- Çıktı metin olduğunda tek bir doğru cevap yoktur; ölçüt aday metin ile kaynak metin arasındaki örtüşmeye çevrilir ve iki yönde ayrı ayrı okunur.
- Girdiyi olduğu gibi geri veren yordam duyarlılık yönünde 1,0000 alır ve dört yordamın birincisidir; kesinlik yönünde 0,6362 alır ve üçüncülüğe düşer.
- Kopyanın sonuna sekiz ilgisiz sözcük eklendiğinde duyarlılık 1,0000’de kalır, kesinlik 0,2700’e iner: ölçütün duyarlılık yönü kapsamayı ödüllendirir, doğruluğu değil.
- Ölçüt sözcük paylaşımını görür, bildirimin doğruluğunu görmez: üretici yordam içerik denetiminde 0,9320 alırken dengeli biçimde 0,0684, iki’li dizide 0,0114 alır.
- Aynı dört çıktı üç ölçütte üç ayrı sıralama verir; hangi yordamın daha iyi olduğu, hangi sayının basıldığına bağlıdır.
Sonraki Adım
Bu derste üç ölçüt üç ayrı sıralama verdi ve her birinin yanına neyin ödüllendirildiği yazıldı. Aynı sorun bu kursun bütün görevlerinde vardır: belirteç düzeyinde okunan bir sayı ile varlık düzeyinde okunan sayı aynı çıktıyı iki ayrı biçimde sıralar, dengesiz bir sınıf kümesinde genel doğruluk ile sınıf başına ortalama başka türlü sıralar. Sonraki ders konunun kapanışıdır: aynı dört çıktı dört ölçütte dört ayrı sıralama verir ve her ölçütün hangi tabana karşı okunması gerektiği tek tek yazılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.