概要
日本語のモウラを子音と母音に分ける方法を検討しました。
結論
jamorasep
を使ってsimple-ipa表記に変換したあと、末尾以外を子音、末尾を母音として取り出すのがよさそうです。
pip install jamorasep
import jamorasep
from typing import Tuple
def split_consonant_vowel(mora: str) -> Tuple[str, str]:
simpleipa = jamorasep.parse(mora, output_format='simple-ipa')[0]
consonant, vowel = "".join(simpleipa[:-1]), simpleipa[-1]
return consonant, vowel
print(split_consonant_vowel("ア"))
print(split_consonant_vowel("ン"))
print(split_consonant_vowel("ッ"))
print(split_consonant_vowel("キャ"))
print(split_consonant_vowel("シャ"))
print(split_consonant_vowel("クヮ"))
('', 'a')
('', 'N')
('', 'Q')
('kj', 'a')
('ɕ', 'a')
('kw', 'a')
検討した事項
jaconv
やpykakasi
などでローマ字に変換してから前と後ろのアルファベットに分ければそれでよいかと最初思いましたが、「クヮ」「リェ」のようなマイナーなモウラに対して理想の結果になりませんでした。調べた範囲では、jamorasepでsimple-ipaに変換した場合が最も理想的だったので、それを採用しました。以下はjaconvで少し試した例です。
import jaconv
print(jaconv.kata2alphabet("クヮ"))
print(jaconv.hiragana2julius("くゎ"))
kuゎ
k u w a
jamorasepを使う場合、output_formatを訓令式ローマ字にするか、ヘボン式ローマ字にするか、シンプルIPAにするかは、同リポジトリに含まれるkanamap.csvを眺めて決めました。
訓令式はナイーブに実装すると「スィ(tui)」と「サ(sa)」の子音が異なってしまうなど、違和感のある結果になるため、不採用にしました。
ヘボン式も同様に「デャ(deya)」と「ディ(dei)」の子音などはナイーブに実装すると異なってしまい違和感があるため、不採用にしました。