Как разделить слипшиеся слова в строке?

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

В тексте встречаются слипшиеся фрагменты. Как разделить их на слова?

Пример:

Длядоставкипросимоперативнопредоставитьуточненныеданные,иначеотправлениебудетавтоматическивозвращенозавашсчет.

Ответы

▲ 2Принят

Идеально пока не получилось, но близко к тому, нужно ещё шаманить:

# pip install pymorphy3
import pymorphy3

def calc_score(z):
    score = 0
    for m in z:
        if 'UNKN' not in m.tag and 'FakeDictionary' not in str(m.methods_stack) and 'UnknownPrefixAnalyzer' not in str(m.methods_stack):
           score += m.score
    return round(score, 2)

text = "Длядоставкипросимоперативнопредоставитьуточненныеданные,иначеотправлениебудетавтоматическивозвращенозавашсчет."
morph = pymorphy3.MorphAnalyzer()

a = 0
b = a + 1
result = []
while a <= len(text):
    tmp = []
    for i in range(b, len(text)+1):
        m = morph.parse(text[a:i])
        tmp.append((calc_score(m), i, text[a:i]))
    if tmp:
        item = max(tmp)
        result.append(text[a:item[1]])
        a = item[1]
        b = a + 1
    else:
        result.append(text[a:])
        break
print(' '.join(result))

Вывод:

Для доставки просимо пера т ив но предоставить уточненные данные , иначе отправление будет автоматически возвращено зава ш счет .

Суть:

  • пробуем с помощью лексического анализатора поставить оценку достоверности как цельному слову кускам текста от текущей позиции и до по очереди от следующей позиции и до конца текста
  • кусок, получивший максимальный скор, а при равном скоре - максимальную длину, считается наиболее подходящим
  • текущая позиция поиска перемещается на конец этого наилучшего куска

Пока есть проблемы - анализатор не идеален, да и скором можно ещё поиграться.

В частности, анализатор почему-то считает вполне хорошим словом "просимо", хотя в русском языке такого слова нет, а из-за этого съезжает анализ дальнейшего фрагмента текста. Ну и дальше есть тоже аналогичные проблемы в конце текста. Но так то на мой взгляд результат уже очень хороший.

В качестве быстрого фикса можно в принципе "штрафовать" алгоритм за уже найденные таким образом вручную неправильные слова.

Update Улучшил результат до полностью правильного разбиения "Для доставки просим оперативно предоставить уточненные данные , иначе отправление будет автоматически возвращено за ваш счет ." но кода получилось сильно больше и думает почти секунду. Чем длиннее фрагмент, тем дольше думает, сложность квадратичная. Хотя тут можно было по запятой разбить предварительно на отдельные фразы для обработки, потом ещё подумаю, задача интересная.