2016-04-09 9 views
2

、特定仮名に適用アクセント記号が結合している、そう言うとの間の論理的な関係が存在する「か」(KA)と「が」(GA) - GA文字であります声を出した。異なる発音刻印の日本語仮名文字間に論理変換を行う方法はありますか?日本語で

自然な方法があれば(Pythonで、できればunicodeについての一般的な答えは良いですが)、有声文字を無声の同等物に変換するのと同等のことをやりたいと思っています。 latinスクリプトに適用されるlower()メソッドに似ています。私はしているよ何の例:

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

を現時点では、私が思い付くことができるように思われる最善のアプローチは、行、列およびボイシングでインデックス化ルックアップテーブルを生成することで、その後に見えます私が持っているキャラクターをアップし、それを正しい方向に翻訳する。それは、もっと自然なやり方があるかどうかを知りたいと思っています。

一つの潜在的な落とし穴が、文字を組み合わせUnicodeは彼らのシングルコードポイント同等物は等しいとしていないようだように私には思われることである:

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

私はないを行うものを主としています合成マークを検出して除去することは容易であるように思われるので、分音記号を組み合わせることが必要である。

注:は私が正しい動作が(U)と(VU - レア/廃止)何のためにあるのかを知るために十分日本語の音韻を理解することを確認していない、そこにあれば、それはいいだろう、なぜ再びですこれを行うための「自然な」方法でした。

答えて

2

あなたはとてもdevoice()として実装することができunicodedata.normalize() function

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

を使用して、文字(NFDフォームにNFCから移動)を分解することによって、音声を解除することができます常に表明した場合

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

\u3099が追加されていれば、それを入力された仮名に追加して、NFC通常形式を返します:

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

それはsemivoicedのように見えますが、あなたが\u309a'を追加する意味:

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] 
+0

ありがとう:

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

あなたはおそらく分解があるかどうかをテストするためにunicodedata.decomposition()を使用することができます!他の方向はどうですか?私は '' \ u304b \ u3099 'ではなく '' u304c' 'を返すことをお勧めします。 – Paul

+0

@Paul:私はまだその部分に取り組んでいました:-) –

+0

いいね!ありがとう。私は答えを受け入れる前にまだ少し時間があります。 – Paul

関連する問題