Как правильно склеить разорванные части слов в тексте? Посоветуйте подходы

Рейтинг: 0Ответов: 1Опубликовано: 29.07.2025

Пример строки на входе "При вет мен я зовут И лья" Строка на выходе "Привет меня зовут Илья"

Я пробовал применять LLM модели, работает неплохо, но скорость ответа довольна низкая (модель устанавливалась локально). Обработать нужно тысячи строк.

Ответы

▲ 0

Комбинировать слова и пытаться искать существующие словоформы:

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.