Найти - Пользователи
Полная версия: Приставки
Начало » Python для новичков » Приставки
1 2
Australicys
Всем привет!
Нужна помощь, бьюсь третий день.
Есть бооольшой текст, где приставки типа без, раз, низ и т.д. написаны неверно (безстрашный, безпрестанно)
Как грамотно сделать замену на верные приставки?
Были варианты со словарем, но получается совершенно не то(
Буду рад идеям!
JOHN_16
ну первое что напрашивается это замена за счет регулярных выражений.
MindHatter
В качестве альтернативы регуляркам можешь воспользоваться функцией replace()
text.replace(" безп", " бесп")

В любом случае тебе придется иметь набор правил. Конечно их можно сократить например:
gluhie = ["с", "п", "к", "т"] #ну и все глухие согласные
for g in gluhie:
    text.replace(" без"+g, " бес"+g)

Развивая дальше можно хранить пары на замену в словаре (кстати, а почему не пошла идея?) и вставить в код выше:
prefixes = {'без': 'бес', 'раз': 'рас'} #и так все пары на замену
consonants = {'з': 'с', 'б': 'п', 'г': 'к', 'д': 'т'} #и остальные пары глухих и звонких согласных
for p in prefixes.keys():
    for c in consonants.keys(): #обыгрываются оба случая, как
        text.replace(' '+p+consonants[c], ' '+prefixes[p]+consonants[c]) # замена "без" в "безспорный" так и
        text.replace(' '+prefixes[p]+c, ' '+p+с) # замена "бес" в "бесзаконие"  

Но даже тут ньюансов хватает. Начиная что слово может быть с заглавной буквы, продолжая другими ошибками в тексте (например, “росстроенный”), и заканчивая тем, что это обработка лишь одного правила русского языка на приставки перед звонкими и глухими согласными. А этих правил… Но пока только такая мысля посетила Удачи
py.user.next
MindHatter
text.replace(" безп", " бесп")
появление лишних пробелов свидетельствует об ошибке при выборе алгоритма

MindHatter
text.replace(' '+p+consonants
во-во, код стал наполняться всяким мусором из-за пробелов, которые к делу не относятся

MindHatter
Развивая дальше
развивая дальше, можно сказать, что для строк, в которых замена должна происходить и в первом слове, алгоритм не применим из-за введённых пробелов
MindHatter
“в которых замена должна происходить и в первом слове”

о чем я и упомянул в конце поста. Не нужно мне повторять мною же сказанное. Возможно пробелы то и вовсе не нужны. Но что если подобные сочетания могут встретиться в середине слова?

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



py.user.next
MindHatter
Но что если подобные сочетания могут встретиться в середине слова?
.replace() их заменит
там регулярки нужны

>>> import re
>>> 
>>> s = 'wordword1 wordword2 wordword3'
>>> 
>>> re.sub(r'\bw', r'W', s)
'Wordword1 Wordword2 Wordword3'
>>>
Australicys
всё проще же, нет?

dSOGL = {u'без': u'бес', u'из': u'ис',
         u'раз': u'рас',u'роз': u'рос',
         u'низ': u'нис',u'через': u'черес',}
for line in fIn:
    for k, v in dSOGL.items():
        line = re.sub('\\b' + k + u'([кпстфхцчшщ])' + '(\\w+)', v + '\\1' + \
                      '\\2', line, flags = re.U)
MindHatter
Australicys
всё проще же, нет?

Не совсем. Не считая того, что re.sub() не отработает правильно (у меня по крайней мере точно), вы исправите только приставки “бес”, “рас” (в слове “безпристрастный”, например) и не обработаете обратную ситуацию со словами “бесболезненный” или “исгадить”. К тому же имейте в виду, что есть и такие слова как “безысходность”, “разослать” (то есть после приставки идет гласная), на которые уже нужен отдельный regex.

Все таки повторю мысль, русский язык сложен для поиска универсальных методов обработки в одну строку, даже если это частный случай с приставками. Для каждого случая все равно придется писать код. Регулярные выражения, как советуют py.user.next и JOHN_16 - это хорошо, и я их поддерживаю. И в итоге у вас получится:

1. Набор шаблонов регулярных выражений (то есть каждый случай в русском языке) + набор самих приставок
2. В цикле каждую строку гоняете по всем шаблонам

Короче способа пока не увидел.
py.user.next
Australicys
Есть бооольшой текст, где приставки типа без, раз, низ и т.д. написаны неверно (безстрашный, безпрестанно)
и что мешает их просто заменить?

Australicys
всё проще же, нет?
ну, там что-то лишнее в re.sub() записано
для формирования шаблона используй str.format()
Australicys
MindHatter
обратная ситуация мне не нужна

ну ведь “безысходность” и “разослать” же верно написаны, нет?)

py.user.next
мешает то, что в некоторых случаях они записаны верно, а в некоторых нет
про str.format гляну, спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB