ページ

2010年5月9日日曜日

コンフリクションインパクト

クラウドなアプリケーションに触れてみたいが為に、意味のない単語を生成するWEBアプリケーションの開発を始めた。
一応GAE上にUPはしてあるけど、アルファ版以前の酷い出来だし、あまりにしょうもなさすぎてまだとても公開出来るものになってない。適当にイイ感じのものになればいつか公開しますよ。GAE可愛いよGAE。

50音+小文字+濁音・半濁音の集合の中(全部カタカナ)からランダムに文字列を選び出して繋げるのが現状の基本アルゴリズム。
だけど、単語としてありえないパターンは除かないといけない。
たとえば、「ラョ」とか言う文字が生成されても、それは単語として意味を成さない。クトゥルー神話の魔物ならいざ知らず、発音不可能な単語は誰にとっても取り扱いに困る迷惑なものだ。だから取り除かねばならない。

また、生成されたものが「ドクトリン」なら全然ウェルカムだが、「ドクトトトリン」となるとこれはもう扱いに困る。これが「ドクトトリン」ならば、毒物の名前みたいでウェルカムなんだが。
と考えていくと、どうやら同じ文字が3回以上続く単語は取り除いても良さそうだという結論に至った。そういう単語がまったく思いつかないので、まあ無いに等しいんだろう。

あと、もちろん「ン」から始まったりするのも、「ンジャメナ」と「ンドゥール」ぐらいしか思いつかないので除去。同様の理由で小文字から始まるものも除去。
小文字が二連続で続くようなものも、小説の中でしか出てこないので除去。「───ッッ!」とかね。単語じゃねーし。「ァャャ」とかは全部小文字で単語になりうるかも知れないけど、ちょっと意味と用途としては限定されすぎてるので例外扱いにしたい。
また、「ャ」「ュ」「ョ」については、イ段の音としか連結しない。「ギョ」とか「リョ」とかはありえるけど、「クョ」や「フャ」や「ルュ」は発音不可能でありえない。「ホョ」は二次元のみに許される音だしな。あ、これは↑にも書いてたか。

と、上記のようなルールならパッと思いつくので、実装も難しくなかったんだが、今僕の頭を悩ませているのが、文字の出現確率の操作。

50音+小文字+濁音・半濁音の中からランダムに文字列を選ぶってことは、どの文字列も同じ確率で出るってことなんだが、それは単語として相応しくない振る舞いだ。
古典の暗号、特に転置式暗号について少しでも学んだことのある人ならわかると思うが、意味のある単語の構成要素の文字には、出現確率に偏りがある。たとえば、英単語で言うと、eとsとtあたりが他のアルファベットに比べて、非常に多く出現する。
日本語にもほぼ同様のことが言えるんだが、具体的にどの文字が一番出易いとか言う分析にまで至っていない。

難しい問題はさておいて、まず、単純に、小文字・濁音・半濁音についてはそこまで頻出されても困るから、こいつらの出現確率は低くしたい。「バパジゲポポ」なんて言葉はどうなの?って感じだろう?喉にカブトムシが詰まったときにしかこんな文字は出ない。

さて、特定の文字列の出現確率を低くしたい。どうやって?

たとえば「ク、ド、リ、ャ、フ、カ」と言う集合の中からランダムに文字を選び、単語を生成することを考える。
確率を操作するだけのアルゴリズムなので、

①生成される単語は、与えられた文字列の重複は許さない。簡単に言うと一度使った文字列はもう使わないってこと。

②出現確率の高い文字から選ばれる。

と言う前提をおこう。

この場合、リスト内には6文字があるわけだから、それぞれの文字の出現確率は等しく1/6だ。
「クカフャドリ」と言う、発音方法不明の謎の鳥が出る確率も、「フカクドリャ」と言う、味がしょっぱそうなドリヤの出来損ないが出る確率も等しいということになる。
でも僕が出したいのは「クドリャフカ」と言う可愛い単語だ。まず、前提②から、「ク」を一番高い確率で出したい。
その場合、与えられた集合をこう操作すればいい。
「ク、ク、ド、リ、ャ、フ、カ」
こうすると、クが出る確率は2/7になり、ほかの文字が出る確率は1/7になった。出現確率の高い文字から選ばれるから、先頭は「ク」になる。
これと同様に進めていくと、「クドリャフカ」を出すには、
「ク、ク、ク、ク、ク、ク、ド、ド、ド、ド、ド、リ、リ、リ、リ、ャ、ャ、ャ、フ、フ、カ」
と言う文字配列に対して操作を実行すればいい。

確率を操作する方法には、抽出対象の集合に対して、同一要素を増やすと言う方法がどうやら使えると判断。

まあ実際とてもスマートな方法とは言えず、泥臭く稚拙な手だとは思うけど、とにかくこうすることで濁音・半濁音については出現確率を下げることが出来た。実際の動作もうまく行っている。

問題は、その他の50音の集合の中で、特定の文字の確率を上下させることだが…何か良い方法ないかなあ。教えてエロイ言語学者!

0 件のコメント: