車のナンバーや家族の携帯番号など、とっさに思い出す必要がある場面があります。でも、なかなか覚えられないときは、語呂合わせで覚えると早いです。今回は、なでしこで、語呂合わせツールを作ってみましょう。

  • 語呂合わせツールを作ってみよう

    語呂合わせツールを作ってみよう

語呂合わせで覚えよう

最近、AIの発展にともなって、施設の駐車場などで自動車のナンバーを自動認識するものが増えてきました。便利なのですが厄介なのが精算です。自分の車のナンバー4桁を入力して、支払いをする場面があります。意外と覚えてなくて駐車場まで戻るなんてことがあります。また、スマートフォンの充電が切れてしまって、家族に電話しようとしたけど覚えてないなんて場面もあります。

このように、覚えてないと不便な番号ってあります。自動車のナンバーなら4桁、携帯電話であれば、3桁-4桁-4桁です。こうした番号を語呂合わせで覚えるツールを作ってみましょう。

どんな風にして語呂合わせを作る?

とは言え、どうやって語呂合わせを作ることができるでしょうか。語呂合わせは、2525なら「ニコニコ」、4649なら「よろしく」、1192なら「いい国」など、数字が表す音をうまく利用することで組合せを作ることができます。

それで、例えば「11」なら「いい」「獣医」と読み替えることができますし、「92」なら「国」「給仕」「クジ」と読み替えできます。そうした規則をデータベースにまとめておいて、それを、機械的に組み合わせることで、語呂合わせツールを作ることができます。

語呂合わせデータベースを作ろう

そのため、最初に作業するのは、語呂合わせのデータベースを作ることです。CSV形式で作ってみましょう。CSV形式というのは、表の列をカンマで区切り、行を改行で区切るというとても簡単なデータフォーマットのことです。

それで、次のようなデータベースを作ります。1列目が数字で、2列目が語呂合わせに使う言い換え語句です。

0,ぜろ/まる/お/れい
1,い/いち/ひぃ/わん
2,に/にん/ふ/ふう/つう/つ
3,さん/み/さ/ざ
4,よん/し/よ/じ
5,ご/いつ/ごん/こ/こう
6,ろく/ろ/む/ろう/ろっ
7,しち/なな/な/じち/ち
8,はち/は/ば/ぱ
9,きゅう/く/ここのつ/ここの/ここ/ぎゅう/ぐ
00,おお/大きぃ/お礼/丸々/まん丸
01,おい/丸い/追い
02,乙/大津/末/お兄
03,おっさん/お産
…

筆者が頑張って作ったデータベースを、こちらの貯蔵庫にアップロードしました。これを使って語呂合わせツールを作ってみましょう。

数字の組合せ

次に、数字の組合せについて考えてみましょう。例えば4桁の数字は、どのような組合せができるでしょうか。

例えば、「1234」の場合、「1」と「234」、「12」と「34」、「123」と「4」のように、いろいろな分け方ができます。さらに、「1」「2」「34」や「12」「3」「4」、「1」「23」「4」、そして「1」「2」「3」「4」のように、3つや4つに分けることもできます。

語呂合わせを作る際には、このような数字の区切り方をすべて試し、それぞれの数字に対応する読みを組み合わせを選択するのがポイントになります。ちなみに4桁の場合、数字と数字の間には3カ所の「切る・切らない」があるので、区切り方は2の3乗で8通りあります。

プログラムを作ろう

それでは、簡単にこの組合せを出力するプログラムを作ってみましょう。なでしこで書くと次のようになります。

# 数字の区切り方をすべて出力する
数字は「1234」
桁数 = 数字の文字数
切れ目数 = 桁数 - 1
パターン数 = 2 ^ 切れ目数
「パターン数: {パターン数}」を表示。

Nで0からパターン数 - 1まで繰り返す:
    結果 = 数字の1から1を文字抜き出
    Iで1から切れ目数まで繰り返す:
        # 下からI番目のビットが1なら、その位置で区切る
        ビット = ((N ÷ (2 ^ (I - 1)))の整数部分)を2で割余
        もし、(ビット = 1)ならば:
            結果 = 結果 & "/"
        結果 = 結果 & (数字の(I + 1)から1を文字抜き出す)
    「{N+1}個目: {結果}」を表示

このプログラムを実行すると、次のように表示されます。

  • 数字の区切り方を一覧表示するプログラムを実行したところ

    数字の区切り方を一覧表示するプログラムを実行したところ

このプログラムでは、まず、4桁の数字には、数字と数字の間に3つの「切れ目」がある点に注目します。4桁の数字の切れ目「/」は3つです。

1 / 2 / 3 / 4

そして、それぞれの切れ目について、「区切る」か「区切らない」かの2通りを選べるという点を考慮します。

その際、切れ目を見つけるのに、二進数の規則を考慮します。二進数では、000、001、010、011、100、101…と1と0が出てくるのですが、繰り返しごとに、1ならば「区切る」0ならば「区切らない」と決めて、それを数列に適用します。

区切りごとに語呂合わせデータベースを引く

あとは、組合せごとに語呂合わせデータベースを引いて、表示するだけです。実際に作成したプログラム全体を、こちらの貯蔵庫にアップしました。

プログラムを実行して、数字を入力し「作成」ボタンを押すと次のように、たくさんの語呂合わせが表示されます。

  • 語呂合わせツールを実行したところ

    語呂合わせツールを実行したところ

ポイント1 - CSVデータを使いやすい形式に変換

プログラムの一つ目のポイントは、語呂合わせデータベースを使いやすい形式に変換する点です。先ほど見たように、データベースは、CSV形式で改行で区切って「数列,読み替え1/読み替え2/読み替え3」のように並んでいます。これを辞書型データに変換しているのが次の部分です。例えば、1234を入れると、「貧富(12)差(3)よ(4)」とか「皮膚(12)作用(34)」とか「悲痛(12)ミシン(34)」など、面白い語呂合わせが見つかりました。

# 語呂合わせデータベース
DB_URL=「https://n3s.nadesi.com/image.php?f=813.txt」
# …省略…
# データベースを読んで「数字」→「語呂の配列」の辞書を作る
語呂辞書={}
データ=DB_URLをHTTP取得
行一覧=データの改行で区切る
行で行一覧を反復:
  もし、(行!="")ならば:
    項目=行の「,」で区切る
    語呂辞書[項目[0]]=項目[1]の「/」で区切る

これにより、辞書型変数「語呂辞書」のキーに数列、値に読み替えの配列が代入されます。また、『URLをHTTP取得』命令を使って、データベースのテキストを取得しているのですが、この命令を使うと、公開されているテキストデータをHTTP経由で取得できます。例えば、貯蔵庫にアップロードしたCSVファイルを読み込み、自分のプログラムで利用できます。

ポイント2 - 語呂合わせの作成

そして、肝心の語呂合わせ作成を行っているのが次の部分です。最初に、数列の区切り方を変数「案一覧」に作成し、それを使って、データベースの言い換えを総取得して、回答一覧に追加するという方式です。

#------------------------------
●(数列Nの)語呂合わせ作成とは:
  # 数列を文字列にして、1文字ずつに分ける(「090」のような先頭の0も保つ)
  数字=数列N&""
  数字一覧=数字を文字列分解

  # 数字のすべての区切り方を作る --- (※1)
  案一覧=[数字一覧[0]]
  Iで1から(数字一覧の配列要素数-1)まで繰り返す:
    次一覧=[]
    案で案一覧を反復:
      次一覧に(案&数字一覧[I])を配列追加
      次一覧に(案&"/"&数字一覧[I])を配列追加
    案一覧=次一覧

  # 全部分に語呂があれば、候補の組み合わせをすべて集める --- (※2)
  回答一覧=[]
  案で案一覧を反復:
    部分一覧=案の「/」で区切る
    使える=真
    # 1文字ずつばらばらの区切り方(例: 1/2/3/4)は使えないので除外する
    桁数=数字一覧の配列要素数
    部分数=部分一覧の配列要素数
    もし、(桁数>1)かつ(部分数=桁数)ならば:
      使える=偽
    部分で部分一覧を反復:
      もし、(語呂辞書の部分が辞書キー存在)でなければ:
        使える=偽
    もし、使えるならば:
      # 部分ごとに候補を掛け合わせて、すべての組み合わせを作る
      語呂一覧=[""]
      番号=0
      部分で部分一覧を反復:
        次一覧=[]
        語で語呂一覧を反復:
          もし、(番号>0)ならば:
            つなぎ="/"
          違えば:
            つなぎ=""
          候補で語呂辞書[部分]を反復:
            次一覧に(語&つなぎ&候補)を配列追加
        語呂一覧=次一覧
        番号=番号+1
      語で語呂一覧を反復:
        回答一覧に[案,語]を配列追加

プログラムの(※1)の部分では、数列のすべての区切り方を作成し、変数「案一覧」に代入します。先ほど紹介した二進数を使う方法とは少し異なりますが、この方法でも、1桁目から順に「続ける」か「区切る」かの2通りに枝分かれさせながら、すべてのパターンを生成できます。例えば「1234」であれば、「1」から始めて、「12」と「1/2」、さらに「123」「12/3」「1/23」「1/2/3」のように候補を増やします。

続いて、(※2)の部分では、上記(※1)で作った数字の区切り候補について、語呂辞書で実際に変換できるものだけを選び、さらに各部分の語呂候補を総当たりで組み合わせています。それぞれの部分が語呂辞書に登録されている場合だけ候補として採用し、さらに各部分に複数の語呂が登録されている場合は、それらを掛け合わせてすべての組み合わせを生成します。例えば「12」と「34」にそれぞれ2種類の語呂候補があれば、2×2で4種類の語呂合わせが作られます。

まとめ

以上、今回は語呂合わせツールを作ってみました。総当たりで組合せを作り、それを使って、データベースを引くことで、語呂合わせできそうなパターンを作りました。

今回のように、候補をすべて作ってから辞書で絞り込む方法は、仕組みが単純で分かりやすく、さまざまな応用ができます。辞書の内容を充実させたり、覚えやすさに応じてスコアを付けたりすれば、より自然で面白い語呂合わせを優先して表示することもできるでしょう。改良したり、別のツールに組み込んだりして、活用してみてください。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。