gpt4 book ai didi

python - 有没有办法在具有不同变音符号的日语假名字符之间进行 "logical"转换?

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:06 26 4
gpt4 key购买 nike

在日语中,有组合变音符号适用于某些假名,所以说“か”(ka)和“か”( ga) - ga 角色是有声的。

我想知道是否有任何自然的方法(在 Python 中,最好是,尽管关于 unicode 的一般性答案也很好)来做相当于将有声字符转换为无声字符的等价物,反之亦然 - 类似的东西到适用于拉丁脚本的 lower() 方法。我想要做的事情的一个例子:

>>> devoice('が')
"か"
>>> voice('か')
"が"
>>> devoice('か')
"か"
>>> semivoice('は')
"ぱ"
>>> devoice('ぱ')
"は"

目前,我似乎能想出的最好方法是生成一个按行、列和声部索引的查找表,然后查找我拥有的字符并按正确的方向翻译它。也就是说,我想知道是否有更自然的方法。

一个潜在的陷阱是,在我看来,unicode 组合字符似乎不等于它们的单代码点等价物:

>>> a = chr(0x304B) + chr(0x3099)
>>> b = chr(0x304C)
>>> print(a)
'が'
>>> print(b)
'が'
>>> a == b
False

我主要关注那些涉及组合变音符号的,因为检测和去除组合标记似乎很容易。

注意:我不确定我对日语音韵学的了解是否足够了解 (u) 和 的正确行为(vu - 罕见/过时),这又是为什么如果有一种“自然”的方式来做到这一点会很好。

最佳答案

您可以使用 unicodedata.normalize() function 分解字符(从 NFC 到 NFD 形式)来去除声音

>>> import unicodedata
>>> print(ascii(unicodedata.normalize('NFD', '\u304c')))
'\u304b\u3099'

所以 device() 可以实现为:

def devoice(char):
return unicodedata.normalize('NFD', char)[0]

如果发声总是添加 \u3099(看起来像),您可以将其添加到输入的假名中并返回 NFC 组合范式:

def voice(char):
return unicodedata.normalize('NFC', char + '\u3099')

看起来像半浊音意味着你添加\u309a':

def semivoice(char):
return unicodedata.normalize('NFC', char + '\u309a')

您可以使用 unicodedata.decomposition() 来测试是否存在分解:

import unicodedata

def voice(char):
if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or unicodedata.decomposition(char):
return char
return unicodedata.normalize('NFC', char + '\u3099')

def semivoice(char):
if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or unicodedata.decomposition(char):
return char
return unicodedata.normalize('NFC', char + '\u309a')

def devoice(char):
if not ('\u3041' <= char <= '\u3096') or len(char) > 1 or not unicodedata.decomposition(char):
return char
return unicodedata.normalize('NFD', char)[0]

关于python - 有没有办法在具有不同变音符号的日语假名字符之间进行 "logical"转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36521037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com