Python ile Matematiksel Ağırlıklı Otomatik Makale Özetleyici

Uzun bir makaleyi okumadan önce “bana özü ver” demek, modern yazılımcının kahve istemesi kadar doğal hale geldi. Python ile geliştireceğimiz otomatik özetleyici, metindeki cümleleri matematiksel olarak puanlayıp en önemli olanları seçer. Yani modelimiz metni yeniden yazmaz; metnin içinden en temsilî cümleleri avlar. Bu yönteme çıkarımsal özetleme denir ve haberlerden akademik yazılara kadar birçok alanda oldukça kullanışlıdır.

``

Fikir: Her Cümle Bir Adaydır

Bir makaleyi cümlelere böldüğümüzde aslında elimizde küçük aday özet parçaları oluşur. Amacımız, her cümleye bir önem puanı vermektir. Bu puan; kelime sıklığı, cümlenin konumu ve metnin genel temasına benzerliği gibi sinyallerden oluşabilir.

Basit bir ağırlık formülü şöyle düşünülebilir:

$score(s)=0.5 \times freq(s)+0.3 \times sim(s)+0.2 \times pos(s)$

Burada $freq(s)$ cümlede geçen önemli kelimelerin toplam ağırlığıdır. $sim(s)$ cümlenin tüm belge vektörüne benzerliğini, $pos(s)$ ise cümlenin metindeki stratejik konumunu temsil eder. Örneğin giriş ve sonuç bölümlerindeki cümleler çoğu zaman daha bilgilendiricidir.

Özellik Ne Ölçer? Neden Önemli?
Kelime sıklığı Anahtar kelimelerin yoğunluğu Konunun merkezini yakalar
Kosinüs benzerliği Cümle ile belge arasındaki yakınlık Temsil gücünü ölçer
Konum puanı Cümlenin metindeki yeri Giriş/sonuç etkisini hesaba katar

Teorik Altyapı: TF-IDF ve Kosinüs Benzerliği

Kelime saymak tek başına yeterli değildir. “ve”, “bir”, “ile” gibi kelimeler çok geçer ama anlam taşıma güçleri düşüktür. Bu yüzden TF-IDF kullanırız. TF, bir kelimenin cümlede ne kadar sık geçtiğini; IDF ise o kelimenin tüm cümleler arasında ne kadar ayırt edici olduğunu gösterir.

Matematiksel olarak:

$tfidf(t,d)=tf(t,d) \times idf(t)$

Bir cümleyi ve tüm belgeyi vektör olarak düşündüğümüzde, aralarındaki açı bize benzerliği verir:

$cos(\theta)=\frac{A \cdot B}{|A||B|}$

Açı küçüldükçe benzerlik artar. Yani cümle, makalenin genel fikrine yaklaşıyorsa özet için güçlü bir adaydır.

Python ile Orta Seviye Bir Uygulama

Aşağıdaki kod, metni cümlelere ayırır, TF-IDF matrisi üretir, her cümleyi belge ortalamasıyla karşılaştırır ve en yüksek puanlı cümleleri seçer.

import re
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

STOPWORDS = {'ve', 'ile', 'bir', 'bu', 'da', 'de', 'için', 'gibi', 'çok', 'ama'}

def split_sentences(text):
    sentences = re.split(r'(?<=[.!?]) +', text.strip())
    return [s for s in sentences if len(s.split()) > 4]

def clean(sentence):
    sentence = sentence.lower()
    sentence = re.sub(r'[^a-zA-ZçğıöşüÇĞİÖŞÜ0-9 ]', ' ', sentence)
    words = [w for w in sentence.split() if w not in STOPWORDS]
    return ' '.join(words)

def summarize(text, ratio=0.3):
    sentences = split_sentences(text)
    cleaned = [clean(s) for s in sentences]

    vectorizer = TfidfVectorizer()
    matrix = vectorizer.fit_transform(cleaned)

    document_vector = matrix.mean(axis=0)
    similarities = cosine_similarity(matrix, document_vector)

    scores = []
    n = len(sentences)
    for i, sim in enumerate(similarities.flatten()):
        position_score = 1 - (i / max(n - 1, 1)) * 0.3
        final_score = 0.8 * sim + 0.2 * position_score
        scores.append((i, final_score))

    count = max(1, int(n * ratio))
    selected = sorted(scores, key=lambda x: x[1], reverse=True)[:count]
    selected_indexes = sorted(i for i, score in selected)

    return ' '.join(sentences[i] for i in selected_indexes)

Kodda TfidfVectorizer, her cümleyi sayısal bir vektöre dönüştürür. document_vector, bütün metnin ortalama anlam merkezidir. Her cümle bu merkeze ne kadar yakınsa, cosine_similarity sonucu o kadar yüksek çıkar. Son olarak, skorlar büyükten küçüğe sıralanır; seçilen cümleler orijinal sırasına göre birleştirilir. Böylece özet, hem anlamlı hem de okunabilir kalır.

Çıkarımsal ve Soyutlayıcı Özetleme

Yaklaşım Nasıl Çalışır? Avantaj Dezavantaj
Çıkarımsal Metinden cümle seçer Hızlı ve güvenilir Yeni cümle kuramaz
Soyutlayıcı Metni yeniden yazar İnsan gibi özetler Daha maliyetli ve riskli

Bu projede çıkarımsal yöntemi seçmemizin sebebi, daha anlaşılır ve kontrol edilebilir olmasıdır. Özellikle ilk NLP projeleri için harika bir başlangıçtır.

Geliştirme Fikirleri

Bu aracı daha akıllı hale getirmek için Türkçe kök bulma, özel isim tanıma veya başlık ağırlığı eklenebilir. Ayrıca sentence-transformers gibi modellerle cümleleri bağlamsal vektörlere çevirerek daha güçlü benzerlik hesapları yapılabilir.

Sonuç olarak, otomatik özetleme sadece “kısaltma” işi değildir; metnin matematiksel haritasını çıkarma sanatıdır. Python ise bu haritayı çizmek için oldukça eğlenceli bir pusula sunar.

Yorumlar