「メニューメーカー」プログラム解説
以前、公開したおバカAIプログラム第一弾「メニューメーカー」。
バージョンアップしましたので、今回は、メニューメーカーのソースコードを解説します。
そして、次回以降の回で、自然言語処理におけるメニューメーカーの意義について解説します。
メニューメーカーは、専用の文法で書かれたソースコードと、ソースコードを解析してメニューを生成する解析エンジンからなります。
ソースコードを書き換えることで、メニュー以外にもさまざまな文を生成できます。
今回解説するのは、ソースコードになります。
全ソースコードは、この記事に最後に載せていますので、そちらも参考にしてください。
メニューメーカーの文法で重要な記号は「::=」と「|」の二つです。
「::=」は左辺を右辺で定義するという意味です。定義される言葉は、「<>」で囲まれます。
「( | )」は、丸かっこの中の「|」で区切られた単語からランダムに一つを選択することを意味します。
たとえば、
< 野菜 > ::= ( 大根 | キャベツ | 白菜 | < きのこ > )
の場合、左辺の「< 野菜 >」は、右辺で定義され、「大根」、または「キャベツ」、または「白菜」、または「< きのこ >」となります。
ここで、< きのこ >が選ばれると、さらに< きのこ >の定義に移ります。
< きのこ > ::= ( しいたけ | 松茸 | えのき | マッシュルーム )
と定義されていれば、この中から選ばれます。
このようにして文が生成されるわけです。
それでは、メニューメーカーのソースコードに従ってメニュー生成のプログラムを読み解いてみましょう。
解析エンジンが最初に呼び出すのは、「< 最終料理 >」 です。
< 最終料理 > ::= ( < 最終料理1 > | < 最終料理2 > | < 最終料理3 > | < 最終料理4 > )
となってるとして、< 最終料理1 >が選ばれたとします。
< 最終料理1 > ::= < 中間料理 > [ を、 ] < 調理法修飾語 > < 単独調理法 > < 料理名 >
となっています。
ここで、[を、]は、そのまま「を、」が文字列として出力されることを意味します。
< 中間料理 >は、以下のように定義されます。
< 中間料理 > ::= ( < 食品修飾語 > < 食材 > |
( < 人物修飾語 > | * ) < 人物 > [ の ] < 人物食材動詞 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) |
< 特殊食材修飾語 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) | < 食材 > [ の煮つけ ] )
かなり複雑な構造をしていますので、これを詳しく読み解いていきましょう。
ここで、優先順位として、基本は、左から順に処理します。
ただし、丸かっこがある場合、丸かっこが最優先で、丸かっこが入れ子になっている場合、内側の丸かっこから処理します。
まず、全体が丸かっこで囲まれていて、以下の4つに、「|」で区切られていることがわかります。
① < 食品修飾語 > < 食材 >
② ( < 人物修飾語 > | * ) < 人物 > [ の ] < 人物食材動詞 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 )
③< 特殊食材修飾語 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 )
④ < 食材 > [ の煮つけ ]
ここで、 ②が選ばれたとします。
丸かっこが最優先なので、最初は、「 ( < 人物修飾語 > | * )」です。
ここで、「*」は、空白文字の意味です。つまり、「*」が選ばれると、何も表示されません。
「 < 人物修飾語 > 」と「 * 」のうち、「 < 人物修飾語 >」が選ばれたとします。
< 人物修飾語 > ::= ( 味覚音痴の | 風邪気味の | 足のつった | 入院中の | 要領の悪い | 寂しがり屋の | 独りぼっちの | 好き嫌いの多い | 寝顔の可愛い | 騙されやすい | お腹を壊した | 忘れられた | 変態の | やる気のない | 無期懲役の | 入院中の | 拒食症の )
と定義されていて、この中から、「入院中の」が得ればれたとします。これで最初の丸かっこの処理が終わります。
次の丸かっこは、 ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) です。
ここで、「Φ1」は、出現する確率を調整する場合に使います。
出現確率は、5段階に調整でき、Φ1が最も出現しにくく、出現確率が1/5となります。
ここでは、< 動物 >が選ばれたとすると、②の文は
「入院中の < 人物 > [ の ] < 人物食材動詞 > < 動物 > 」
となります。
この後は、 < 人物 >、 < 人物食材動詞 > 、 < 動物 >が順に決定されるわけです。
たとえば、 < 人物 >として、「おねえちゃん」、< 人物食材動詞 > として、「大切な」、< 動物 >として、「噛みつき亀」が選ばれたとすると、
< 中間料理 >は、
「入院中のおねえちゃんの大切な噛みつき亀」となります。
そして、元の< 最終料理1 >に当てはめると、
< 最終料理1 > ::= 「入院中のおねえちゃんの大切な噛みつき亀」 [ を、 ] < 調理法修飾語 > < 単独調理法 > < 料理名 >
となります。
さらに、順に決定して、 < 調理法修飾語 >が「思い付きで」、 < 単独調理法 > が「炒めた」、 < 料理名 > が「甘酢あんかけ」に選ばれたとすると、
< 最終料理1 > ::= 「入院中のおねえちゃんの大切な噛みつき亀を、思い付きで炒めた甘酢あんかけ」
となり、これが < 最終料理 > となって表示されるわけです。
これがメニューメーカーの仕組みです。
ソースコードを書き換えるだけで、メニュー以外にも、様々な文を生成できます。
もし、別の単語を追加してほしい、自分でもソースコードを書き換えて遊んでみたい、自分のサイトにメニューメーカーを載せたいなどご希望がありましたら、
お問い合わせからご連絡ください。
最後に、現時点のメニューメーカーの全ソースコードを以下に載せておきます。
これをみながら、メニューメーカーで遊ぶと、ソースコードの意味がより理解できると思います。
< 最終料理 > ::= ( < 最終料理1 > | < 最終料理2 > | < 最終料理3 > | < 最終料理4 > | < 罰ゲーム > Φ1 | < 挨拶付き最終料理 > )
< 最終料理1 > ::= < 中間料理 > [ を、 ] < 調理法修飾語 > < 単独調理法 > < 料理名 >
< 最終料理2 > ::= < 液体中間料理 > [ に、 ] < 中間料理 > [ を ] < 調理法修飾語 > ( 漬けた | 沈めた | 煮込んだ | 絡めた ) < 液体料理名 >
< 最終料理3 > ::= < 中間料理 > [ に、 ] < 液体中間料理 > [ を ] < 調理法修飾語 > ( かけた | 塗った | 絡めた ) < 料理名 >
< 最終料理4 > ::= < 中間料理 > [ と、 ] < 中間料理 > [ を、 ] < 調理法修飾語 > ( < 複合調理法 > | < 単独調理法 > ) < 料理名 >
< 挨拶付き最終料理 > ::= < 挨拶 > ( < 最終料理1 > | < 最終料理2 > | < 最終料理3 > | < 最終料理4 > | < 罰ゲーム > Φ1 ) [ でございます。 ]
< 単独調理法 > ::= ( 蒸した | 焼いた | 炒めた | 煮た | 焦がした | あぶった | 揚げた | 漬けた | 茹でた | 燻製した | 凍らせた | 炊いた )
< 複合調理法 > ::= ( 炒めた | 混ぜた | かきまぜた | 炊き合わせた | 練った | 練り合わせた | すり混ぜた | 和えた | 添えた | 練り合わせた | 刷り込んだ )
< 共通修飾語 > ::= ( 驚くほど | べらぼうに | 死ぬほど | とんでもなく | ちょっとだけ | ほんのちょっと | 少々 | さりげなく )
< 調理法修飾語 > ::= ( ぐちゃぐちゃに | きままに | たっぷり | 適当に | なんとなく | 気持ち | 雰囲気で | 思い付きで | なげやりに | たまたま | 不本意ながら | こっそりと | しかたなく | いやいや | やむを得ず | 逆に | 調子よく | 少々 | じっくり | 素早く | なめらかに | 派手に | 地味に | ゆっくり | 手早く | ぼそぼそに | あえて | 無心に | ふわっと | 念のため | ぼちぼち | ざっくり | 仕方なく | 今回だけ )
< 味 > ::= ( < 共通修飾語 > | * ) ( すっぱい | カレー味の | 塩辛い | ( ( オレンジ | 芳香剤 | 南フランス | 正露丸 | 湿布 ) [ の香りの ] ) | 蜂蜜風味の | しょっぱい | 甘い | 苦い | ほろ苦い | えぐい | 甘酸っぱい | 臭い | 死ぬほどまずい | おいしい )
< 中間料理 > ::= ( < 食品修飾語 > < 食材 > | ( < 人物修飾語 > | * ) < 人物 > [ の ] < 人物食材動詞 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) | < 特殊食材修飾語 > ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) | < 食材 > [ の煮つけ ] )
< 液体中間料理 > ::= ( スープ | < 野菜 > [ ソース ] | カレー | シチュー | ワイン | ヤクルト | ブランデー | ビール | < 野菜 > [ スープ ] | コーラ | お汁粉 | < 魚 > [ 汁 ] | 味噌汁 | < 野菜 > [ ジュース ] )
< 料理名 > ::= ( ハンバーグ | コロッケ | 餃子 | グラタン | ピザ | ハンバーガー | ゼリー | カレー | シチュー | コンディショナーΦ1 | 流しそうめん | 育毛剤Φ1 | マリネ | コンソメスープ | おにぎり | チャーハン | ピラフ | ハヤシライス | お寿司 | パン | お好み焼き | うどん | そば | そうめん | ラーメン | パスタ | ミートローフ | 餃子 | コロッケ | メンチカツ | 天ぷら | 唐揚げ | 南蛮漬 | 鍋 | すき焼き | シューマイ | 角煮 | 甘酢あんかけ | 玉子焼き | 佃煮 | オムレツ | オムライス | 茶碗蒸し | おでん | ピーナッツ和え | ( < 動物 > | < 魚 > | < 昆虫 > Φ2 ) [ の踊り食い ] )
< 液体料理名 > ::= ( スープ | 煮物 | うどん | ソバ | カレー | シチュー | ラーメン | そうめん | 流しそうめん | 育毛剤Φ1 | コンディショナーΦ1 | チーズフォンデュ )
< 食品修飾語 > ::= ( < 食品状態 > | < 味 > | < 加工法 > )
< 食品状態 > ::= ( 採れたての | 朝取れの | こねくり回した | 残念な | フレッシュな | 腐りかけの | かじりかけの | すりおろした | 焼き過ぎた | 燻製の | 自家製 | 完熟 | 特選国産 | 野性味溢れる | 盛り付けた | やばい | 小汚い | _
貧相な | みすぼらしい | けったいな | 忌々しい | 感じの悪い | えげつない | 究極の | 立派な | ジューシーな | 無味無臭の | 濃厚な | 美味くない | 人が食べれない | そこそこ美味しい | 猛毒の | しなびた | 捨てられた )
< 加工法 > ::= ( 蒸した | 焼いた | 炒めた | 煮た | 焦がした | 揚げた | すり下ろした | 刻んだ | よく練った | 温めた | 燻製した | 冷やした | 冷凍した | 塩ゆでした | 湯せんした | 湯通しした | 塩もみした | 焙煎した | 乾燥させた )
< 食材 > ::= ( < 産地 > [ 産の ] ( < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 ) | < 動物 > | < 動物状態 > < 動物 > | < 野菜 > | < 魚 > | < 昆虫 > Φ1 )
< 産地 > ::= ( ブルターニュ | ボリビア | 利尻 | 沖縄 | ノルウェー | 千葉 | フランス | 高知県 | 群馬県 | イタリア | フランス | インド | ウクライナ | オランダ | オーストラリア | カナダ | アメリカ | 中国 | スペイン | スイス | タイ | タイワン | 韓国 | 神戸 | 松山 | 北海道 | 青森 | 秋田 | 岩手 | 山形 | 宮城 | 福島 | 九州 | 大分 | 熊本 | 鹿児島 | 宮崎 | 京都 )
< 動物状態 > ::= ( 気性の荒い | 恥ずかしがり屋な | お茶目な | こざかしい | 痛風の | 欲張りな | 強欲な | 意地悪な | 親切な | 大人しい | のびのび育った | 疲れた | いじけた | 甘やかされた | 劣等感あふれる | みすぼらしい | やさしい | 生まれたての | 疲れ果てた | ピチピチの | やるせない | 風邪気味の | 拒食症の )
< 動物 > ::= ( 牛 | 豚 | 羊 | 鶏 | アルマジロ | イグアナ | コウモリ | ウミガメ | 噛みつき亀 | スッポン | カメレオン | トカゲ | ヘビ | ヤモリ | ワニ | カエル | アフリカ象 | イタチ | イノシシ | インド象 | ウサギ | 馬 | オオアリクイ | オオカミ | カバ | カンガルー | キツネ | 熊 | サイ | 鹿 | タヌキ | トラ | ネズミ | 羊 | ヒョウ | マントヒヒ | もぐら | ヤギ | ラクダ | アヒル | インコ | ウグイス | カッコウ | 鴨 | カモメ | カラス | キジ | スズメ | ダチョウ | ツバメ | 鳩 | アザラシ | クジラ )
< 野菜状態 > ::= ( シャキシャキの | バキバキの | ねちょねちょな | ぐちゃぐちゃの | さらさらの | べたべたの | ぬるぬるの | ぴちぴちの | 生温かい )
< 野菜 > ::= ( 大根 | 人参 | 玉ねぎ | ジャガイモ | カボチャ | ほうれん草 | パンプキン | ブロッコリー | トマト | 松茸 | パセリ | 季節の温野菜 | 木の実 | 茗荷 | トリュフ | 白舞茸 | 海草 | ラズベリー | きのこ | 旬の彩り野菜 | ストロベリー | セロリ | りんご | 柿 | アスパラガス | インゲン | えのき | カイワレ | カブ | カリフラワー | キャベツ | キュウリ | グリンピース | ゴーヤ | ゴボウ | コンニャク | さつま芋 | 里芋 | さやえんどう | しいたけ | シメジ | 春菊 | 生姜 | スイカ | ネギ | 白菜 | ズッキーニ | そら豆 | タケノコ | つくし | 茄子 | ナメコ | ニンニク | ピーマン | フキ | プチトマト | マッシュルーム | メロン | もやし | 山芋 | ラッキョウ | レタス | 蓮根 | 小豆 | ワラビ | 大豆 | トウモロコシ | ピーナッツ | アケビ | アボカド | あんず | イチジク | 伊予柑 | 梅 | オレンジ | キウイ | 巨峰 | 金柑 | グアバ | 栗 | グレープフルーツ | さくらんぼ | ザクロ | 梨 | 夏みかん | パイナップル | バナナ | パパイア | ビワ | ぶどう | ブルーベリー | プルーン | マスカット | マンゴー | みかん | 桃 | 柚子 | 洋梨 | ライチ | ライム | レモン | まな板Φ1 | 接着剤Φ1 )
< 昆虫 > ::= ( バッタ | カマキリ | ミミズ | アブラゼミ | カメムシ | ナメクジ | アゲハ蝶 | アブラムシ | アリ | 蚊 | 蛾 | カタツムリ | カブトムシ | カミキリムシ | キリギリス | クモ | クワガタ | コオロギ | 黄金虫 | ゴキブリ | セミ | ダンゴムシ | てんとう虫 | トンボ | ハエ | ホタル | ミツバチ | 虫 | モンシロチョウ )
< 魚 > ::= ( サンマ | スズキ | マグロ | マンボウ | エイ | タイ | アンコウ | メダカ | グッピー | サメ | クジラ | フグ | ジンベエサメ | 鯉 | 金魚 | ピラニア | サーモン | 貝柱 | 帆立 | 生雲丹 | 手長海老 | キャビア | スズキ | かさぶた | フォアグラ | 海老 | アサリ | アジ | アワビ | イカ | 伊勢海老 | イソギンチャク | イワシ | 鰻 | ウニ | 海老 | 貝 | 牡蠣 | カツオ | カニ | カレイ | クラゲ | 魚 | 鮭 | サザエ | サバ | シジミ | タコ | タツノオトシゴ | タラ | 熱帯魚 | 海苔 | はまぐり | ヒトデ | ヒラメ | ブリ | ヤドカリ | ワカメ | 鮎 | ドジョウ | ナマズ | ニジマス | フナ | アザラシ | アシカ | イルカ | オットセイ | シャチ | セイウチ | トド | ラッコ )
< 挨拶 > ::= ( まことに残念でございますが、 | 恐縮ですが、 | おめでとうございます。 | 安心してください。 )
< 技 > ::= ( 膝蹴り | かかと落とし | 永久脱毛 | 脂肪吸引 | ピッキング | 泣き落とし | ずる休み | 横領 | 隠し撮り | 食い逃げ | 免許取り消し | 瓦割り | 頭突き | 車上荒らし | 突き指 | ビンタ | タイキック )
< 人物 > ::= ( お母さん | お父さん | おねえちゃん | シェフ | 奥様 | マダム | ご主人 | 校長先生 | 鈴木課長 | カルロス | マントヒヒ )
< 人物修飾語 > ::= ( 悪態をつく | 手癖の悪い | 諦めの悪い | 味覚音痴の | 八方美人の | 二日酔いの | 風邪気味の | 足のつった | 入院中の | 下駄を履いた | 忘れ物の多い | 残念な | お行儀の悪い | ピント外れの | 要領の悪い | 出来の悪い | 寂しがり屋の | 独りぼっちの | 往生際の悪い | 好き嫌いの多い | クビになった | 愚痴ばかり言う | ミスの多い | 惚れっぽい | 誘惑に弱い | 根暗な | サイコパスな | 約束の守れない | 浮気ばかりする | 憎めない | 負け続けた | 寝顔の可愛い | 意地の悪い | 騙されやすい | 腹黒い | 天涯孤独な | しょうもない | お腹を壊した | 振られた | 忘れられた | 乗り気でない | 変態の | やる気のない | 無期懲役の | お腹を下した | 泣きついてきた | やせ過ぎの | 風邪気味の | 入院中の | 拒食症の | 節操のない )
< 人物食材動詞 > ::= ( お気に入りの | 好きな | 嫌いな | 育てた | 拾った | 見つけた | 食べかけの | 落とした | 大切な | 秘密の )
< 罰ゲーム > ::= ( ( < 人物修飾語 > | * ) < 人物 > [ の ] < 技 > )
< 特殊食材修飾語 > ::= ( < 人物 > [ にいただいた ] | 香典返しでもらった | 返品された | 貰い物の )