Comments 19
В чем, собственно, проблема просто удалить все вхождения "символа ударения"?
s = "Беспа́мятство\nБеспоко́йно\nБеспоко́йный\nБеспоко́йство\nБеспоко́иться\nБеспоря́дки\nА́ховый"
s_clear = u"".join([c for c in s if ord(c) != 769])
UPD: Мы же не в Индии живем, где за количество строк платят :)
Юникод — сложная штука. Буква "á" может быть представлена как одним кодпоинтом (225), так и двумя (97, 769) или (1072, 769).
В общем случае сказать, как именно эта буква представлена в произвольном тексте, нельзя.
225 — это латинская a с ударением. Для кириллической а отдельного кодпоинта с ударением нет.
Если же предполагать, что в тексте смешана кириллица с латиницей, то чистить надо гораздо серьёзнее, заменяя символы одинакового начертания a-а, e-е, o-о, p-р и так далее.
По уму, конечно, всё так. А по факту приходится приспосабливаться к тому печальному факту, что куча софта с надстрочными знаками юникода нормально работать до сих пор не умеет. Вот даже в Win11 наисвежайшая версия "блокнота" с модными вкладками и тёмной темой периодически отображает их с глюками (ударение съезжает вправо), а при перемещении курсора / выделении текста стрелками считает за 2 символа.
Поэтому, чтобы минимизировать проблемы, сам тоже ударные á, ó, ý и é пишу а латинских версиях, и только и́, ы́, э́, ю́ и я́, для которых латинских аналогов нет, - в комбинированном виде (у меня на них все хоткеи настроены, т.к. имею дурную привычку во всех случаях, когда из-за разного ударения может меняться смысл слова, его явно проставлять).
Я бы тогда предложил заюзать смесь способа @Irval c юникодом, что-то вроде
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if ord(c) != 769])
Сначала нормализуем в конкретное представление, потом удаляем конкретный символ
Тогда мы ещё и букву "й" покорёжим.
й и ё распадутся, как и у автора, на букву и модификатор, можно их собрать обратно нормализовав еще раз в NFKC
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
cleaned = u"".join([c for c in nfkd_form if ord(c) != 769])
return unicodedata.normalize('NFKC', cleaned)
Да, похоже в данном случае это вообще единственный нормальный вариант )
В форточку влетает зануда
Зануда: Кадратные с-з-з-з-кобки не нуж-ж-ж-ны, не нуж-ж-ж-ны! Лишний масс-с-ифф! Лиш-ш-ш-шний!
Зануда делает круг и вылетает обратно
В том, что я нубка, о чем честно предупреждаю :) Но за идею спасибо, возьму на вооружение.
Метод translate не работает потому что нужно перед этим использовать maketrans
А это разовая задача или вам часто надо будет словари таким образом чистить?
Пока не знаю. Это была достаточно внезапная для меня задача, я просто решила упростить себе отбор материала для исследования (чисто лингвистического, не связанного с IT), представив текст словаря в виде удобоваримой базы данных. Но если завкафедрой понравится конечный результат, то, может, возьмусь и за другие словари.
Честно говоря, первый способ выглядит лучше – да там список замен, но он читается однозначно и не сломает ничего, если по какой-то причине в словах будут @#%
или просто другие диакритические буквы. А особенно если задача была сделать один раз - то на этом можно было и останавливаться
Я просто вставил Ваш текст в блокнот windows и сохранил в кодировке по умолчанию, вот что получилось: Беспоко?йство Беспоко?иться Беспоря?дки.
Вопросительные знаки легко удалить можно заменой в том же блокноте.
был у меня файл на мегабайт в юникоде где всего в одном месте было ударение но оно меняло смысл мегабайта - не смог заменить апострофом или заглавной буквой чтобы уменьшить фaйл в два раза ... программно убедился что только в одном месте файла ударение - стóит
...а можно было просто воспользоваться утилитой unaccent
Как я чистила текст от ударений в словах при помощи Python