在日语中,有组合变音标记适用于某些假名,因此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]