Skip to content

Instantly share code, notes, and snippets.

@miratcan
Last active February 12, 2024 23:21
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save miratcan/9196ae2591b1f34ab645520a767ced17 to your computer and use it in GitHub Desktop.
Save miratcan/9196ae2591b1f34ab645520a767ced17 to your computer and use it in GitHub Desktop.
Python'da Türkçe Heceleme Yapma
def get_syllables(word):
syllables = []
"""
Aşağıdaki satır gelen kelimenin ünlü harfler 1, ünsüzler 0 olacak
şekilde desenini çıkarır.
Örneğin: arabacı -> 1010101, türkiye -> 010010
"""
bits = ''.join(['1' if l in 'aeıioöuü' else '0' for l in word])
"""
Aşağıdaki seperators listesi, yakalanacak desenleri ve desen yakalandığında
kelimenin hangi pozisyondan kesileceğini tanımlıyor.
Türkçede kelime içinde iki ünlü arasındaki ünsüz, kendinden sonraki
ünlüyle hece kurar., yani 101 desenini yakaladığımızda kelimeyi
bulunduğumuz yerden 1 ileri pozisyondan kesmeliyiz. ('101', 1)
Kelime içinde yan yana gelen iki ünsüzden ilki kendinden önceki ünlüyle,
ikincisi kendinden sonraki ünlüyle hece kurar. Bu da demek oluyor ki
1001 desenini yakaladığımızda kelimeyi bulunduğumuz noktadan 2 ileriden
kesmeliyiz. ('1001', 2),
Kelime içinde yan yana gelen üç ünsüz harften ilk ikisi kendinden önceki
ünlüyle, üçüncüsü kendinden sonraki ünlüyle hece kurar. Yani 10001 desenini
gördüğümüzde kelimeyi bulunduğumuz yerden 3 ileri pozisyondan kesmemiz
gerek. ('10001', 3)
"""
seperators = (
('101', 1),
('1001', 2),
('10001', 3)
)
index, cut_start_pos = 0, 0
# index değerini elimizdeki bitler üzerinde yürütmeye başlıyoruz.
while index < len(bits):
"""
Elimizdeki her ayırıcıyı (seperator), bits'in index'inci karakterinden
itibarent tek tek deneyerek yakalamaya çalışıyoruz.
"""
for seperator_pattern, seperator_cut_pos in seperators:
if bits[index:].startswith(seperator_pattern):
"""
Yakaladığımızda, en son cut_start posizyonundan, bulunduğumuz
pozisyonun serpator_cut_pos kadar ilerisine kadar bölümü alıp
syllables sepetine atıyoruz.
"""
syllables.append(word[cut_start_pos:index + seperator_cut_pos])
"""
Index'imiz seperator_cut_pos kadar ilerliyor, ve
cut_start_pos'u index'le aynı yapıyoruz.
"""
index += seperator_cut_pos
cut_start_pos = index
break
"""
Index ilerliyor, cut_start_pos'da değişiklik yok.
"""
index += 1
# Son kalan heceyi elle sepete atıyoruz.
syllables.append(word[cut_start_pos:])
return syllables
print(get_syllables(u'araba'))
print(get_syllables(u'biçimine'))
print(get_syllables(u'insanın'))
print(get_syllables(u'karaca'))
print(get_syllables(u'aldı'))
print(get_syllables(u'birlik'))
print(get_syllables(u'sevmek'))
print(get_syllables(u'altlık'))
print(get_syllables(u'türkçe'))
print(get_syllables(u'korkmak'))
@ffurrkann
Copy link

Başarılı, elinize sağlık.

@acibiber53
Copy link

Çok temiz ve güzel bir çalışma olmuş, tebrik ederim. Şuradaki hece çeşitleriyle karşılaştırdım, yabancı dillerden gelen kelimelerde de neredeyse hatasız çalışıyor. Bir tek trans-kript gibi 100001 desenli ekstra bir örnekte çalışmayabilir gibi. Onu da düzeltmesi kolay zannediyorum. Bir de yazarken fark ettim, eks-tra da 100001.

@burhanakts
Copy link

burhanakts commented Oct 10, 2023

Çalışma için teşekkürler elinize sağlık.

Çok temiz ve güzel bir çalışma olmuş, tebrik ederim. Şuradaki hece çeşitleriyle karşılaştırdım, yabancı dillerden gelen kelimelerde de neredeyse hatasız çalışıyor. Bir tek trans-kript gibi 100001 desenli ekstra bir örnekte çalışmayabilir gibi. Onu da düzeltmesi kolay zannediyorum. Bir de yazarken fark ettim, eks-tra da 100001.

Bunun sebebi "transkript" kelimesinin pattern dönüşümünün "0010000100" olması. Burada 100001 gördüğünde kesmesi gerekiyor lakin seperators içinde bu kayıtlı olmadığı için kesme işlemi başarısız olarak sonuçlanıyor ve kelime olduğu gibi geri döndürülüyor. Bunun olmaması için,

seperators = (
    ('101', 1),
    ('1001', 2),
    ('10001', 3),
    ('100001', 4)
)

olarak güncellemeniz yeterli olacaktır.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment