Комбинировать слова и пытаться искать существующие словоформы:
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
def merge_broken_words(text):
end_symbol = text[-1] if text[-1] in '.!?' else ''
text_cleaned = text[:-1] if end_symbol else text
words = text_cleaned.split()
merged_words = []
i = 0
while i < len(words):
max_valid = words[i] # Текущее слово.
max_end = i + 1
# Пробуем объединить до 5 следующих слов (можно изменить при необходимости),
# так как непонятно насколько деформированы слова:
for j in range(i + 1, min(i + 6, len(words) + 1)):
candidate = ''.join(words[i:j])
# print(candidate, morph.word_is_known(candidate))
if morph.word_is_known(candidate):
if len(candidate) > len(max_valid):
max_valid = candidate
max_end = j
merged_words.append(max_valid)
i = max_end # Перескакиваем на конец объединённого блока.
return ' '.join(merged_words) + end_symbol
Тест:
texts = [
'При вет мен я зовут И лья.',
'Се год ня я и ду в ки но!',
'У меня за вт ра эк за мен.',
'По чему ты не от ве ча ешь?',
'Это был са мый луч ший день в мо ей ж и з н и.'
]
for text in texts:
print(f'До: {text}')
print(f'После: {merge_broken_words(text)}\n')
До: При вет мен я зовут И лья.
После: Привет меня зовут Илья.
До: Се год ня я и ду в ки но!
После: Сегодня я иду в кино!
До: У меня за вт ра эк за мен.
После: У меня завтра экзамен.
До: По чему ты не от ве ча ешь?
После: Почему тыне отвечаешь? <===
До: Это был са мый луч ший день в мо ей ж и з н и.
После: Это был самый лучший день в моей жизни.
Понятно, что всегда можно найти такие варианты текста, что получится: "Почему тыне отвечаешь?"
Потому что:
morph.parse('тыне')
>>> [Parse(word='тыне', tag=OpencorporaTag('NOUN,inan,masc sing,loct'), normal_form='тын', score=1.0, methods_stack=((DictionaryAnalyzer(), 'тыне', 34, 5),))]
Но в целом, кмк, с этим можно работать, это быстро и без LLM.