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



在日语中,有组合变音标记适用于某些假名,因此say"か"(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()函数分解字符(从NFC形式移动到NFD形式)来消除语音

>>> import unicodedata
>>> print(ascii(unicodedata.normalize('NFD', 'u304c')))
'u304bu3099'

因此CCD_ 5可以实现为:

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]

最新更新