---
title: 'Metin Üretimi ve Özetleme'
source: 'https://academia.sh/tr/kurslar/nlp-ve-goru/metin-uretimi-ve-ozetleme'
course: 'Doğal Dil İşleme ve Bilgisayarla Görme'
language: tr
updated: '2026-08-17T18:10:15+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

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.

```python
# 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.

```python
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.

```python
# 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.
