UNLULER = "aeıioöuü" def tokenize(dosya_adi="data.txt"): bitis = ".!?\n" noktalamalar = ",;:\"'()[]{}-_/#*" sonuc = [] with open(dosya_adi, "r", encoding="utf-8") as dosya: metin = dosya.read() metin = metin.lower() for isaret in bitis: metin = metin.replace(isaret, "|") for isaret in noktalamalar: metin = metin.replace(isaret, " ") cumleler = metin.split("|") for cumle in cumleler: kelimeler = cumle.split() if kelimeler: sonuc.append(kelimeler) return sonuc def hecele(kelime): if not kelime: return [] heceler = [] i = 0 n = len(kelime) while i < n: unlu_index = -1 for j in range(i, n): if kelime[j] in UNLULER: unlu_index = j break if unlu_index == -1: if heceler: heceler[-1] += kelime[i:] else: heceler.append(kelime[i:]) break sonraki_unlu = -1 for j in range(unlu_index + 1, n): if kelime[j] in UNLULER: sonraki_unlu = j break if sonraki_unlu == -1: heceler.append(kelime[i:]) break aradaki_unsuz = sonraki_unlu - unlu_index - 1 if aradaki_unsuz <= 1: kesim = unlu_index + 1 else: kesim = unlu_index + 2 heceler.append(kelime[i:kesim]) i = kesim return [h for h in heceler if h] def veri_setinden_ekleri_cikar(cumleler, min_frekans=3, min_govde_cesidi=3, max_ek_uzunlugu=5): ek_frekans = {} ek_govdeler = {} for satir in cumleler: for kelime in satir: if len(kelime) < 4: continue ust_sinir = min(max_ek_uzunlugu, len(kelime) - 2) for uzunluk in range(2, ust_sinir + 1): govde = kelime[:-uzunluk] ek = kelime[-uzunluk:] if len(govde) < 2: continue if not any(harf in UNLULER for harf in ek): continue ek_frekans[ek] = ek_frekans.get(ek, 0) + 1 if ek not in ek_govdeler: ek_govdeler[ek] = set() ek_govdeler[ek].add(govde) adaylar = [] for ek, frekans in ek_frekans.items(): if frekans < min_frekans: continue if len(ek_govdeler.get(ek, set())) < min_govde_cesidi: continue adaylar.append((ek, frekans)) adaylar.sort(key=lambda x: (-len(x[0]), -x[1], x[0])) return [ek for ek, _ in adaylar] def ekleri_ayir(kelime, ekler): govde = kelime bulunan_ekler = [] while len(govde) > 2: eslesen = None for ek in ekler: if govde.endswith(ek) and len(govde) - len(ek) >= 2: eslesen = ek break if not eslesen: break bulunan_ekler.append(eslesen) govde = govde[: -len(eslesen)] bulunan_ekler.reverse() return govde, bulunan_ekler def parcala(kelime, ekler): govde, bulunan_ekler = ekleri_ayir(kelime, ekler) parcaciklar = hecele(govde) parcaciklar.extend(f"+{ek}" for ek in bulunan_ekler) return parcaciklar if parcaciklar else [kelime]