Skip to content

Instantly share code, notes, and snippets.

@nurettin
Last active December 13, 2020 15:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nurettin/faae97bc69deaa09188f1884198b8e7b to your computer and use it in GitHub Desktop.
Save nurettin/faae97bc69deaa09188f1884198b8e7b to your computer and use it in GitHub Desktop.
"""
Türkçe kelimeleri hecelemek için yazdığım bir bilgisayar programı
Nurettin Onur TUĞCU - 2020
Geçen gün Türkçe'deki heceleme kurallarını incelerken Ali Nesin'in Matematik ve Sonsuz[1] isimli kitabına denk geldim.
34. sayfadaki açıklamanın sonundaki dip notta 1973 senesinden bahsedildiğine göre yazı epey eski.
Kitaptaki örnekler çok hoşuma gitti ve bütün örneklemleri çözen bir program yazmaya karar verdim.
Not 1: Ali Nesin'in de belirttiği gibi türkçeye ingilizce vb. dillerden gelen kelimelerin (ço-ko-krem, fo-to-star) farsça
kökenli kelimelere (si-lah-şor) göre farklı hecelenmesi konusu için basit bir çözüm yok. Bu türden sözcükler için sözlük
bazlı bir tarama yapmak gerekecek. Benim algoritmam bu kelimeleri doğru heceleyemiyor.
Not 2: Ali Nesin hecelenecek kelimenin tersten incelenmesi gerektiğini söylüyor, fakat böyle bir kural yok. Aşağıdaki program
sondan başlamadan, biraz ileri bakarak tarama yapıyor ve yukarıda belirttiğim iki özel kelime hariç doğru heceleme yapıyor.
[1] https://books.google.com.tr/books?id=IiKeDwAAQBAJ&pg=PA34
"""
from typing import List, Tuple, Optional
testler = [
"KAS-TU-RA-MIY-FA-TOM",
"BAB-BA-BA-BAB-BA-BAB",
"O-LA-ĞA-NÜS-TÜ",
"BA-BA-AN-NE",
"KA-İ-NAT",
"A-İ-LE",
"TA-Bİ-İ",
"MA-A-LE-SEF",
"SU-AT",
"TRAB-ZON-SPOR",
"TREN",
"TRAM-VAY",
"TRO-LEY-BÜS",
"KREM",
"KRE-MA",
"E-LEK-TRİK",
"FO-TO-STAR",
"ŞO-KO-KREM",
"Sİ-LAH-ŞOR",
"E-LEK-TRON",
"SFENKS",
"PRENS",
]
def temizle(kelime: str) -> str:
return kelime.replace("-", "").replace("İ", "i").replace("I", "ı").lower()
def kodla(kelime: str) -> str:
return "".join(['0' if harf in ('a', 'e', 'ı', 'i', 'o', 'ö', 'u', 'ü') else '1' for harf in kelime])
oruntuler = [('110111', '110111'), ('11011', '1101'), ('10110', '101'), ('10111', '101'), ('0110', '01'), ('1101', '110'), ('0101', '0'),
('1010', '10'), ('101', '101'), ('100', '10'), ('010', '0'), ('01', '01'), ('10', '10'), ('00', '0'), ('0', '0')]
for test in testler:
def oruntu_eslestir(kod: str) -> Optional[str]:
for oruntu, kopar in oruntuler:
if kod.startswith(oruntu):
return kopar
return None
def hecele(harfler: str) -> Tuple[str, str, List[str]]:
temiz = temizle(harfler)
kalan = temiz
kod = kodla(kalan)
heceler: List[str] = []
while True:
if kod == "1":
if len(heceler) > 0:
heceler[-1] += kalan
else:
heceler.append(kod)
break
kopar = oruntu_eslestir(kod)
if kopar is None:
heceleniyor = False
print("örüntü bulunamadı: ", kod, kalan)
break
hece = kalan[:len(kopar)]
heceler.append(hece)
kalan = kalan[len(kopar):]
kod = kod[len(kopar):]
if len(kod) == 0:
break
return harfler, temiz, heceler
print(hecele(test))
"""
('KAS-TU-RA-MIY-FA-TOM', 'kasturamıyfatom', ['kas', 'tu', 'ra', 'mıy', 'fa', 'tom'])
('BAB-BA-BA-BAB-BA-BAB', 'babbabababbabab', ['bab', 'ba', 'ba', 'bab', 'ba', 'bab'])
('OLAĞANÜSTÜ', 'olağanüstü', ['o', 'la', 'ğa', 'nüs', 'tü'])
('BA-BA-AN-NE', 'babaanne', ['ba', 'ba', 'an', 'ne'])
('KA-İ-NAT', 'kainat', ['ka', 'i', 'nat'])
('A-İ-LE', 'aile', ['a', 'i', 'le'])
('TA-Bİ-İ', 'tabii', ['ta', 'bi', 'i'])
('MA-A-LE-SEF', 'maalesef', ['ma', 'a', 'le', 'sef'])
('SU-AT', 'suat', ['su', 'at'])
('TRAB-ZON-SPOR', 'trabzonspor', ['trab', 'zon', 'spor'])
('TREN', 'tren', ['tren'])
('TRAM-VAY', 'tramvay', ['tram', 'vay'])
('TRO-LEY-BÜS', 'troleybüs', ['tro', 'ley', 'büs'])
('KREM', 'krem', ['krem'])
('KRE-MA', 'krema', ['kre', 'ma'])
('E-LEK-TRİK', 'elektrik', ['e', 'lek', 'trik'])
('FO-TO-STAR', 'fotostar', ['fo', 'tos', 'tar'])
('ŞO-KO-KREM', 'şokokrem', ['şo', 'kok', 'rem'])
('Sİ-LAH-ŞOR', 'silahşor', ['si', 'lah', 'şor'])
('E-LEK-TRON', 'elektron', ['e', 'lek', 'tron'])
('SFENKS', 'sfenks', ['sfenks'])
('PRENS', 'prens', ['prens'])
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment