#!/usr/bin/env python
#encoding:UTF-8
import sys
"""
Сын учится читать, у него хорошо получается читать по слогам,
но читать тексты с целыми словами получается пока плохо.
Поиск книг типа "читаем по слогам" выдал где то штук 10 разных, мало :(.
Так появилась идея написать скриптик для разбивки текста на слоги.
Написал за вечер для того, что бы разбивать сказки для чтения по слогам :)
01.06.2013
Sergey Poterianski
s@poterianski.ru
"""
"""
объявляем словарики для согласных, глухих, гласных
"""
consonants = ['б', 'в', 'г', 'д', 'ж', 'з', 'й', 'к',
'л', 'м', 'н', 'п', 'р', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ']
thud = ['к', 'п', 'с', 'т', 'ф', 'х', 'ц', 'ч', 'ш', 'щ']
vowels = ['а', 'у', 'о', 'ы', 'и', 'э', 'я', 'ю', 'ё', 'е']
"""
usage:
pbs.py [filename] - файлик с текстом для разбивки на слоги
результат выводится в консоль
"""
def main():
filename = sys.argv[1]
file = open(filename, 'r')
for line in file:
split2words(line)
"""
Перебирает строки
"""
def split2words(line):
i = 0
result = ''
word = ''
while i < len(line):
c = line[i]
if isconsonant(c) or isvowel(c) \
or c == 'ь' or c == 'Ь' or c == 'ъ' or c == 'Ъ':
word += c
else:
if len(word) > 0:
if len(word) <= 2:
result += word
else:
result += split2syllables(word)
word = ''
result += c
i += 1
print((result.strip()))
"""
Делит слово на слоги
"""
def split2syllables(word):
splited = ''
slog = ''
i = 0
#v = False
scount = vowelcount(word)
if scount == 1:
return word
while i < len(word):
c = word[i]
#добавляем букву в слог
slog += c
# если гласная
if isvowel(c):
# смотрим что идет после
# есть буквы
if i+1 < len(word):
c1 = word[i+1]
# если согласная
if isconsonant(c1):
# если последняя в слове - добавляем в слог и выходим
if i+1 >= len(word) - 1:
slog += word[i+1]
i+=1
else:
# не последняя,запоминем проверяем что идет после нее
c2 = word[i+2]
# если идет Й и следом согласный - добавляем в слог
if (c1 == 'й' or c1 == 'Й') and isconsonant(c2):
slog += c1
i += 1
# если после звонкой не парной идет глухой согласный - добавляем в слог
elif (c1 in ['м','н','р','л'] or c1 in ['М','Н','Р','Л']) and isthud(c2):
slog += c1
i += 1
elif i+2 >= len(word) - 1 and (c2 == 'ь' or c2 == 'Ь' or c2 == 'ъ' or c2 == 'Ъ'):
# заканчивается на мягкий
i+=2
slog += c1 + c2
splited += slog
if i+1 < len(word):
splited += '-'
slog = ''
i += 1
return splited
"""
считает гласные
"""
def vowelcount(word):
cnt = 0
for c in word:
if(isvowel(c)):
cnt += 1
"""
Если согласный
"""
def isconsonant(char):
x = char.lower()[0]
for c in consonants:
if c == x:
return True
"""
Если глухой
"""
def isthud(char):
x = char.lower()[0]
for c in thud:
if c == x:
return True
"""
Если гласный
"""
def isvowel(char):
x = char.lower()[0]
for c in vowels:
if c == x:
return True
return False
if __name__ == '__main__':
main()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiNlbmNvZGluZzpVVEYtOAppbXBvcnQgc3lzCiIiIgrQodGL0L0g0YPRh9C40YLRgdGPINGH0LjRgtCw0YLRjCwg0YMg0L3QtdCz0L4g0YXQvtGA0L7RiNC+INC/0L7Qu9GD0YfQsNC10YLRgdGPINGH0LjRgtCw0YLRjCDQv9C+INGB0LvQvtCz0LDQvCwK0L3QviDRh9C40YLQsNGC0Ywg0YLQtdC60YHRgtGLINGBINGG0LXQu9GL0LzQuCDRgdC70L7QstCw0LzQuCDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQv9C+0LrQsCDQv9C70L7RhdC+LgrQn9C+0LjRgdC6INC60L3QuNCzINGC0LjQv9CwICLRh9C40YLQsNC10Lwg0L/QviDRgdC70L7Qs9Cw0LwiINCy0YvQtNCw0Lsg0LPQtNC1INGC0L4g0YjRgtGD0LogMTAg0YDQsNC30L3Ri9GFLCDQvNCw0LvQviA6KC4K0KLQsNC6INC/0L7Rj9Cy0LjQu9Cw0YHRjCDQuNC00LXRjyDQvdCw0L/QuNGB0LDRgtGMINGB0LrRgNC40L/RgtC40Log0LTQu9GPINGA0LDQt9Cx0LjQstC60Lgg0YLQtdC60YHRgtCwINC90LAg0YHQu9C+0LPQuC4K0J3QsNC/0LjRgdCw0Lsg0LfQsCDQstC10YfQtdGAINC00LvRjyDRgtC+0LPQviwg0YfRgtC+INCx0Ysg0YDQsNC30LHQuNCy0LDRgtGMINGB0LrQsNC30LrQuCDQtNC70Y8g0YfRgtC10L3QuNGPINC/0L4g0YHQu9C+0LPQsNC8IDopCjAxLjA2LjIwMTMKU2VyZ2V5IFBvdGVyaWFuc2tpCnNAcG90ZXJpYW5za2kucnUKIiIiCgoiIiIK0L7QsdGK0Y/QstC70Y/QtdC8INGB0LvQvtCy0LDRgNC40LrQuCDQtNC70Y8g0YHQvtCz0LvQsNGB0L3Ri9GFLCDQs9C70YPRhdC40YUsINCz0LvQsNGB0L3Ri9GFCiIiIgpjb25zb25hbnRzID0gWyfQsScsICfQsicsICfQsycsICfQtCcsICfQticsICfQtycsICfQuScsICfQuicsCifQuycsICfQvCcsICfQvScsICfQvycsICfRgCcsICfRgScsICfRgicsICfRhCcsICfRhScsICfRhicsICfRhycsICfRiCcsICfRiSddCnRodWQgPSBbJ9C6JywgJ9C/JywgJ9GBJywgJ9GCJywgJ9GEJywgJ9GFJywgJ9GGJywgJ9GHJywgJ9GIJywgJ9GJJ10Kdm93ZWxzID0gWyfQsCcsICfRgycsICfQvicsICfRiycsICfQuCcsICfRjScsICfRjycsICfRjicsICfRkScsICfQtSddCgoiIiIKdXNhZ2U6CiAgICBwYnMucHkgW2ZpbGVuYW1lXSAtINGE0LDQudC70LjQuiDRgSDRgtC10LrRgdGC0L7QvCDQtNC70Y8g0YDQsNC30LHQuNCy0LrQuCDQvdCwINGB0LvQvtCz0LgKICAgINGA0LXQt9GD0LvRjNGC0LDRgiDQstGL0LLQvtC00LjRgtGB0Y8g0LIg0LrQvtC90YHQvtC70YwKIiIiCmRlZiBtYWluKCk6CiAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCiAgICBmaWxlID0gb3BlbihmaWxlbmFtZSwgJ3InKQogICAgZm9yIGxpbmUgaW4gZmlsZToKICAgICAgICBzcGxpdDJ3b3JkcyhsaW5lKQoKIiIiCtCf0LXRgNC10LHQuNGA0LDQtdGCINGB0YLRgNC+0LrQuAoiIiIKZGVmIHNwbGl0MndvcmRzKGxpbmUpOgogICAgaSA9IDAKICAgIHJlc3VsdCA9ICcnCiAgICB3b3JkID0gJycKICAgIHdoaWxlIGkgPCBsZW4obGluZSk6CiAgICAgICAgYyA9IGxpbmVbaV0KICAgICAgICBpZiBpc2NvbnNvbmFudChjKSBvciBpc3Zvd2VsKGMpIFwKICAgICAgICBvciBjID09ICfRjCcgb3IgYyA9PSAn0KwnIG9yIGMgPT0gJ9GKJyBvciBjID09ICfQqic6CiAgICAgICAgICAgIHdvcmQgKz0gYwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGxlbih3b3JkKSA+IDA6CiAgICAgICAgICAgICAgICBpZiBsZW4od29yZCkgPD0gMjoKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd29yZAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3BsaXQyc3lsbGFibGVzKHdvcmQpCiAgICAgICAgICAgICAgICB3b3JkID0gJycKICAgICAgICAgICAgcmVzdWx0ICs9IGMKICAgICAgICBpICs9IDEKICAgIHByaW50KChyZXN1bHQuc3RyaXAoKSkpCgoiIiIK0JTQtdC70LjRgiDRgdC70L7QstC+INC90LAg0YHQu9C+0LPQuAoiIiIKZGVmIHNwbGl0MnN5bGxhYmxlcyh3b3JkKToKICAgIHNwbGl0ZWQgPSAnJwogICAgc2xvZyA9ICcnCiAgICBpID0gIDAKICAgICN2ID0gRmFsc2UKICAgIHNjb3VudCA9IHZvd2VsY291bnQod29yZCkKICAgIGlmIHNjb3VudCA9PSAxOgogICAgICAgIHJldHVybiB3b3JkCgogICAgd2hpbGUgaSA8IGxlbih3b3JkKToKICAgICAgICBjID0gd29yZFtpXQogICAgICAgICPQtNC+0LHQsNCy0LvRj9C10Lwg0LHRg9C60LLRgyDQsiDRgdC70L7QswogICAgICAgIHNsb2cgKz0gYwogICAgICAgICMg0LXRgdC70Lgg0LPQu9Cw0YHQvdCw0Y8KICAgICAgICBpZiBpc3Zvd2VsKGMpOgogICAgICAgICAgICAjINGB0LzQvtGC0YDQuNC8INGH0YLQviDQuNC00LXRgiDQv9C+0YHQu9C1CiAgICAgICAgICAgICMg0LXRgdGC0Ywg0LHRg9C60LLRiwogICAgICAgICAgICBpZiBpKzEgPCBsZW4od29yZCk6CiAgICAgICAgICAgICAgICBjMSA9IHdvcmRbaSsxXQogICAgICAgICAgICAgICAgIyDQtdGB0LvQuCDRgdC+0LPQu9Cw0YHQvdCw0Y8KICAgICAgICAgICAgICAgIGlmIGlzY29uc29uYW50KGMxKToKICAgICAgICAgICAgICAgICAgICAjINC10YHQu9C4INC/0L7RgdC70LXQtNC90Y/RjyDQsiDRgdC70L7QstC1IC0g0LTQvtCx0LDQstC70Y/QtdC8INCyINGB0LvQvtCzINC4INCy0YvRhdC+0LTQuNC8CiAgICAgICAgICAgICAgICAgICAgaWYgaSsxID49IGxlbih3b3JkKSAtIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHNsb2cgKz0gd29yZFtpKzFdCiAgICAgICAgICAgICAgICAgICAgICAgIGkrPTEKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjINC90LUg0L/QvtGB0LvQtdC00L3Rj9GPLNC30LDQv9C+0LzQuNC90LXQvCDQv9GA0L7QstC10YDRj9C10Lwg0YfRgtC+INC40LTQtdGCINC/0L7RgdC70LUg0L3QtdC1CiAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gd29yZFtpKzJdCiAgICAgICAgICAgICAgICAgICAgICAgICMg0LXRgdC70Lgg0LjQtNC10YIg0Jkg0Lgg0YHQu9C10LTQvtC8INGB0L7Qs9C70LDRgdC90YvQuSAtINC00L7QsdCw0LLQu9GP0LXQvCDQsiDRgdC70L7QswogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYzEgPT0gJ9C5JyBvciBjMSA9PSAn0JknKSBhbmQgaXNjb25zb25hbnQoYzIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvZyArPSBjMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgICMg0LXRgdC70Lgg0L/QvtGB0LvQtSDQt9Cy0L7QvdC60L7QuSDQvdC1INC/0LDRgNC90L7QuSDQuNC00LXRgiDQs9C70YPRhdC+0Lkg0YHQvtCz0LvQsNGB0L3Ri9C5IC0g0LTQvtCx0LDQstC70Y/QtdC8INCyINGB0LvQvtCzCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgKGMxIGluIFsn0LwnLCfQvScsJ9GAJywn0LsnXSBvciBjMSBpbiBbJ9CcJywn0J0nLCfQoCcsJ9CbJ10pIGFuZCBpc3RodWQoYzIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvZyArPSBjMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaSsyID49IGxlbih3b3JkKSAtIDEgYW5kIChjMiA9PSAn0YwnIG9yIGMyID09ICfQrCcgb3IgYzIgPT0gJ9GKJyBvciBjMiA9PSAn0KonKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg0LfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0L3QsCDQvNGP0LPQutC40LkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb2cgKz0gYzEgKyBjMgogICAgICAgICAgICBzcGxpdGVkICs9IHNsb2cKICAgICAgICAgICAgaWYgaSsxIDwgbGVuKHdvcmQpOgogICAgICAgICAgICAgICAgc3BsaXRlZCArPSAnLScKICAgICAgICAgICAgc2xvZyA9ICcnCiAgICAgICAgaSArPSAxCiAgICByZXR1cm4gc3BsaXRlZAoiIiIK0YHRh9C40YLQsNC10YIg0LPQu9Cw0YHQvdGL0LUKIiIiCmRlZiB2b3dlbGNvdW50KHdvcmQpOgogICAgY250ID0gMAogICAgZm9yIGMgaW4gd29yZDoKICAgICAgICBpZihpc3Zvd2VsKGMpKToKICAgICAgICAgICAgY250ICs9IDEKIiIiCtCV0YHQu9C4INGB0L7Qs9C70LDRgdC90YvQuQoiIiIKZGVmIGlzY29uc29uYW50KGNoYXIpOgogICAgeCA9IGNoYXIubG93ZXIoKVswXQogICAgZm9yIGMgaW4gY29uc29uYW50czoKICAgICAgICBpZiBjID09IHg6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiIiIgrQldGB0LvQuCDQs9C70YPRhdC+0LkKIiIiCmRlZiBpc3RodWQoY2hhcik6CiAgICB4ID0gY2hhci5sb3dlcigpWzBdCiAgICBmb3IgYyBpbiB0aHVkOgogICAgICAgIGlmIGMgPT0geDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKIiIiCtCV0YHQu9C4INCz0LvQsNGB0L3Ri9C5CiIiIgpkZWYgaXN2b3dlbChjaGFyKToKICAgIHggPSBjaGFyLmxvd2VyKClbMF0KICAgIGZvciBjIGluIHZvd2VsczoKICAgICAgICBpZiBjID09IHg6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigp