Knowledge Bases

Eski Nesil Dosyaları Modern Bilgi Tabanlarına Aktarma

Kurumlar yapay zekâ destekli bilgi sistemlerine geçiş yaptığında, asıl zorluk RAG hattını kurmak değil, elinizdeki mevcut veriyi işlemektir. Milyonlarca kurumsal kayıt, Outlook MSG dosyaları, bağımsız EML e-postaları ve Word 97-2003 belgeleri gibi eski formatlarda saklanmaktadır. Bu dosyalar, standart aktarma hatlarını bozan yapılandırılmamış ve gürültülü veri içerir. Bu rehber, bu eski içeriği modern vektör depoları için temizleme, ayrıştırma ve yapılandırma stratejilerini ele alır.

Eski Formatlar Neden Hatları Bozar?

Modern vektör veritabanları temiz, anlamsal metin bekler. Eski formatlar üç tür gürültüye neden olur:

  • Meta Veri Şişkinliği: MSG dosyaları, asıl içeriği gizleyen ikili başlıklar ve MAPI özellikleri içerir.
  • Yapısal Karmaşıklık: EML dosyaları, başlıkları, base64 kodlu gövde metinlerini ve ekleri tek bir akışta karıştırır.
  • Biçimlendirme Artıkları: Eski Word belgeleri (.doc), OLE bileşik dosyalarına dayanır ve basitçe çıkarıldığında genellikle bozuk metinlere yol açar.

EML ve MSG E-postalarının İşlenmesi

E-posta, yüksek değerli ancak düşük kaliteli formatta bir veridir. Amaç, HTML etiketlerini ve base64 gürültüsünü ayıklayarak gövde metnini ve ana meta verileri (gönderen, tarih) çıkarmaktır.

EML dosyaları için Python'ın email kütüphanesi standarttır. MSG dosyaları için ise extract-msg gibi uzmanlaşmış araçlara ihtiyaç duyulur.


import email
from email import policy
import extract_msg

def process_eml(filepath):
    with open(filepath, 'rb') as f:
        msg = email.message_from_binary_file(f, policy=policy.default)
    
    # Düz metin gövdesini çıkar
    body_part = msg.get_body(preferencelist=('plain', 'html'))
    text = body_part.get_content() if body_part else ""
    
    # Gövde zengin metinse HTML'i temizle
    import re
    text = re.sub(r'<[^>]+>', '', text)
    
    return {
        'subject': msg['subject'],
        'sender': msg['from'],
        'date': msg['date'],
        'content': text.strip()
    }

def process_msg(filepath):
    with extract_msg.Message(filepath) as msg:
        return {
            'subject': msg.subject,
            'sender': msg.sender,
            'date': str(msg.date),
            'content': msg.body
        }

Eski Word Belgelerinin (.doc) İşlenmesi

.docx (XML'lerin bir zip arşivi) ile aksine, .doc bir OLE2 ikili formatıdır. Bunların dönüştürülmesi, başlıksız (headless) bir dönüştürme motoru veya uzmanlaşmış bir ayrıştırıcı gerektirir.

En güvenilir strateji, önce LibreOffice'i başlıksız modda kullanarak .doc dosyalarını .docx veya .txt formatına dönüştürmek, ardından sonucu ayrıştırmaktır. Bu, veri kaynağını normalize eder.


# LibreOffice aracılığıyla .doc'u .txt'ye dönüştüren kabuk betiği
# Girdi: /data/legacy/docs
# Çıktı: /data/processed/txt

libreoffice --headless --convert-to txt --outdir /data/processed/txt /data/legacy/docs/*.doc

Düz metne dönüştürüldükten sonra standart NLP parçalama (chunking) uygulanabilir. Eski Word belgeleri üzerinde ham PDF'den metne heuristiklerin kullanılmaması önerilir; çünkü bunlar genellikle yerleşim bağlamını kaçırır ve gömme (embedding) kalitesini düşüren parçalanmış cümleler üretir.

Gürültülü Veriler İçin Parçalama Stratejisi

Eski belgelerde genellikle tutarsız başlık yapıları bulunur. Sabit boyutlu parçalama (ör. 500 token), sıklıkla cümleleri böler veya başlıkları içeriklerinden ayırır.

Yapıdan haberdar parçalama (structure-aware chunking) kullanın:

  1. Başlıkları belirleyin (büyük harf, kalın veya belirli numaralandırma kalıpları).
  2. İçeriği en son başlığın altında gruplayın.
  3. Bir grup maksimum token sınırını aşarsa, yalnızca paragraf sınırlarında bölün.

Sonuç

Eski formatları aktarmak, yalnızca bir ayrıştırma görevi değil, bir veri hijyeni görevidir. EML/MSG meta verilerini normalize ederek ve OLE tabanlı Word belgelerini temiz metne dönüştürerek gömmelerinizin (embeddings) anlamsal kalitesini önemli ölçüde artırabilirsiniz. Tam veri setine ölçeklenmeden önce, ayrıştırma hattını her zaman gerçek eski arşivinizin küçük ve çeşitli bir örneğinde prototipleme yapın.

Share: