Functions used for TTS Dataset Preparation

Functions for Pipeline

collapse_whitespace[source]

collapse_whitespace(text:str)

Replace multiple various whitespaces with a single space, strip leading and trailing spaces.

test_eq(collapse_whitespace(
    chr(int("0xfeff", 16)) + # zero width no-break space
    chr(int("0x200b", 16)) + # zero width space
    chr(int("0x202f", 16)) + # narrow no-break space
    chr(int("0x2060", 16)) + # word joiner
    chr(int("0x3000", 16)) + # ideographic space
    chr(int("0xa0"  , 16)) + # no-break space
    "\t\n 1 2   3     4     5       \t\r\n"),
    "1 2 3 4 5")

lowercase[source]

lowercase(text:str)

Convert text to lower case.

test_eq(lowercase('ПрИвеТ, ЧуВАК!'), 
                  'привет, чувак!')

check_no_numbers[source]

check_no_numbers(text:str)

Return a list of digits, or empty list, if not found.

test_eq(check_no_numbers('Цифры есть 1 12 13.4'), ['1', '12', '13', '4'])
test_eq(check_no_numbers('Цифр нет'), [])

remove_specials[source]

remove_specials(text:str, purge_digits:bool=None)

Replace predefined in _specials sequence of characters

purge_dots[source]

purge_dots(text, purgedots=False)

If purgedots, ...| will be purged. Else replaced with .

test_eq(purge_dots("Word..."), 'Word.')
test_eq(purge_dots("Word…",), 'Word.')

test_eq(purge_dots("Word...", purgedots=True), 'Word')
test_eq(purge_dots("Word…",   purgedots=True), 'Word')

test_eq(purge_dots(" …Word",), ' Word')

test_eq(purge_dots("Word..",), 'Word')

test_eq(purge_dots('Многоточие... Многоточие… … …Многоточие'),
                        'Многоточие. Многоточие.  Многоточие')
test_eq(remove_specials('Скобки у аббревиатур (вайфай) удаляем.'),'Скобки у аббревиатур вайфай удаляем.')
test_eq(remove_specials('Метки времени 01:12 или 01.01, (01:12) или (01.01) удаляем.'),
                        'Метки времени  или ,  или  удаляем.')
test_eq(remove_specials('Ой!. Ага?. / Стоп.'), 'Ой! Ага?  Стоп.')
test_eq(remove_specials('*США* _Френсис_'), 'США Френсис')

expand_abbreviations[source]

expand_abbreviations(text:str)

expand_abbreviations() defined in _abbreviations

test_eq(
    expand_abbreviations('Привет Джон, т.е. Иван. Т.к. русский. И т.д. И т.п.'),
                         'Привет Джон, то есть Иван. так как русский. и так далее. и тому подобное.') 

unify_dash_hyphen[source]

unify_dash_hyphen(text:str)

Unify dash and hyphen symbols -- replace with emdash or hyphen, separate with space.

test_eq(unify_dash_hyphen(
    chr(int("2212",16))+ # minus sign
    chr(int("2012",16))+ # figure dash
    chr(int("2010",16))+ # hyphen
    chr(int("2011",16))),# non-breaking hyphen
    (" "+chr(int("2013",16))+" ")*2+chr(int("2d",16))*2)
test_eq(unify_dash_hyphen('Я '+chr(int("2013",16))+ 'Джейми Кейлер'),'Я – Джейми Кейлер')
test_eq(unify_dash_hyphen('Я' +chr(int("2013",16))+ 'Джейми Кейлер'),'Я – Джейми Кейлер')
test_eq(collapse_whitespace(unify_dash_hyphen('Я' +chr(int("2013",16))+' Джейми Кейлер')),'Я – Джейми Кейлер')

rm_quot_marks[source]

rm_quot_marks(text:str)

Remove quotation marks from text.

test_eq(rm_quot_marks('"\'«»‘’‚‛“”„‟‹›❮❯❛❜❝❞❟❠'),'')

Test Text Strings Equality

texts_equal[source]

texts_equal(text1:str, text2:str, ignore_e:bool=True, verbose=False)

Check if text1 equals text2. Optionally ignore diff between е and ё.

texts_equal("что-ли а", "что-то и", verbose=False)
(False, 'что ЛИ А', 'что ТО И')
texts_equal("что-ли а", "что-то и", verbose=True)
(False, 'что ЛИ А', 'что ТО И')
test_eq(texts_equal("1234", "12345", verbose = False), (False, "1234", "12345"))
#test_stdout(lambda: test_eq(texts_equal("1234", "12345", verbose = True), False), "Not equal length")

test_eq(texts_equal("все", "всё", ignore_e = True, verbose = False), (True, "все", "всё"))
test_eq(texts_equal("все", "всё", ignore_e = False, verbose = False), (False, "всЕ", "всЁ"))
#test_stdout(lambda: texts_equal("все", "всё", ignore_e = False, verbose = True), "всЕ != всЁ")

test_eq(texts_equal("слово ещё одно", "слово ещё одно"), (True,"слово ещё одно", "слово ещё одно"))

Pipelines

basic_cleaner[source]

basic_cleaner(text:str)

Basic pipeline: lowercase and collapse whitespaces.

test_eq(basic_cleaner(
    'Привет   Джон, т.е. Иван, т.к. русский. И т.д.   и т.п.'),
    'привет джон, т.е. иван, т.к. русский. и т.д. и т.п.')

russian_cleaner[source]

russian_cleaner(text, purge_digits=True, _purge_dots=False)

Pipeline for cleaning Russian text.

russian_cleaner2[source]

russian_cleaner2(text, purge_digits=True, _purge_dots=False)

Pipeline for cleaning and lowercase Russian text.

test_eq(russian_cleaner(
        'Привет «Джон», т.е.     Иван, т.к. русский... И т.д. и т.п. Ой!. Ага?. / "Стоп"..'),
        'Привет Джон, то есть Иван, так как русский. и так далее. и тому подобное. Ой! Ага? Стоп')

Sentences Tokenizer

from razdel import sentenize
fname = '/home/condor/git/cyrillica/b-ish.txt'
with open(fname) as f:
    text = f.read()
text
'\ufeff\n\n\n\n\n\n\n\nВсе думают, что знают историю Америки, но когда заходит речь о морских приключениях, мы пересказываем сказки. Взять хотя бы морских чудовищ – пиратов. Вы знали, что они сражались совсем не так, как нам показывают в кино? И что Чёрная Борода боялся, как бы враги не раскрыли его секрет? И что за фокусы с исчезновением показывает Бермудский треугольник? (00:25) Инопланетяне не угоняли звено «девятнадцать», виновник жил у нас дома. Суши вёсла, парень, я – Джейми Кэйлер. Пора порубить мифы на мелкие кусочки… и выкопать сундук… с правдой. \n\n\nАМЕРИКА:  ФАКТЫ  И  ДОМЫСЛЫ\n\n\nЗолотой век пиратства пришёлся на период с тысяча шестьсот  девяностого по тысяча семьсот тридцатый год. Но большинство пиратов быстро отходили от дел. Эдвард Тич.. знаменитый Чёрная Борода.. наводил страх на моря меньше двух лет. Как и многие пираты, он получил раннюю пенсию.. вместе с ударом абордажной сабли. Короткая карьера, зато наследие на века. Но всё, что мы знаем, омыто океаном фантазии. Аж поджилки трясутся.\n\n\nРеальность пиратства далеко не романтична.\n\n\nКевин Макдоналд, Университет Лойолы\n\n\nДалеко не Голливуд.\n\n\nМиф складывался постепенно.\n\n\nРоберт Ричи, писатель\n\n\nВот что мы уже знаем про пиратов и пиратство, детки. / Волны Карибского моря и Атлантики не знают закона из-за орды варваров в маскарадных костюмах. \n\n\nПовязка на одном глазу, деревянная нога, попугай на плече, вооружены до зубов.\n\n\nПод командованием капитанов-самодуров корабли под флагом с черепом и костями.. обрушивают шквал ядер на торговые суда, вырезают команды и заставляют оставшихся в живых пройти по доске. / 02:30 Захватив золото, серебро, драгоценности и дублоны, пираты прятали добычу в тайном месте и перепрятывали с помощью карты-головоломки. Верно?\n\n\nДОМЫСЕЛ \n\n\nВ этой лихой истории спрятан целый сундук заблуждений, начиная с образа безбашенного капитана, которому все подчиняются. На самом деле власть опасного Чёрного Бороды была жёстко ограничена демократическими правилами пиратов.\n\n\nОни голосовали по каждому поводу.\n\n\nКристин Маркель Лампе, писатель\n\n\nОни могли изгнать капитана. Но только не во время битвы.\n\n\nПалубная демократия ничуть не похожа на диктатуру и унижения в европейском флоте. Враги пиратов, капитаны военных кораблей – вот настоящие тираны морей. \n\n\nОни считали матросов.. тупицами и.. отбросами…\n\n\nГейл Селинджер, писатель\n\n\nДержать их в узде можно только с помощью лишений.. и наказаний. А пираты, почти все, были.. матросами, и когда они уходили к пиратам, их экипажи не желали давать одному человеку столько власти. \n\n\nТолько во время боя власть капитана была абсолютной. И он может наводить ужас сколько пожелает. Перед каждым боем Чёрная борода… украшал волосы… медленно тлеющими запалами: казалось, что у него голова горит. \n\n\nПредставьте: стоите вы на палубе, и на вас надвигается огромный мужик с бородой, и вокруг его головы вьётся дым. ..Какой вы ни крутой, а всё равно закричите «помоги господи».\n\n\nА как же другие пиратские примочки? Крюки, повязки на глаза, костыли?\n\n\nА вот это всё правда.\n\n\nПираты – любимые клиенты изготовителей протезов, потому что в море легко получить увечье. Это боевые раны и травмы из-за плохо закреплённого груза. / 04:51 А ещё могут упасть снасти. / Но, несмотря на нехватку частей тела, пираты всё равно набивали сундуки дублонами. Верно?\n\n\nДОМЫСЕЛ \n\n\nБогатая добыча – большая редкость. Обычно пиратам доставались… карты, оружие, паруса, ром, мыло, свечи или одежда. \n\n\nОни не накопили… богатств. Тем более сокровищ. Они ухитрялись жить на огрызках… выживать.\n\n\nПиратам нужны люди. Поэтому в любой добыче, которую брали на кораблях, важны мужчины. Они выполняли различные задачи на корабле.\n\n\nА как же знаменитые набеги, когда в их крюки попадало бесценное сокровище? Его закапывали и составляли карту? \n\n\nДОМЫСЕЛ\n\n\nЧто за вздор, парень. Пираты… ничего не запасали на чёрный день. \n\n\nПираты спускали добычу быстро, как только заходили в порт: пьянство, азартные игры, женщины. Деньги тратились при первой возможности.\n\n\nПираты не держались за свои сокровища, потому что не рассчитывали прожить долго. \n\n\nТогда почему мы принимаем фантазии о закопанных сокровищах и картах за факты? Скажем спасибо шотландскому писателю Роберту Льюису Стивенсону и залихватским приключениям, которые он описал в тысяча восемьсот восемьдесят третьем году. \n\n\nПочти всё, что мы знаем и представляем себе о пиратах, взято из «Острова сокровищ» Стивенсона. Он придумал, что пираты закапывали сокровища.\n\n\nА ещё он придумал тайные карты, на которых нужное место отмечено крестом.\n\n\nОн нарисовал карту ещё до того, как написал роман, так что вся книжка была написала вокруг маленького крестика на карте. \n\n\nОн же придумал «пятнадцать человек на сундук мертвеца – йо-хо-хо и бутылка рома».\n\n\n\n1\n\n\n'
text = russian_cleaner(text)
text
'Все думают, что знают историю Америки, но когда заходит речь о морских приключениях, мы пересказываем сказки. Взять хотя бы морских чудовищ – пиратов. Вы знали, что они сражались совсем не так, как нам показывают в кино? И что Чёрная Борода боялся, как бы враги не раскрыли его секрет? И что за фокусы с исчезновением показывает Бермудский треугольник? Инопланетяне не угоняли звено девятнадцать, виновник жил у нас дома. Суши вёсла, парень, я – Джейми Кэйлер. Пора порубить мифы на мелкие кусочки. и выкопать сундук. с правдой. АМЕРИКА: ФАКТЫ И ДОМЫСЛЫ Золотой век пиратства пришёлся на период с тысяча шестьсот девяностого по тысяча семьсот тридцатый год. Но большинство пиратов быстро отходили от дел. Эдвард Тич знаменитый Чёрная Борода наводил страх на моря меньше двух лет. Как и многие пираты, он получил раннюю пенсию вместе с ударом абордажной сабли. Короткая карьера, зато наследие на века. Но всё, что мы знаем, омыто океаном фантазии. Аж поджилки трясутся. Реальность пиратства далеко не романтична. Кевин Макдоналд, Университет Лойолы Далеко не Голливуд. Миф складывался постепенно. Роберт Ричи, писатель Вот что мы уже знаем про пиратов и пиратство, детки. Волны Карибского моря и Атлантики не знают закона из-за орды варваров в маскарадных костюмах. Повязка на одном глазу, деревянная нога, попугай на плече, вооружены до зубов. Под командованием капитанов-самодуров корабли под флагом с черепом и костями обрушивают шквал ядер на торговые суда, вырезают команды и заставляют оставшихся в живых пройти по доске. Захватив золото, серебро, драгоценности и дублоны, пираты прятали добычу в тайном месте и перепрятывали с помощью карты-головоломки. Верно? ДОМЫСЕЛ В этой лихой истории спрятан целый сундук заблуждений, начиная с образа безбашенного капитана, которому все подчиняются. На самом деле власть опасного Чёрного Бороды была жёстко ограничена демократическими правилами пиратов. Они голосовали по каждому поводу. Кристин Маркель Лампе, писатель Они могли изгнать капитана. Но только не во время битвы. Палубная демократия ничуть не похожа на диктатуру и унижения в европейском флоте. Враги пиратов, капитаны военных кораблей – вот настоящие тираны морей. Они считали матросов тупицами и отбросами. Гейл Селинджер, писатель Держать их в узде можно только с помощью лишений и наказаний. А пираты, почти все, были матросами, и когда они уходили к пиратам, их экипажи не желали давать одному человеку столько власти. Только во время боя власть капитана была абсолютной. И он может наводить ужас сколько пожелает. Перед каждым боем Чёрная борода. украшал волосы. медленно тлеющими запалами: казалось, что у него голова горит. Представьте: стоите вы на палубе, и на вас надвигается огромный мужик с бородой, и вокруг его головы вьётся дым. Какой вы ни крутой, а всё равно закричите помоги господи. А как же другие пиратские примочки? Крюки, повязки на глаза, костыли? А вот это всё правда. Пираты – любимые клиенты изготовителей протезов, потому что в море легко получить увечье. Это боевые раны и травмы из-за плохо закреплённого груза. А ещё могут упасть снасти. Но, несмотря на нехватку частей тела, пираты всё равно набивали сундуки дублонами. Верно? ДОМЫСЕЛ Богатая добыча – большая редкость. Обычно пиратам доставались. карты, оружие, паруса, ром, мыло, свечи или одежда. Они не накопили. богатств. Тем более сокровищ. Они ухитрялись жить на огрызках. выживать. Пиратам нужны люди. Поэтому в любой добыче, которую брали на кораблях, важны мужчины. Они выполняли различные задачи на корабле. А как же знаменитые набеги, когда в их крюки попадало бесценное сокровище? Его закапывали и составляли карту? ДОМЫСЕЛ Что за вздор, парень. Пираты. ничего не запасали на чёрный день. Пираты спускали добычу быстро, как только заходили в порт: пьянство, азартные игры, женщины. Деньги тратились при первой возможности. Пираты не держались за свои сокровища, потому что не рассчитывали прожить долго. Тогда почему мы принимаем фантазии о закопанных сокровищах и картах за факты? Скажем спасибо шотландскому писателю Роберту Льюису Стивенсону и залихватским приключениям, которые он описал в тысяча восемьсот восемьдесят третьем году. Почти всё, что мы знаем и представляем себе о пиратах, взято из Острова сокровищ Стивенсона. Он придумал, что пираты закапывали сокровища. А ещё он придумал тайные карты, на которых нужное место отмечено крестом. Он нарисовал карту ещё до того, как написал роман, так что вся книжка была написала вокруг маленького крестика на карте. Он же придумал пятнадцать человек на сундук мертвеца – йо-хо-хо и бутылка рома.'
for s in sentenize(russian_cleaner(text)):
    print(s.text)
Все думают, что знают историю Америки, но когда заходит речь о морских приключениях, мы пересказываем сказки.
Взять хотя бы морских чудовищ – пиратов.
Вы знали, что они сражались совсем не так, как нам показывают в кино?
И что Чёрная Борода боялся, как бы враги не раскрыли его секрет?
И что за фокусы с исчезновением показывает Бермудский треугольник?
Инопланетяне не угоняли звено девятнадцать, виновник жил у нас дома.
Суши вёсла, парень, я – Джейми Кэйлер.
Пора порубить мифы на мелкие кусочки. и выкопать сундук. с правдой.
АМЕРИКА: ФАКТЫ И ДОМЫСЛЫ Золотой век пиратства пришёлся на период с тысяча шестьсот девяностого по тысяча семьсот тридцатый год.
Но большинство пиратов быстро отходили от дел.
Эдвард Тич знаменитый Чёрная Борода наводил страх на моря меньше двух лет.
Как и многие пираты, он получил раннюю пенсию вместе с ударом абордажной сабли.
Короткая карьера, зато наследие на века.
Но всё, что мы знаем, омыто океаном фантазии.
Аж поджилки трясутся.
Реальность пиратства далеко не романтична.
Кевин Макдоналд, Университет Лойолы Далеко не Голливуд.
Миф складывался постепенно.
Роберт Ричи, писатель Вот что мы уже знаем про пиратов и пиратство, детки.
Волны Карибского моря и Атлантики не знают закона из-за орды варваров в маскарадных костюмах.
Повязка на одном глазу, деревянная нога, попугай на плече, вооружены до зубов.
Под командованием капитанов-самодуров корабли под флагом с черепом и костями обрушивают шквал ядер на торговые суда, вырезают команды и заставляют оставшихся в живых пройти по доске.
Захватив золото, серебро, драгоценности и дублоны, пираты прятали добычу в тайном месте и перепрятывали с помощью карты-головоломки.
Верно?
ДОМЫСЕЛ В этой лихой истории спрятан целый сундук заблуждений, начиная с образа безбашенного капитана, которому все подчиняются.
На самом деле власть опасного Чёрного Бороды была жёстко ограничена демократическими правилами пиратов.
Они голосовали по каждому поводу.
Кристин Маркель Лампе, писатель Они могли изгнать капитана.
Но только не во время битвы.
Палубная демократия ничуть не похожа на диктатуру и унижения в европейском флоте.
Враги пиратов, капитаны военных кораблей – вот настоящие тираны морей.
Они считали матросов тупицами и отбросами.
Гейл Селинджер, писатель Держать их в узде можно только с помощью лишений и наказаний.
А пираты, почти все, были матросами, и когда они уходили к пиратам, их экипажи не желали давать одному человеку столько власти.
Только во время боя власть капитана была абсолютной.
И он может наводить ужас сколько пожелает.
Перед каждым боем Чёрная борода. украшал волосы. медленно тлеющими запалами: казалось, что у него голова горит.
Представьте: стоите вы на палубе, и на вас надвигается огромный мужик с бородой, и вокруг его головы вьётся дым.
Какой вы ни крутой, а всё равно закричите помоги господи.
А как же другие пиратские примочки?
Крюки, повязки на глаза, костыли?
А вот это всё правда.
Пираты – любимые клиенты изготовителей протезов, потому что в море легко получить увечье.
Это боевые раны и травмы из-за плохо закреплённого груза.
А ещё могут упасть снасти.
Но, несмотря на нехватку частей тела, пираты всё равно набивали сундуки дублонами.
Верно?
ДОМЫСЕЛ Богатая добыча – большая редкость.
Обычно пиратам доставались. карты, оружие, паруса, ром, мыло, свечи или одежда.
Они не накопили. богатств.
Тем более сокровищ.
Они ухитрялись жить на огрызках. выживать.
Пиратам нужны люди.
Поэтому в любой добыче, которую брали на кораблях, важны мужчины.
Они выполняли различные задачи на корабле.
А как же знаменитые набеги, когда в их крюки попадало бесценное сокровище?
Его закапывали и составляли карту?
ДОМЫСЕЛ Что за вздор, парень.
Пираты. ничего не запасали на чёрный день.
Пираты спускали добычу быстро, как только заходили в порт: пьянство, азартные игры, женщины.
Деньги тратились при первой возможности.
Пираты не держались за свои сокровища, потому что не рассчитывали прожить долго.
Тогда почему мы принимаем фантазии о закопанных сокровищах и картах за факты?
Скажем спасибо шотландскому писателю Роберту Льюису Стивенсону и залихватским приключениям, которые он описал в тысяча восемьсот восемьдесят третьем году.
Почти всё, что мы знаем и представляем себе о пиратах, взято из Острова сокровищ Стивенсона.
Он придумал, что пираты закапывали сокровища.
А ещё он придумал тайные карты, на которых нужное место отмечено крестом.
Он нарисовал карту ещё до того, как написал роман, так что вся книжка была написала вокруг маленького крестика на карте.
Он же придумал пятнадцать человек на сундук мертвеца – йо-хо-хо и бутылка рома.

Set of characters in the origial text

print(f'Char\tDec\tHex\tPrintable?')
for i,c in enumerate(sorted(set(text))):
    print(f'{c}\t{ord(c)}\t{hex(ord(c))}\t{c.isprintable()}')
Char	Dec	Hex	Printable?
 	32	0x20	True
,	44	0x2c	True
-	45	0x2d	True
.	46	0x2e	True
:	58	0x3a	True
?	63	0x3f	True
А	1040	0x410	True
Б	1041	0x411	True
В	1042	0x412	True
Г	1043	0x413	True
Д	1044	0x414	True
Е	1045	0x415	True
З	1047	0x417	True
И	1048	0x418	True
К	1050	0x41a	True
Л	1051	0x41b	True
М	1052	0x41c	True
Н	1053	0x41d	True
О	1054	0x41e	True
П	1055	0x41f	True
Р	1056	0x420	True
С	1057	0x421	True
Т	1058	0x422	True
У	1059	0x423	True
Ф	1060	0x424	True
Ч	1063	0x427	True
Ы	1067	0x42b	True
Э	1069	0x42d	True
а	1072	0x430	True
б	1073	0x431	True
в	1074	0x432	True
г	1075	0x433	True
д	1076	0x434	True
е	1077	0x435	True
ж	1078	0x436	True
з	1079	0x437	True
и	1080	0x438	True
й	1081	0x439	True
к	1082	0x43a	True
л	1083	0x43b	True
м	1084	0x43c	True
н	1085	0x43d	True
о	1086	0x43e	True
п	1087	0x43f	True
р	1088	0x440	True
с	1089	0x441	True
т	1090	0x442	True
у	1091	0x443	True
ф	1092	0x444	True
х	1093	0x445	True
ц	1094	0x446	True
ч	1095	0x447	True
ш	1096	0x448	True
щ	1097	0x449	True
ы	1099	0x44b	True
ь	1100	0x44c	True
э	1101	0x44d	True
ю	1102	0x44e	True
я	1103	0x44f	True
ё	1105	0x451	True
–	8211	0x2013	True

Set of characters in the cleaned text

print(f'Char\tDec\tHex\tPrintable?')
for i,c in enumerate(sorted(set(russian_cleaner2(text)))):
    print(f'{c}\t{ord(c)}\t{hex(ord(c))}\t{c.isprintable()}')
Char	Dec	Hex	Printable?
 	32	0x20	True
,	44	0x2c	True
-	45	0x2d	True
.	46	0x2e	True
:	58	0x3a	True
?	63	0x3f	True
а	1072	0x430	True
б	1073	0x431	True
в	1074	0x432	True
г	1075	0x433	True
д	1076	0x434	True
е	1077	0x435	True
ж	1078	0x436	True
з	1079	0x437	True
и	1080	0x438	True
й	1081	0x439	True
к	1082	0x43a	True
л	1083	0x43b	True
м	1084	0x43c	True
н	1085	0x43d	True
о	1086	0x43e	True
п	1087	0x43f	True
р	1088	0x440	True
с	1089	0x441	True
т	1090	0x442	True
у	1091	0x443	True
ф	1092	0x444	True
х	1093	0x445	True
ц	1094	0x446	True
ч	1095	0x447	True
ш	1096	0x448	True
щ	1097	0x449	True
ы	1099	0x44b	True
ь	1100	0x44c	True
э	1101	0x44d	True
ю	1102	0x44e	True
я	1103	0x44f	True
ё	1105	0x451	True
–	8211	0x2013	True

Set of the removed/replaced characters

print(f'Char\tDec\tHex\tPrintable?')
for i,c in enumerate(sorted( set(text).difference(set(russian_cleaner2(text))))):
    print(f'{c}\t{ord(c)}\t{hex(ord(c))}\t{c.isprintable()}')
Char	Dec	Hex	Printable?
А	1040	0x410	True
Б	1041	0x411	True
В	1042	0x412	True
Г	1043	0x413	True
Д	1044	0x414	True
Е	1045	0x415	True
З	1047	0x417	True
И	1048	0x418	True
К	1050	0x41a	True
Л	1051	0x41b	True
М	1052	0x41c	True
Н	1053	0x41d	True
О	1054	0x41e	True
П	1055	0x41f	True
Р	1056	0x420	True
С	1057	0x421	True
Т	1058	0x422	True
У	1059	0x423	True
Ф	1060	0x424	True
Ч	1063	0x427	True
Ы	1067	0x42b	True
Э	1069	0x42d	True
assert check_no_numbers(russian_cleaner(text))== []
text = '''Восклицательное предложение! А это какое? Инициалы -- не повод разрывать. Правда, А.С. Пушкин? -- Разумеется, голубчик. (Скобки оставляем.)'''
for _ in sentenize(text):
    print(_.text)
Восклицательное предложение!
А это какое?
Инициалы -- не повод разрывать.
Правда, А.С. Пушкин?
-- Разумеется, голубчик.
(Скобки оставляем.)