Türkçe Belge Sınıflandırma Projesi

AKTA projesine katkıda bulunmak üzere Türkçe Belge Sınıflandırması yapmam gerekiyor. Gutenberg Projesi‘nin arşivindeki belgeler için bir sınıflandırma yapılmamış. Oysa bu belgeleri belirli kategoriler altında toplamak, LLM veya benzeri çalışmalarda Türkçe belgelerin kullanımı açısından yarar sağlayabilir.

Bu aralar kod çalışması yaparken genellikle Claude‘a danışıyorum.

Sınıflandırma çalışması için bana örnek bir kod hazırladı ve yararlanabileceğim veriseti adresleri verdi. Örneğin, github‘da paylaşılan TTC_3600 çalışması bu konuda yolumu aydınlattı. Bu çalışma sadece 6 kategori üzerinde yoğunlaşmış ve gazete haberleri kullanılarak oluşturulmuş. Benim ise hem kategori sayısını arttırmam, hem de daha geniş bir kaynak yelpazesi kullanmam gerekecek.

Her bir kategori için kullanabileceğim verileri saptamak için o kategoriyi tarif edebilen anahtar kelimelerden yararlanacağım. Gutenberg belgeleri genellikle çok uzun olduğu için, belirli belgelerden kesitler alıp kullanmak mantıklı görünüyor. Sadece anahtar kelime kullanımı bu iş için yeterli değil. Mutaka işin içine insanın da girmesi lazım.

Bu konuda yapılmış ve açık olarak paylaşılan çalışmalar genellikle küçük boyutlu verisetleri kullanmışlar. Ben bu boyutları büyüteceğim.

İlk çalışmalarda büyük olasılıkla sadece Gutenberg belgelerinden yararlanacağım. Çünkü henüz elimde başka kullanabileceğim açık kaynak Türkçe kaynaklar yok. İleride kaynakları genişletip, sınıflandırma modelini ona göre tekrar eğitebilirim.

Kategori sayısını ve isimlerini henüz tam olarak netleştiremedim. Üzerlerinde biraz daha çalışmam lazım. Şimdilik düşündüğüm kategoriler şunlar:

  • ekonomi
  • bilim ve teknoloji
  • eğitim
  • tarih
  • edebiyat
  • felsefe
  • siyaset
  • din ve maneviyat
  • bilimkurgu ve fantazi
  • spor
  • sosyal bilimler

Ön seçimlerimde aşağıdakine benzer kodlar kullanacağım:

"""
find_text_with_keywords.py
We will find text files containing given keywords in the given directory
"""
import time
import os
from aktalib import get_text, get_lines, extract_turkish_body, trklower, show_time, metni_parcala


directory = "/home/axax/gutenberg/kodlar/aktadata"
# keywords = ["şiir", "şair","manzume", "şarkı sözü", "marş", "türkü", ]
# keywords = ["roman", "hikaye", "öykü","anlatı", "macera", "polisiye", "mizah", "fıkra", "masal"]
# keywords = ["bilim", "deney","kimya", "fizik"]
# keywords = ["siyaset", "siyasi","politika", "politikacı", "hükümet", "milletvekili", "senatör", "yönetim"]
# keywords = ["tarih", "tarihi","tarihsel", "tarihçi", "savaş", "mücadele",]
keywords = ["ekonomi", "finans","banka", "para", "hisse senedi", "tahvil", "senet", "alacak", "borç"]

file_list = []
for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith(".txt"):
            file_list.append(os.path.join(root, file))    

say = 0
for filename in file_list:
    say += 1
    # print(say, filename, end=" ", flush=True)
    metin = get_text(filename)
    metin = extract_turkish_body(metin)
    metin = trklower(metin)
    counter = 0
    for keyword in keywords:
        counter += metin.count(keyword)
    
    if counter > 100:
        print(say, filename, counter)
    # if counter  > 0: break
"""
aktalib.py file will contain functions to be used
to operate AKTA project.
"""
import time

BHARFX = "Iİ"
KHARFX = "ıi"
AYRACLAR = ",.;-«»!?:/*+_=\"<>()'[]|º#&%“’”‘…–´—•`˜·^”-“”~"

def show_time(message, t1, t0=None):
    """
    Show total elapsed at the end of a process
    t1: start time
    t2: finishing time
    """
    t2 = time.time()
    fark = round(t2-t1, 4)
    h = int(fark//3600)
    m = int((fark-h*3600)//60)
    s = round(fark-h*3600-m*60, 4)
    
    print(f"{message}: {fark} secs ->  {h}h {m}m {s}s")
    if t0:
        fark = round(t2-t0, 4)
        h = int(fark//3600)
        m = int((fark-h*3600)//60)
        s = round(fark-h*3600-m*60, 4)        
        print(f"Total time: {fark} secs ->  {h}h {m}m {s}s")
    return t2 - t1

def show_time_old(message, t1, t0=None):
    """
    Show total elapsed at the end of a process
    t1: start time
    t2: finishing time
    """
    t2 = time.time()
    fark = round(t2-t1,4)
    h = int(fark//3600)
    m = int((fark-h*3600)//60)
    s = round(fark-h*3600-m*60,4)
    # print(f"{message}: {round(t2-t1,4)} secs")
    print(f"{message}: {round(t2-t1,4)} secs ->  {h}h {m}m {s}s")
    if t0:
        fark = round(t2-t0,4)
        h = int(fark//3600)
        m = int((fark-h*3600)//60)
        s = round(fark-h*3600-m*60,4)        
        print(f"Total time: {round(t2-t0,4)} secs ->  {h}h {m}m {s}s")
    return t2


def trklower(text):
    for j in range(len(BHARFX)):
        text = text.replace(BHARFX[j], KHARFX[j])
    text = text.lower()
    return text

def remove_eol_hyphen_clean(metin):
    # ymetin = metin.replace('-\n','')
    ymetin = metin
    for ayirac in AYRACLAR:
        ymetin = ymetin.replace(ayirac, " ")
    return ymetin

def extract_turkish_body(text):
    # find "*** START OF TURKISH PART ***"
    start = text.find("*** START OF TURKISH PART ***\n") + 30
    # find "*** END OF TURKISH PART ***"
    end = text.find("*** END OF TURKISH PART ***\n") -1
    trtext = text[start:end]
    return trtext

def get_lines(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
    except UnicodeDecodeError:
        # UTF-8 ile açılamazsa, farklı bir kodlama deneyin
        with open(filename, 'r', encoding='iso-8859-1') as file:
            lines = file.readlines()

    return lines
    
def get_text(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            text = file.read()
    except UnicodeDecodeError:
        # UTF-8 ile açılamazsa, farklı bir kodlama deneyin
        with open(filename, 'r', encoding='iso-8859-1') as file:
            text = file.read()

    return text
    
def eksozluk_oku(filename):
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            lines = file.readlines()
    except UnicodeDecodeError:
        # UTF-8 ile açılamazsa, farklı bir kodlama deneyin
        with open(filename, 'r', encoding='iso-8859-1') as file:
            lines = file.readlines()

    return lines

def metni_parcala(metin, maks_uzunluk=4000):
    parcalar = []
    cümleler = metin.split('.')
    current_parca = ""
    
    for cümle in cümleler:
        if len(current_parca) + len(cümle) < maks_uzunluk:
            current_parca += cümle + '.'
        else:
            parcalar.append(current_parca.strip())
            current_parca = cümle + '.'
    # print("len(current_parca): ", len(current_parca))
    if current_parca:
        parcalar.append(current_parca.strip())
    
    return parcalar


if __name__ == "__main__":
    filename = "aktadata/30006.txt"
    with open(filename, 'r') as f:
        content = f.read()
        trtext = extract_turkish_body(content)
        print(trtext[:200])
        print("")
        print(trtext[-200:])

Verisetlerini oluşturduğumda hem verisetini, hemde verisetini oluşturmada kullandığım kodları paylaşacağım.

Bu projeyi de github’da paylaşıma açacağım

Ahmet Aksoy

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top