日本語(カタカナ)をモーラ単位で分かち書き【Python】


はじめに

日本語(カタカナ文字列)をモーラ単位で分かち書き(モーラ分かち書き)するpythonの関数を作りました。

元文 モーラ分かち書き 音節分かち書き
ガッキューシンブン ガ/ッ/キュ/ー/シ/ン/ブ/ン ガッ/キュー/シン/ブン
アウトバーン ア/ウ/ト/バ/ー/ン ア/ウ/ト/バーン

日本語の音韻の代表的な分割単位としてモーラと音節があります。モーラはいわゆる俳句の「5・7・5」を数えるときの区切り方で、長音(ー)、促音(ッ)、撥音(ン)も1拍と数えます。それに対し、音節では長音、促音、撥音は単体で数えられず、直前の単一で音節となれるカナと合わせてひとつの拍と見なされます。詳細はモーラ - Wikipediaを御覧ください。

本稿ではモーラ単位での分かち書きのやり方を説明します。
音節単位での分かち書きについては下記で説明しています。
日本語(カタカナ)を音節単位で分かち書き【Python】

環境

  • macOS Catalina 10.15.4
  • python3.8.0

方針

考えやすくするために、入力は記号を含まない全角カタカナの文字列とします。また、長音で表せるところは長音に変換されているものとします。これは例えば「ガッキュウ」は「ガッキュー」のように表現されているという意味です。

なお、漢字仮名交じり文を発音のカタカナ文字列に変換する方法は別記事にまとめましたので、もしよければ御覧ください。ただし、MeCabを使っていますので、辞書にない言葉は変換できません。

このとき、モーラの構成条件を下記のいずれかと定義します。

  1. ウ段+「ァ/ィ/ェ/ォ」
  2. イ段(「イ」を除く)+「ャ/ュ/ェ/ョ」
  3. 「テ/デ」+「ャ/ィ/ュ/ョ」
  4. 上記以外のカタカナ1文字

これは

正規表現 意味
[ウクスツヌフムユルグズヅブプヴ][ァィェォ] ウ段+「ァ/ィ/ェ/ォ」
[イキシチニヒミリギジヂビピ][ャュェョ] イ段(「イ」を除く)+「ャ/ュ/ェ/ョ」
[テデ][ャィュョ] 「テ/デ」+「ャ/ィ/ュ/ョ」
[ァ-ヴー] カタカナ1文字

としたとき、'(①|②|③|④)'のように書けます。

コード

import re

#各条件を正規表現で表す
c1 = '[ウクスツヌフムユルグズヅブプヴ][ァィェォ]' #ウ段+「ァ/ィ/ェ/ォ」
c2 = '[イキシチニヒミリギジヂビピ][ャュェョ]' #イ段(「イ」を除く)+「ャ/ュ/ェ/ョ」
c3 = '[テデ][ィュ]' #「テ/デ」+「ャ/ィ/ュ/ョ」
c4 = '[ァ-ヴー]' #カタカナ1文字(長音含む)

cond = '('+c1+'|'+c2+'|'+c3+'|'+c4+')'
re_mora = re.compile(cond)

def moraWakachi(kana_text):
    return re_mora.findall(kana_text)

text = 'シンシュンシャンソンショー'
print(text)
print(moraWakachi(text))
print('')

text = 'トーキョートッキョキョカキョク'
print(text)
print(moraWakachi(text))
print('')

text = 'アウトバーン'
print(text)
print(moraWakachi(text))
print('')

text = 'ガッキュウホウカイ'
print(text)
print(moraWakachi(text))

出力は下記です。

シンシュンシャンソンショー
['シ', 'ン', 'シュ', 'ン', 'シャ', 'ン', 'ソ', 'ン', 'ショ', 'ー']

トーキョートッキョキョカキョク
['ト', 'ー', 'キョ', 'ー', 'ト', 'ッ', 'キョ', 'キョ', 'カ', 'キョ', 'ク']

アウトバーン
['ア', 'ウ', 'ト', 'バ', 'ー', 'ン']

ガッキュウホウカイ
['ガ', 'ッ', 'キュ', 'ウ', 'ホ', 'ウ', 'カ', 'イ']