ランダムに生成した数字列を語呂合わせしたい
昨日、数字に語呂合わせ可能な文字列をSKKの辞書データから探すという実装を行ってみましたが、こういう方法でリストが出来上がったら実際にやってみたいのは、ランダムな数字列への語呂合わせですよね。
というわけで実際にやってみることにします。実装例は後半に記載しますが、まずは実際に動かしてみたものを。
動作例
実装例ではこんな感じになります。
4077 しれいななつななつ /指令;†上からの命令/司令;†軍隊などの指揮/死霊/使令;†命じて使役する//七つ/七ツ//七つ/七ツ/
8193 はいきゅうみっつ /配給/配球/排球/廃休//三つ/3つ/3つ/
1670 いちろなれ /一路//慣れ/熟れ;-鮨/馴/
3797 みなきゅうしち /皆/美奈/美菜/美那//久七/
5265 ごじるいつつ /呉汁/豆汁//五つ/5つ/5つ/
75489 ななつごよやく /七つ/七ツ//御予約/
左から順に、入力数字列、語呂合わせ読み、語呂合わせの漢字です。まあまあ使えそうな、使えなさそうな?
でも網羅的に試してみると、なかなか厳しい語呂合わせもあります。網羅的に試す場合はこんな感じで行えますので気になる方はお手元でお試しください。
seq -w 000 999 | mapping-number2goroawase.awk
seq -w 0000 9999 | ./mapping-number2goroawase.awk
実装例
5行目の infile の箇所で、あらかじめ作成しておいた語呂合わせリストを読み込んでいます。
あとは標準入力から渡された数字列の全桁を語呂合わせに置換し終わるまで処理を行います。
ただしこの記事を作成するにあたり 数字に語呂合わせ可能な文字列をSKKの辞書データから探す で生成するデータの形式を少し変えています。この記事はすでに更新していますが、古い記事の内容でリストを作成済みの場合は、この内容を試す場合にはリストを再作成してください。
また、この実装には少々問題がありまして、ある数字列に複数の語呂合わせが適用できたとしても、そのうちの1つしか適用していません。そういう意味ではせっかくのリストを使いきれていないのですが、あくまでこれは実装例ということでご容赦を。
mapping-number2goroawase.awk
#!/usr/bin/awk -f
BEGIN {
idx=0
infile = "cat goroawase_list.txt"
while ( infile | getline ) {
goroawase_num[idx]=$2
goroawase_yomi[idx]=$3
goroawase_kanji[idx]=$4
idx++
}
close(infile)
}
{
goroawase_buffer = $1
goroawase_output = $1
goroawase_output_kanji = $1
# 入力された数値の桁数だけループする
for ( looploop = 0 ; looploop < length($1) ; looploop++ ) {
# 語呂合わせリストを総当たりで当てて語呂合わせを試行する
for ( loop = 0 ; loop < length(goroawase_num) ; loop ++ ) {
if ( match(goroawase_output,goroawase_num[loop]) ) {
# 語呂合わせ済みの数字列はバッファから消す
gsub(goroawase_num[loop],"",goroawase_buffer)
# 出力文字列(初期値は数字列)から語呂合わせ部分を読みに置換する
gsub(goroawase_num[loop],goroawase_yomi[loop],goroawase_output)
# 出力文字列(初期値は数字列)から語呂合わせ部分を漢字に置換する
gsub(goroawase_num[loop],goroawase_kanji[loop],goroawase_output_kanji)
#print $1,goroawase_buffer,goroawase_output,goroawase_num[loop]
}
if ( length(goroawase_buffer) == 0 ) break;
}
if ( length(goroawase_buffer) == 0 ) break;
}
print $1, goroawase_output,goroawase_output_kanji
}