Как разделить слипшиеся слова в строке?
В тексте встречаются слипшиеся фрагменты. Как разделить их на слова?
Пример:
Длядоставкипросимоперативнопредоставитьуточненныеданные,иначеотправлениебудетавтоматическивозвращенозавашсчет.
В тексте встречаются слипшиеся фрагменты. Как разделить их на слова?
Пример:
Длядоставкипросимоперативнопредоставитьуточненныеданные,иначеотправлениебудетавтоматическивозвращенозавашсчет.
Идеально пока не получилось, но близко к тому, нужно ещё шаманить:
# 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 Улучшил результат до полностью правильного разбиения "Для доставки просим оперативно предоставить уточненные данные , иначе отправление будет автоматически возвращено за ваш счет ." но кода получилось сильно больше и думает почти секунду. Чем длиннее фрагмент, тем дольше думает, сложность квадратичная. Хотя тут можно было по запятой разбить предварительно на отдельные фразы для обработки, потом ещё подумаю, задача интересная.