MeCabを使って日本語→グロンギ語 のコードを書いた話
どうも初めまして。庚午里藻です。
ネタとしてはガチガチの既出なんですが、まあ別にこっちはMeCabを使って遊んでみたかっただけなんだからねっ!!ということで、あんまり気にせずに日本語をグロンギ語に変換するコードを書いた話をつらつらとしようと思います。お前の話なんて聞きたくないんじゃ、という人は下のgithubのリンクにコードを置いてあるのでよければ試してみてください。
グロンギ語について
そもそもグロンギ語なるものが何かについて簡単に説明を。
平成仮面ライダーシリーズの記念すべき第1作目である仮面ライダークウガ。そのクウガが戦う敵がグロンギ、という戦闘種族です。このグロンギは超古代から蘇ったため、彼ら独自の言葉を劇中で話します。それがグロンギ語です。グロンギは殺人をゲームとして楽しむ残忍な種族なのですが、何を言っているのかわからない彼らの会話も、その不気味さを際立たせています。
そんなグロンギ語ですが、基本的には日本語の50音を規則に従って入れ替えただけのものです。固有名詞は入れ替えない(クウガ見たことある人なら「クウガ」とか「トーキョー」とかそのまま言ってたなあ、という記憶が残っているかも?)、助詞は特別な変換をする、などの例外はありますが。
偉そうなこと言ってますが上のページをめっちゃ参考にしてます。というかここにあることしかやってません。(もっというとここにある規則を全部入れてるわけでもないです)
MeCabについて
MeCabっていうのは、形態素解析ツールのことです。じゃあ形態素ってなんやねんという話ですが、形態素っていうのは有り体に言えば意味を担う最小の言語単位のことです。早い話がMeCabに文章をかければ、意味ごとにバラバラに分解してくれるということです。 実際に「すもももももももものうち」という鉄板文をMeCabに通してみると以下のようになります。 こんな感じで形態素ごとにバラバラにしてくれたり、品詞を示してくれたりしてくれるツールとなっています。
これを使えば50音の対応しかないグロンギ語への変換器とか作れそうだなーということで実際に作った過程をざっと紹介したいとおもいます。コードはCで書いているので、C言語を使える環境下なら問題なく実行できるはず。
MeCabをターミナルで使えるようにする
MeCabをまずはターミナル上で使えるようにします。と言ってもこれについて僕がやったことは
にある通りにコマンドを打っただけですが。
グロンギ語変換コード
というわけで本題です。ざっくりどういう流れで変換しているかを説明すると、
コマンドライン引数から文章を受け取る
↓
その文章をMeCabにかけ、解析結果をsentence.txtというテキストファイルに入れておく
↓
形態素ごとに改行されているのでfgetsを使って1行ずつ読み込み、グロンギ語と1文字ずつ対応させていく
↓
対応させた単語を連結して出力
みたいな感じです。MeCabを結果を入れてあるsentence.txtからは単語の読みと品詞を引っ張ってきています。品詞を引っ張ってきているのは、上にも書いた通り、品詞によってちょっとだけ特殊な処理がグロンギ語において発生するためです。ちなみに上のグロンギ語解読にあった"・"についての処理はそもそも打ち方がざっくばらんだ、みたいな記述があってじゃあ今回はいっか、ということで省いてあります。また、「クウガ」は固有名詞扱いではなかったのですが、クウガはそのままじゃなきゃいかんでしょということで特別扱いしてあります。 ということで実行結果は下のような感じになります。 実際には語順の入れ替えとかも起きるっぽいんですけど、とりあえずこんな感じで。セミファイナルゲームが「ゲリザギバスゲゲル」になっているので僕は満足です。
少し面倒くさかったこと
大したことではないんですが、MeCabの解析結果の要素数がたまに少ないことがあって(下の画像のセミファイナルゲームのところだけ要素の数が少ないです) fscanfで大丈夫でしょとタカをくくっていたらうまくいきませんでした。そのため、fgetsで一行読み込んでから、strtokでカンマとタブを区切り文字にして処理しています。
あとは、1文字ずつ対応させればいいでしょと思っていたら、ふぁ、ふぃ、ふぇ、ふぉがグロンギ語だとザ、ジ、ゼ、ゾになるので2文字ずつ読まなきゃダメじゃーんってなったことぐらいですかね。
手元で試して見たいと思った酔狂な人は、ページの頭の方に貼っておいたgithubのリンクに飛んでダウンロードして試してみてくれると嬉しいです。
では。