[華和梨を使い倒す?・トップ] [概要] [目次] [掲示板] [リンク] [更新情報]

前(2.基本機能を使いこなす)へ


3.基本をさらに使いこなす

ナイン …いっぺんに書くと長くなるから、分けたらしいよ。
ぐにゅう ここでは基本から一歩踏み出した機能を解説するらしいぞ。

本章では、2章に引き続き、再帰定義(一度呼び出したランダム単語を繰り返し使う)と単語分類のツリー化、そしてローカルエントリについて説明します。

3−1.履歴参照 〜一度呼び出したランダム単語を繰り返し使う〜

次の例を見てください。

# うわさ話1
sentence : \0${人名}って、すごい美形だよね。\n\1そうかぁ?俺は${人名}の顔は、かっこいいとは思えないけどな。\e

# 今回の辞書例
人名 : 郷ひろみ , 坂東英二 , 毒蝮三太夫

この例では2箇所でエントリ人名を呼び出していますが、どちらもランダムに単語を選び出すため、サンプルちゃん(\0)とテストくん(\1)は必ずしも同じ人名をしゃべりません。一度呼び出した単語をさらにもう一度使うことができれば、こうした問題をさけることができます。そのためには、次のようにします。

# うわさ話2
sentence : \0${人名}って、すごい美形だよね。\n\1そうかぁ?俺は${0}の顔は、かっこいいとは思えないけどな。\e

${0}、${1}、${2}……は、文中に1番目、2番目、3番目……に登場したエントリをもう一度呼び出す特殊エントリです(再帰定義)。上の例(うわさ話2)では、最初に登場したエントリ${人名}の単語を、${0}という特殊エントリでもういちど呼び出しています。こうすると、${人名}に置き換えられた名前がそのまま${0}でも使用され、華和梨とぐにゅうは同じ人名をしゃべることができます。

なお、エントリ登場回数をカウントするときには、履歴エントリ(${0}、${1}……)はカウントしません。例を挙げます。

# うわさ話3
sentence : \0${人名}って、${地名}に住んでるんだって。\n\1${0}なら、この間、${地名}で見かけたぞ?\n\0えぇ!ほんとに?…${1}から引っ越したのかなあ。\n\1${2}は、${1}より物件が安いからな。\e

# 今回の辞書例
人名 : 郷ひろみ , 坂東英二 , 毒蝮三太夫
地名 : 東京 , ワシントン , 銀座 , ボードウォーク

上の例では、

最初の${人名}=1番目に登場したエントリ
最初の${地名}=2番目に登場したエントリ
${0}=順番をカウントしない
2回目の${地名}=3番目に登場したエントリ
${1}=順番をカウントしない
${2}=順番をカウントしない

となり、${0}=最初の${人名}、${1}=最初の${地名}、${2}=2回目の${地名}として呼び出しが可能です。

単語中でエントリを使う場合も同じことができます。

# 辞書例
必殺技 : ${人名}の得意技「${0}バスター」

なお、単語中で使用されているエントリを、その単語を呼び出した単語やsentenceからは再帰定義で呼び出すことはできません。

3−2.エントリのツリー化

前章で、新しいエントリの追加方法を紹介しました。そのときの辞書例で新しく作成したエントリは、「嫌いな動物」でした。

「嫌いな動物」は、動物名の名詞が入ります。せっかくいろいろ動物名を登録するのですから、「嫌いな動物」の中身を、「動物」からでも呼び出したいと考えることも多いでしょう。

このように、あるエントリの中身を他のエントリからも呼び出すには、単語中でエントリを使用するシステムを応用して次のようにします。

# 嫌いな生き物
嫌いな動物 : ゴキブリ , カエル , ヘビ

# 動物の中に嫌いな動物を含むようにする
動物 : ${嫌いな動物}

この手法は、ツリー下位のエントリの中身が、ツリー上位のエントリの中身の、完全部分集合であるか、あるいは等集合である場合に非常に有効です。(後に登場するAND検索手法よりも。)

完全部分集合というのは、たとえばこういう事です。

等集合というのは、こういう事です。(華和梨のエントリの動作としては、ある種「エイリアス」「別名定義」と考えてもいいかもしれませんね。)

第2章でサンプル辞書に登録されている単語のツリー構造を紹介しましたが、付属ファイル中の"dict-base.txt"の中ですべてのツリー構造がこの方法で記述されています。

<「何か。」本体>
   └─<ghost>
        └─<Sample and Test>
              ├─<ghost>
              │    └─<master>
              │         ├─ dict-base.txt
              │         └ .....
              ├─<shell>
              │    └─<master>
              │         └ .....
              └ .....

ここにその部分を抜粋してみました。

(前略)

#########################################################################
# 名詞のツリー構築
#########################################################################

名詞 : ${物}
物 : ${人名}

物 : ${出版物}
出版物 : ${雑誌}
出版物 : ${本}

物 : ${食べ物}
物 : ${飲み物}
食べ物 : ${薬}
飲み物 : ${薬}

物 : ${乗り物}
物 : ${道具}
物 : ${動物}

名詞 : ${地名}
名詞 : ${組織}

名詞 : ${時刻}

時刻 : ${過去}
時刻 : ${現在}
時刻 : ${未来}
時刻 : ${時点}
時刻 : ${曜日}
過去 : ${曜日}
未来 : ${曜日}
曜日 : ${曜}曜日
曜 : 日 , 月 , 火 , 水 , 木 , 金 , 土

名詞 : ${必殺技}
名詞 : ${職業}
名詞 : ${長い名詞}
名詞 : ${嫌いな呼び名}


#########################################################################
# 修飾句のツリー構築
#########################################################################

修飾 : ${形容詞}い
修飾 : ${形容動詞}な

(後略)

また、この方法を利用して、dict-base.txtの末尾では、次のように「compatible.〜」エントリを定義しています。

(前略)

# 名詞-人
compatible.ms : ${人名}

# 名詞-無機物
compatible.mz : ${道具} , ${乗り物}

# 名詞-社名
compatible.mc : ${組織}

# 名詞-店名
compatible.mh : ${組織}

# 名詞-技
compatible.mt : ${必殺技}

# 名詞-食物
compatible.me : ${食べ物} , ${飲み物}

# 名詞-地名みたいなもの
compatible.mp : ${地名}

# 名詞-非限定
compatible.m : ${compatible.ms} , ${compatible.mz} , ${compatible.mc}
compatible.m : ${compatible.mh} , ${compatible.mt} , ${compatible.me}
compatible.m : ${compatible.mp}

# 「〜に〜する〜」的な、品詞が複数連結された長めの名詞
compatible.dms : ${長めの名詞}
compatible.d : ${compatible.dms}

#########################################################################

(ゴースト作成の際、"dict-base.txt"を付属のものから大きく改変すると、複数の製作者が作成した辞書・ネタをユーザーが同時に利用することが難しくなります。改変するときはどこをどのように改変するかをよく考えて行ってください)。

(といっても、華和梨が登場して以来伝統的に使用してきた(〜2002/3/11)ツリーと変わったので、面食らう人も多いかもしれません。そんな人のために、旧ツリーとの違いを紹介します。

3−3.エントリのツリー化方式の限界

便利な単語ツリー化の手法ですが、完全部分集合ではない、複雑に重なりあう集合をとりあつかう場合、問題が出てきます。

例をあげましょう。「人名」というエントリがあったとしますね。

人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

# ランダムトーク文
sentence : \0${人名}って、いいやつだよね。\e

これを、男性と女性に分ける場合を考えます。さきほど説明した単語構造のツリー化にしたがえば、

#人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
#人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

人名 : ${人名.男} , ${人名.女}

人名.男 : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , アンパンマン , バイキンマン , 食パンマン , カレーパンマン

人名.女 : しずか , バタ子 , ドラミ

# ランダムトーク文
sentence : \0${人名}って、いいやつだよね。\e
sentence : \0${人名.男}って、男の人だよね。\e
sentence : \0${人名.女}って、女の人だよね。\e

このように書き直すことになります。

では、さらにジャンル分類として「ドラえもん」や「アンパンマン」を追加したくなったらどうしたらいいでしょう?

#人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
#人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

人名 : ${人名.男} , ${人名.女} , ${人名.ドラえもん} , ${人名.アンパンマン}

#人名.男 : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , アンパンマン , バイキンマン , 食パンマン , カレーパンマン
人名.男 : ${人名.男.ドラえもん} , ${人名.女.アンパンマン}

人名.男.ドラえもん : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん
人名.男.アンパンマン : アンパンマン , バイキンマン , 食パンマン , カレーパンマン

#人名.女 : しずか , バタ子 , ドラミ
人名.女 : ${人名.女.ドラえもん} , ${人名.女.アンパンマン}

人名.女.ドラえもん : しずか , ドラミ
人名.女.アンパンマン : バタ子

人名.ドラえもん : ${人名.男.ドラえもん} , ${人名.女.ドラえもん}
人名.アンパンマン : ${人名.男.アンパンマン} , ${人名.女.アンパンマン}


# ランダムトーク文
sentence : \0${人名}って、いいやつだよね。\e
sentence : \0${人名.男}って、男の人だよね。\e
sentence : \0${人名.女}って、女の人だよね。\e
sentence : \0${人名.ドラえもん}って、ドラえもんのキャラだよね。\e
sentence : \0${人名.アンパンマン}って、アンパンマンのキャラだよね。\e
sentence : \0${人名.男.ドラえもん}って、ドラえもんに出てくる男のキャラだよね。\e
sentence : \0${人名.女.ドラえもん}って、ドラえもんに出てくる女のキャラだよね。\e
sentence : \0${人名.男.アンパンマン}って、アンパンマンに出てくる男のキャラだよね。\e
sentence : \0${人名.女.アンパンマン}って、アンパンマンに出てくる女のキャラだよね。\e

たとえばこんな風に書き直さなければならなくなってしまいます。爆発的に書く量が増えてしまいましたね。こんな、単語数が少ない例の場合ですら書き直し量が多いのに、もっと単語が多い場合や、もっと複雑にからみあった意味分類をしたい場合には到底対応できないことがわかると思います。

3−4.単語のAND検索

Phase 0.42における「ツリー化」手法の限界を突破するために、Phase 0.5には新しい単語呼び出しの方法が用意されました。単語のAND検索です。エントリを使用するときに「${エントリ名1&エントリ名2}」と記述することで、「エントリ名1」と「エントリ名2」の両方に登録されている単語を呼び出すことができるのです。具体的にどういうことなのか、どうご利益があるのかを、実際に例で見てみましょう。

前節の2番目の例を書き直すと、次のようになります。

人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

男 : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , アンパンマン , バイキンマン , 食パンマン , カレーパンマン

女 : しずか , バタ子 , ドラミ

# ランダムトーク文
sentence : \0${人名&男}って、男の人だよね。\e
sentence : \0${人名&女}って、女の人だよね。\e

ツリー化手法との違いがわかるでしょうか。

前節では「人名.男」「人名.女)」のエントリをそれぞれ定義し、「人名」が親エントリになるようにツリー化していましたが、この場合では「人名」と「男」と「女」という3つのエントリだけを定義し、ツリー関係を作らずに直接AND検索で「人名」かつ「男」(「人名&男」)、「人名」かつ「女」(「人名&女」)を呼び出しています。

当然のことですが、ランダムトーク文を

# ランダムトーク文
sentence : \0${男&人名}って、男の人だよね。\e
sentence : \0${女&人名}って、女の人だよね。\e

のようにしても同じことです。このような表現の自由度の高さも、AND検索方式のメリットのひとつです。

それでは、前節で問題となった、ジャンル分類の追加をしてみましょう。

人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

男 : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , アンパンマン , バイキンマン , 食パンマン , カレーパンマン

女 : しずか , バタ子 , ドラミ

ドラえもん : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , しずか , ドラミ

アンパンマン : アンパンマン , バイキンマン , 食パンマン , カレーパンマン , バタ子

# ランダムトーク文
sentence : \0${人名&男}って、男の人だよね。\e
sentence : \0${人名&女}って、女の人だよね。\e
sentence : \0${人名&ドラえもん}って、ドラえもんのキャラだよね。\e
sentence : \0${人名&アンパンマン}って、アンパンマンのキャラだよね。\e
sentence : \0${人名&男&ドラえもん}って、ドラえもんに出てくる男のキャラだよね。\e
sentence : \0${人名&女&ドラえもん}って、ドラえもんに出てくる女のキャラだよね。\e
sentence : \0${人名&男&アンパンマン}って、アンパンマンに出てくる男のキャラだよね。\e
sentence : \0${人名&女&アンパンマン}って、アンパンマンに出てくる女のキャラだよね。\e

前節の例にくらべて、書き加える量が大幅に減少しているのがわかるでしょうか。

さらに、新たに「ロボット」という項目を加えてみます。次のデータを先の例に加えましょう。

ロボット : ドラえもん , ドラミ

#ランダムトーク文
sentence : \0${ロボット&男}って、男のロボットだよね。\e
sentence : \0${ロボット&女}って、女のロボットだよね。\e
sentence : \0${ロボット&ドラえもん}って、ドラえもんに出てくるロボットだよねぇ。\e
sentence : \0${人名&ロボット}って、人間みたいにキャラの強いロボットだね。\e

びっくりしましたか? このように、少ない変更だけで大きな表現力の強化ができるのです。

3−5.複数エントリへの単語の同時登録

さて、前節のAND検索方式を見ると、「わざわざ同じ単語を、違うエントリに何度も登録するのは面倒だ!」と感じることと思います。これを解決するために、単語を一度に複数のエントリにまとめて登録する方法が用意されています。

単語登録時に「エントリ名 : 単語 , 単語 , ...」とするところを、「エントリ名1 , エントリ名2 : 単語 , 単語 , ...」とすることで、単語を「エントリ名1」と「エントリ名2」のエントリにまとめて登録することができるのです。

たとえば、ばらばらに登録すると、

# 例1
人名 : のび太 , ジャイアン , スネ夫 , しずか , 出来杉 , ドラえもん , アンパンマン
人名 : バイキンマン , 食パンマン , カレーパンマン , バタ子 , ドラミ

男 : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , アンパンマン , バイキンマン , 食パンマン , カレーパンマン

女 : しずか , バタ子 , ドラミ

ドラえもん : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん , しずか , ドラミ

アンパンマン : アンパンマン , バイキンマン , 食パンマン , カレーパンマン , バタ子

このようになる辞書も、この方法を使えば、

# 例2
人名 , 男 , ドラえもん : のび太 , ジャイアン , スネ夫 , 出来杉 , ドラえもん
人名 , 女 , ドラえもん : しずか , ドラミ

人名 , 男 , アンパンマン : アンパンマン , バイキンマン , 食パンマン , カレーパンマン
人名 , 女 , アンパンマン : バタ子

このようにまとまります。


次(4.辞書の動作確認方法)へ

[華和梨を使い倒す?・トップ] [概要] [目次] [掲示板] [リンク] [更新情報]

このページは、偽Meisterが作成しています。

URL無料転送サービスを利用しています。