Уведомления

Группа в Telegram: @pythonsu

#1 Май 8, 2014 00:05:29

Australicys
Зарегистрирован: 2014-05-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Приставки

Всем привет!
Нужна помощь, бьюсь третий день.
Есть бооольшой текст, где приставки типа без, раз, низ и т.д. написаны неверно (безстрашный, безпрестанно)
Как грамотно сделать замену на верные приставки?
Были варианты со словарем, но получается совершенно не то(
Буду рад идеям!

Офлайн

#2 Май 8, 2014 02:45:05

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Приставки

ну первое что напрашивается это замена за счет регулярных выражений.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Май 11, 2014 17:53:48

MindHatter
Зарегистрирован: 2014-05-09
Сообщения: 20
Репутация: +  3  -
Профиль   Отправить e-mail  

Приставки

В качестве альтернативы регуляркам можешь воспользоваться функцией 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+с) # замена "бес" в "бесзаконие"  

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

Отредактировано MindHatter (Май 11, 2014 17:57:16)

Офлайн

#4 Май 11, 2014 18:15:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Приставки

MindHatter
text.replace(" безп", " бесп")
появление лишних пробелов свидетельствует об ошибке при выборе алгоритма

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

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



Отредактировано py.user.next (Май 11, 2014 18:18:25)

Офлайн

#5 Май 11, 2014 18:32:07

MindHatter
Зарегистрирован: 2014-05-09
Сообщения: 20
Репутация: +  3  -
Профиль   Отправить e-mail  

Приставки

“в которых замена должна происходить и в первом слове”

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

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



Офлайн

#6 Май 11, 2014 19:57:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Приставки

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

>>> import re
>>> 
>>> s = 'wordword1 wordword2 wordword3'
>>> 
>>> re.sub(r'\bw', r'W', s)
'Wordword1 Wordword2 Wordword3'
>>>



Офлайн

#7 Май 12, 2014 01:04:14

Australicys
Зарегистрирован: 2014-05-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Приставки

всё проще же, нет?

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)

Офлайн

#8 Май 12, 2014 03:12:25

MindHatter
Зарегистрирован: 2014-05-09
Сообщения: 20
Репутация: +  3  -
Профиль   Отправить e-mail  

Приставки

Australicys
всё проще же, нет?

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

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

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

Короче способа пока не увидел.

Офлайн

#9 Май 12, 2014 05:56:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Приставки

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

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



Отредактировано py.user.next (Май 12, 2014 05:57:47)

Офлайн

#10 Май 12, 2014 10:16:05

Australicys
Зарегистрирован: 2014-05-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Приставки

MindHatter
обратная ситуация мне не нужна

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

py.user.next
мешает то, что в некоторых случаях они записаны верно, а в некоторых нет
про str.format гляну, спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version