🌊

日本語をなんでも猫語に変換するスクリプト

に公開

ひらがなで入力された日本語をなんでも猫語に変換して出力するスクリプトです。
chmod +x catlang.pyで実行権を付け、./catlang.py ことばで実行してください。

#!/usr/bin/env python3
import sys
"""
kana_list に基づき、各列の母音を
  あ -> にゃ
  い -> に
  う -> にゅ
  え -> にぇ
  お -> にょ
に変換するスクリプト。
onbin に含まれる文字(例: 'ん','ー','っ')は無変換でそのまま残します。
最長一致でマッチするため、拗音(きゃ、ふぁ など)にも対応します。
"""

kana_list = [
    'あ','い','う','え','お',
    'か','き','く','け','こ',
    'が','ぎ','ぐ','げ','ご',
    'さ','し','す','せ','そ',
    'ざ','じ','ず','ぜ','ぞ',
    'た','ち','つ','て','と',
    'だ','ぢ','づ','で','ど',
    'な','に','ぬ','ね','の',
    'は','ひ','ふ','へ','ほ',
    'ば','び','ぶ','べ','ぼ',
    'ぱ','ぴ','ぷ','ぺ','ぽ',
    'ま','み','む','め','も',
    'や','ゐ','ゆ','ゑ','よ',
    'ら','り','る','れ','ろ',
    'わ','@','@','@','を',
    'ふぁ','ふぃ','ふぅ','ふぇ','ふぉ',
    'ゔぁ','ゔぃ','ゔ','ゔぇ','ゔぉ',
    'うぁ','うぃ','うぅ','うぇ','うぉ',
    'てぁ','てぃ','てぅ','てぇ','てぉ',
    'きゃ','きぃ','きゅ','きぇ','きょ',
    'しゃ','しぃ','しゅ','しぇ','しょ',
    'ちゃ','ちぃ','ちゅ','ちぇ','ちょ',
    'にゃ','にぃ','にゅ','にぇ','にょ',
    'ひゃ','ひぃ','ひゅ','ひぇ','ひょ',
    'みゃ','みぃ','みゅ','みぇ','みょ',
    'りゃ','りぃ','りゅ','りぇ','りょ',
    'ぎゃ','ぎぃ','ぎゅ','ぎぇ','ぎょ',
    'じゃ','じぃ','じゅ','じぇ','じょ',
    'ぢゃ','ぢぃ','ぢゅ','ぢぇ','ぢょ',
    'びゃ','びぃ','びゅ','びぇ','びょ',
    'ぴゃ','ぴぃ','ぴゅ','ぴぇ','ぴょ',
]

onbin = ['ん', 'ー', 'っ']  # 無変換でそのまま出力する文字

vowel_to_cat = ['にゃ', 'に', 'にゅ', 'にぇ', 'にょ']

mapping = {}
for i in range(0, len(kana_list), 5):
    row = kana_list[i:i+5]
    for j, syl in enumerate(row):
        if syl == '@' or syl == '' or syl is None:
            continue
        if j < len(vowel_to_cat):
            mapping[syl] = vowel_to_cat[j]

if mapping:
    max_key_len = max(len(k) for k in mapping.keys())
else:
    max_key_len = 0

def to_cat(text: str) -> str:
    i = 0
    out = []
    L = len(text)
    while i < L:
        c = text[i]
        if c in onbin:
            out.append(c)
            i += 1
            continue
        matched = False
        limit = min(max_key_len, L - i)
        for l in range(limit, 0, -1):
            piece = text[i:i+l]
            if piece in mapping:
                out.append(mapping[piece])
                i += l
                matched = True
                break
        if matched:
            continue
        out.append(c)
        i += 1
    return ''.join(out)

if __name__ == '__main__':
    s=sys.argv[1]
    t=to_cat(s)
    print(f"元:{s}")
    print(f"猫語:{t}")

実行例

% catlang.py こんにちは      
元:こんにちは
猫語:にょんにににゃ
% 

Discussion