オリジナルかっこいいカタカナ生成についての試論
カタカナをカッコよく並べてオリジナルの名前をつけたい!
カタカナをカッコよく並べてオリジナルの名前、つけたいものですよね。
しかし、カタカナを無作為に並べても、カッコいい名前が偶然できることはあまりありません。
この記事では、強そうな文字列を生み出す方法について試したことをまとめます。
カワイイ文字列や気持ち悪い文字列を作るのにも、同様の考え方は通用すると考えます。
以下の四つの方法を紹介します。
・がんばる
・既存の単語を操作する
・機械に作らせる
・より効率よく機械に作らせる
本論に入る前に、取り組む問題について少し考えてみましょう。一体、誰もが「カッコいい」「強そう」と思うような文字列というのがあるものなのでしょうか。言葉に対する感性は人によって異なるに決まっています。ある人にとってはカッコいいと思えても、別の人にとってはカッコ悪いと思われるようなことも、ありそうです。
それでは「ゴジラ」と「コシラ」の、どちらが「強そう」でしょうか。
また「ゴルゴ」と「コルコ」、「ドラゴン」と「トラコン」ではいかがでしょうか。
多くの人にとって前者の方が「強そう」に見えると思います。
どうやら「濁音が多いと強そう」なようです。
このことに関して、「それはゴジラとかゴルゴとかドラゴンが強いことを知っているから、そのように思えるのだ」という反論はありえます。
しかし「ドラザゴドロゾドン」と「トラサコトロソトン」を比較すると、やはり前者の方が強そうではありませんか。これは適当に作った文字列で、意味はありません。
もちろん、「濁音が多くて強いものの例を多く知っているから、濁音が多いと強いように感じる。そのような例を知らなければ、感じないかもしれない」と主張することはできます。その通りかもしれませんが、濁音が多くて強いものの例を多く知っている人に訴えかける分には有効だということは認めざるを得ないはずです。
そして、それで十分です。何も英語話者にもドイツ語話者にもタイ語話者にも「カッコいい」「強そう」と思われるような音の列を作ろうというわけではありません。日本語を使い、ゴジラとかゴルゴとかドラゴンとかを「強そう」と思う人に効くならば、それで結構というものでしょう。
ということで少なくとも、「少なくない人々にとってカッコいい、強そうと思える文字列」はありそうです。
では、強そうな文字列を作っていきましょう。
一 がんばる
強そうな文字列を作るため、努力して強そうな文字列を作れるようになろうという方向性があります。ある意味において王道に見えます。
がんばると言ったところで、何をがんばるんだというのは明確ではありませんね。
目を引く文字列を分析し、その文字列のどこが目を引くのかというのを理解していく、というのが一つの方針です。
例えばストラディバリウス、ヘルツェゴヴィナ、レーヴェンハイムなどのカタカナを少し弄ってみて、印象が変わるか観察してみるのです。
スラトバディリウス、ストラティパリウス、ストラディバリオン、ウトライバイウス、ズドラディヴァリウズ……などのように変えてみて、元のものより悪くなったなあ、と思うことがあれば、その時変えた部分が「効いて」いたということになります。
何が「効く」かというのは往々にして、言葉では定式化しづらいものです。少しづつ身につけると良いでしょう。
慣れてくると逆に、普通の文字列を弄って目を引く文字列にするということもできます。
「トコロテン」とか「カマボコ」からトクロンテ、ドゴロデニオン、ガマボーグ、カンパキウスなどを作れます。
二 既存の単語を操作する
正直、頑張りたくないと考える人も多いと思います。カタカナの文字列ぐらいラクに、機械的に作れないのか、努力するならもっと他の技術を磨きたい、というのは悪い考えではありません。
そこで、「ヴォルディディオン・エングドリズア」という技を使うことができます。
聞いたことがないという方も多いことでしょう。造語です。
原則としては、まず英単語を選び、それからローマ字読みし、濁点が付くものには濁点をつけ、「バ」や「ブァ」などがあれば「ヴァ」などで置き換える、という技です。
やってみましょう。
・英単語を選ぶ fortition
・ローマ字読みする フォルティティオン
・濁点をつける ブォルディディオン
・ヴァ行で置き換える ヴォルディディオン
簡単ですね。他の単語も試してみましょう。
・英単語を選ぶ English
・ローマ字読みする エングリシュ
・濁点をつける エングリジュ
うーん? 微妙ですね。すでに濁点がついているものやラ行(ナ行なども)は濁点をつけようがありません。「ジュ」というのも「ド」「ガ」などに比べて威力が弱いように感じます。
そこで、修正を加えます。綴りで r や l は dr か rd に変えてもよい。同じく n は nd に変えてもよい。さらに sh はジャ行ではなくザ行にする、というところです。
「エングルディズ」「エングドリズ」などができます。先ほどよりはましでしょうか。
これでも、例えば memory などの単語はうまく運びません。ここでさらに規則を付け加えることもできます。しかしそうしていくと「簡単」とは言えません。選択肢が増えれば、結局感性を磨く努力が必要になる気もします。
何もあらゆる英単語からいい感じの文字列を作れるようになる必要はなく、一定の割合が確保できればいいかな、と思っておきましょう。
お気づきの通り、ヴォルディディオン・エングドリズアという技名は上の二つの組み合わせです。最後の「ア」はなんとなく付けました。
ちなみに fortition という単語を初めて見たという人も多いと思いますが、子音強化と訳される言語学用語です。
むろん、英語以外の言語でもこの技を使うことができます。
三 機械に作らせる
カッコいい文字列というものは、既にたくさん存在します。
最近流行っている、人工知能ってやつでなんとかならないの!? 学習して無限に生み出してよ! と思うところです。
もちろん、できます。
でも人工知能って素人には難しそうですよね。
実は、この程度の仕事であれば人工知能を持ち出すまでもありません。
人工無脳で十分です。
人工無脳というのは、しゅうまい君みたいなやつです。
マルコフ・チェインという簡単な原理でできています。
ここでは、形態素解析などの自然言語処理技術を使う必要がないので、より簡単です。
マルコフ・チェインというのは、一文字一文字くっつけて文字列を作るわけですが、その時、例えばデータ中で「グ」の後に「ド」がくる例がたくさんあり、「ト」がくる例が少なければ、「グ」の文字の後には「ト」よりも「ド」をくっつける確率が高まる、というような仕組みです。
下に Python というプログラミング言語(一説によればたまたま偶然不幸にも計算能力を持ってしまっただけの非プログラミング言語)のコードを挙げますが、ぜんぜん怖くないのでブラウザバックしないでください。コピペ用です。行頭の (2) などはスペース 2×4=8 つなどで置き換えてください。
import random
def generate_word(num_word=5):
(1)letterlist = [
]
(1)markov = {}
(1)l1 = ""
(1)l2 = ""
(1)for letter in letterlist:
(2)if l1 and l2:
(3)if (l1, l2) not in markov:
(4)markov[(l1, l2)] = []
(3)markov[(l1, l2)].append(letter)
(2)l1, l2 = l2, letter
(1)count_kuten = 0
(1)num_word= num_word
(1)word = ""
(1)l1, l2 = random.choice(list(markov.keys()))
(1)while count_kuten < num_word:
(2)tmp = random.choice(markov[(l1, l2)])
(2)word += tmp
(2)if(tmp=='。'):
(3)count_kuten += 1
(3)word += '\n'
(2)l1, l2 = l2, tmp
(1)print(word)
generate_word()
行頭に空白を空けるのは見栄えのためとかではなくて、かなり重要な意味を持つので勝手に変えないでください。
使い方を説明します。
三行目、空白行を入れて五行目にある letterlist = [ のあとに、例えば「'フ', 'シ', 'ギ', 'ダ', 'ネ', '。', 'フ', 'シ', 'ギ', 'ソ', 'ウ', '。', 'フ', 'シ', 'ギ', 'バ', 'ナ', '。',……」といった文字列を入力します。「……」は実際に入力する文字列ではありません。
エッ!? その引用符とコンマをいちいち入れないといけないの!? というと、これは Python で list という関数を使えば「フシギダネ。フシギソウ。フシギバナ。」という文字列から「'フ', 'シ', 'ギ', 'ダ', 'ネ', '。', 'フ', 'シ', 'ギ', 'ソ', 'ウ', '。', 'フ', 'シ', 'ギ', 'バ', 'ナ', '。'」を作ってくれるので利用しましょう。詳細は検索してください。
できたら、実行です。
動作環境がなくても、ブラウザで実行できるサイトがあります。検索してください。
やりましたね。これで、自動的にカタカナ文字列を大量に生成してくれるというワケです。
いいえ、そうは問屋が卸しません。
ポケモンの名前を八百超入れてみるとわかるのですが、七割ぐらいが見覚えのある文字列となります。
データが八百あってやっとその程度というのは、ちょっと辛い話です。もちろん、少ない労力でいくらかの文字列を得ることはできます。
しかし、もう少し打率が上がらないものでしょうか。
データ中の文字列に含まれるような成果物は自動的に弾くようにする、カナ文字ではなくローマ字でやる、などのアプローチが考えられます。
以下では、どちらでもない方法をとります。
四 より効率よく機械に作らせる
ここで取る方法は、「子音だけ抜き出して文字列を作り、母音をランダムに選んで挟む」というものです。
母音をランダムに選ぶというのは不安要素がありますが、一人で考えていては思いつかないような響きの文字列が出てきうるという嬉しさもあります。
まず、子音だけ抜き出します。ここは、検索置換で行います。
気の利いたワープロソフトなら「正規表現」という機能が備わっているので、使ってみましょう。
「[ァィゥェォャュョ]」を検索し、「」で置換します。全部消えます。
それから「ン」で検索し、「-x-」で置換します。また「ッ」で検索し、「-l-」で置換します。
「[アイウエオ]」で検索し、「-q-」で置換します。
「[カキクケコ]」で検索し、「-k-」で置換します。
残りの検索置換には難しいことはありません。
そして「x--」「l--」「-。」を「x」「l」「', '。', 」で置換します。その後「--」を「', '」で、「-」を「'」で置換します。順番に気をつけてください。
できた文字列を letterlist = [ の後に置きます。そして、下の方の word += tmp の行の下に word += random.choice('aeiou') を、インデント二つ(スペース八つ)で置きます。 上下の行と同じ高さに揃えるということです。
さらに print(word) の代わりに print(word.replace('qa', 'ア').replace('qi', 'イ')…….replace('l', 'ッ').replace('va', 'ヴァ').replace('vi', 'ヴィ').replace('vu', 'ヴ').replace('ve', 'ヴェ').replace('vo', 'ヴォ').replace('a', '').replace('i', '').replace('u', '').replace('e', '').replace('o', '')) を置きます。この「……
」は長い長い置換を省略したものです。そのままコピペしないでください。
これを走らせると、元になるデータの雰囲気を保ちながらも見慣れない文字列を大量に作ることができます。
以上、四つの方法を紹介しました。これらを使って、またここで挙げたような考え方を応用して、あるいは全く新しいアプローチで、ぜひ色々やってみてください。
お読みいただきありがとうございました。
上のコードもうちょっと良くできると思うのでそのうち改良してどこかに置きます(2021.1.24)