Pull to refresh

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)

Да, похоже в данном случае это вообще единственный нормальный вариант )

В форточку влетает зануда
Зануда: Кадратные с-з-з-з-кобки не нуж-ж-ж-ны, не нуж-ж-ж-ны! Лишний масс-с-ифф! Лиш-ш-ш-шний!
Зануда делает круг и вылетает обратно

Без кадратных с-з-з-з-кобок на 15% медленнее

В том, что я нубка, о чем честно предупреждаю :) Но за идею спасибо, возьму на вооружение.

Метод translate не работает потому что нужно перед этим использовать maketrans

А это разовая задача или вам часто надо будет словари таким образом чистить?

Пока не знаю. Это была достаточно внезапная для меня задача, я просто решила упростить себе отбор материала для исследования (чисто лингвистического, не связанного с IT), представив текст словаря в виде удобоваримой базы данных. Но если завкафедрой понравится конечный результат, то, может, возьмусь и за другие словари.

Честно говоря, первый способ выглядит лучше – да там список замен, но он читается однозначно и не сломает ничего, если по какой-то причине в словах будут @#% или просто другие диакритические буквы. А особенно если задача была сделать один раз - то на этом можно было и останавливаться

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

был у меня файл на мегабайт в юникоде где всего в одном месте было ударение но оно меняло смысл мегабайта - не смог заменить апострофом или заглавной буквой чтобы уменьшить фaйл в два раза ... программно убедился что только в одном месте файла ударение - стóит

...а можно было просто воспользоваться утилитой unaccent

Sign up to leave a comment.

Articles