Last active
December 13, 2020 15:26
-
-
Save nurettin/faae97bc69deaa09188f1884198b8e7b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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