删除字符中的重音符号,同时保留其他变音符号

Ada*_*yer 5 python unicode nlp internationalization cyrillic

在一些用拉丁语和西里尔语书写的斯拉夫语言中,上升和下降重音标记仅用于消除上下文歧义,即仅在元音上不一致。

\n\n

我想要一个Python代码或lib删除元音中的锐音和重音,同时保留其他变音符号。

\n\n

例如:
\n \xd0\xb6\xd1\x9d\xd0\xb7\xd0\xbd\xd0\xb5\xd1\x81\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbe\xcc\x81\ xd0\xb1\xd0\xbd\xd1\x8b\xd0\xb9 -> \xd0\xb6\xd0\xb8\xd0\xb7\xd0\xbd\xd0\xb5\xd1\x81\xd0\xbf\xd0\xbe\ xd1\x81\xd0\xbe\xd0\xb1\xd0\xbd\xd1\x8b\xd0\xb9
\n \xd1\x81\xc3\xa8\xd1\x81\xd0\xb5\xd1\x84\xd0\xb0\ xd1\x9c\xd0\xb0 -> \xd1\x81\xd0\xb5 \xd1\x81\xd0\xb5 \xd1\x84\xd0\xb0\xd1\x9c\xd0\xb0 \
n k\xc8\x95\xc4 \x87ica -> ku\xc4\x87ica

\n\n

如果有任何帮助,这里是斯拉夫语言西里尔字母中所有实际(即无重音)字母的完整列表,包括带有变音符号的字母:

\n\n
\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4\xd0\xb5\xd0\xb6\xd0\xb7\xd0\xb8\xd0\xba\xd0\xbb\xd0\xbc\xd0\xbd\xd0\xbf\xd0\xbe\xd1\x80\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xd1\x86\xd1\x88\xd1\x94\xd2\x91\xd1\x96\xd1\x97\xd1\x91\xd1\x8b\xd1\x96\xd1\x9e\xd1\x89\xd1\x8a\xd1\x8c\xd1\x8e\xd1\x8f\xd0\xb9\xd1\x98\xd1\x9a\xd1\x99\xd1\x9f\xd1\x92\xd1\x9b\xd0\xb7\xcc\x81\xd1\x81\xcc\x81\xd1\x9c\xd1\x93\xd1\x95\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n
    \n
  1. \xd1\x97\xd1\x91\xd1\x8b\xd1\x96\xd1\x9e\xd0\xb9是元音,即使锐音和重音符号被去除,也应保留其变音符号。但这种情况非常罕见,或者说是不可能的,我们可以忽略这种情况。

  2. \n
  3. \xd0\xb7\xcc\x81\xd1\x81\xcc\x81\xd1\x9c\xd1\x93是辅音,如拉丁语\xc4\x87\xc7\xb5\xc5\x9b\xc5\xba。他们应该保留尖锐的重音标记 - 他们不会出于发音或消歧目的而添加任何标记。

  4. \n
  5. 在精确正式映射为官方的字母表中,具有锐音重音的拉丁辅音的西里尔语等效项不一定具有锐音。(也许这很有帮助。)

  6. \n
  7. 双锐音和双重音的优先级较低。

  8. \n
\n\n

这些字符的背景阅读:
\n https://en.wikipedia.org/wiki/I_with_grave_(Cyrillic)#East_Slavic_languages \n https://en.wikipedia.org/wiki/Shtokavian#Accentuation
\n https://en .wikipedia.org/wiki/Pitch_accent#塞尔维亚-克罗地亚语
\n https://en.wikipedia.org/wiki/Bulgarian_alphabet#.D0.8D
\n https://en.wikipedia.org/wiki/Macedonian_alphabet#Accented_letters

\n\n

类似的问题:
\n 从字符串中删除重音/变音符号,同时保留其他特殊字符(尝试过 mb_chars.normalize 和 iconv)
\n 如何在 Python 3.5 中删除重音并使用 unicodedata 或其他解决方案获取字符串?

\n

Ant*_*ala 3

如果您可以列出相应的对,则不需要任何库。

\n\n
>>> unaccentify = {\n...    '\xd1\x9d': '\xd0\xb8',\n...    '\xd0\xbe\xcc\x81': '\xd0\xbe'\n... }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我本来打算为此建议 string.translate ,但不幸的是它不起作用,因为\xd0\xbe\xcc\x81. 因此,我们确保左侧字符经过 NFKC 标准化:

\n\n
>>> import unicodedata\n>>> unaccentify = {unicodedata.normalize('NFKC', i):j for i, j in unaccentify.items()}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我们对所有可能的替换字母进行正则表达式:

\n\n
>>> import re\n>>> pattern = re.compile('|'.join(unaccentify))\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用pattern.sub进行替换,从表中查找非重音字符。但首先我们需要规范化源字符串:

\n\n
>>> def replacer(match):\n...     return unaccentify[match.group(0)]\n...\n>>> source = unicodedata.normalize('NFKC', '\xd0\xb6\xd1\x9d\xd0\xb7\xd0\xbd\xd0\xb5\xd1\x81\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbe\xcc\x81\xd0\xb1\xd0\xbd\xd1\x8b\xd0\xb9')\n>>> pattern.sub(replacer, source)\n'\xd0\xb6\xd0\xb8\xd0\xb7\xd0\xbd\xd0\xb5\xd1\x81\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbe\xd0\xb1\xd0\xbd\xd1\x8b\xd0\xb9'\n
Run Code Online (Sandbox Code Playgroud)\n