単語やネタの追加のしかたとか、いろいろ。 ネタを追加するためには、最低限「さくらスクリプト」を知ってることが必要だ。 ここでは、基本中の基本をやるよ。 複雑な機能は次の章でな。
華和梨は、辞書の単語やランダムトーク台本のほかに、辞書内の単語の分類名(「エントリ名」)もユーザーが自由に作りだすことができます。
ユーザーが思いつくネタにあわせて、単語や台本の追加だけでなく、自由に辞書構造そのものに手を加えていくことができるのです。
ここでは、基本機能を使って単語、台本や分類をいじるテクニックを、実例をまじえて紹介します。
なお、「何か。」用のゴースト台本は「さくらスクリプト」(本体にいろいろな命令を出したり、情報を引き出したりするコマンド類)を使って書く必要があります。「さくらスクリプト」については、「何か。」内の「スクリプトリファレンス」を参照してください。
なお、今後は「GOA Lilith基本セット」を第1章にしたがって新しいゴーストに書き換えた状態を例として説明します。
華和梨は単語、ネタ、システム変数等のすべての情報を「エントリ」という単位で取り扱います。第0章でも説明しましたが、あらためてまとめておきます。
エントリ名には、英数字(A〜Za〜z0〜9)、ピリオド(.)、アンダーバー(_)、各種全角文字を使うことができます。ほかの半角文字・記号は使うことができません。
第0章でも挙げましたが、華和梨には以下のシステムエントリ(特殊な動作をするエントリ)があります。
接頭辞 意味 system.〜 華和梨の持つ各種情報や、「何か。」本体から送られてくる情報などを格納するエントリ。 event.〜 「何か。」本体のイベント反応をするためのエントリ。 compatible.〜 さくらスクリプトの名詞メタ文字列(%ms, %mzなど)に単語を登録するエントリ。 resource.〜 「何か。」本体にネットワーク更新URLやおすすめURLの情報を渡すためのエントリ。 sentence 「何か。」動作中に、ゴーストが勝手にしゃべるトークのネタ用のエントリとして(慣習的に)使う。
単語エントリですが、「GOA Lilith入門セット」(ver3.1以降)では次のようなツリー構造を持っています。けれども、これにとらわれる必要はありません。作るゴーストの個性にあわせて、自由にエントリを定義してください。
(新しいエントリの定義方法については本章後半で、ツリー構造については第3章で扱います。)
名詞 …………………… 名詞・体言全部。
├─物 ………………… 「物質」の名前全部。
│ ├─人名 ………… 人の名前。(『小泉』『ブッシュ』『さくら』など)
│ ├─出版物 ……… 新聞、雑誌、本、漫画など、出版物全般。
│ │ ├─雑誌 … 雑誌、新聞など。(『毎朝新聞』『週刊マガデー』など)
│ │ └─本 …… 本全般。(『できる!BeOS』『わかる!MSX』など)
│ ├─食べ物 ……… 食べ物全般。(『パン』『カレーライス』など)
│ │ └─薬 …… 薬全般。(『抗ヒスタミン剤』『精神安定剤』など)
│ ├─飲み物 ……… 飲み物全般。(『コーラ』『牛乳』など)
│ │ └─薬 …… 薬全般。(『抗ヒスタミン剤』『精神安定剤』など)
│ ├─乗り物 ……… 乗り物全般。(『自動車』『新幹線』など)
│ ├─道具 ………… 道具全般。(『金づち』『ドライバー』など)
│ └─動物 ………… 動物全般。(『熊』『猫』『虎』など)
├─地名 ……………… 土地の名前。(『東京』『ワシントン』など)
├─組織 ……………… 組織や会社、グループ名。(『内閣』『セガ』など)
├─サ変 ……………… 『〜する』の『〜』部。(『掃除』『けんか』など)
├─時刻 ……………… 時刻をあらわす名詞全部。
│ ├─過去 ……… 過去の時刻表現。(『昔』『昨日』『3年前』など)
│ ├─現在 ……… 現在の時刻表現。(『今』『今日』『この瞬間』など)
│ ├─未来 ……… 未来の時刻表現。(『明日』『あさって』『来年』など)
│ ├─時点 ……… それ以外の時刻表現。(『会議中』『食事中』など)
│ └─曜日 ……… 曜日表現。(『月曜日』『火曜日』など)
│ └─曜 … 短い曜日表現。(『月』『火』など)
├─必殺技 …………… 必殺技。(『昇龍拳』『超電磁スピン』など)
├─職業 ……………… 職業全般。(『整体師』『総理大臣』など)
├─長い名詞 ………… 「〜する〜」など長い名詞・体言。(『怒り狂うさくら』など)
└─嫌いな呼び名 …… ゴーストが嫌う呼び名。(『人工無能』など)
修飾 …………………… 名詞を修飾する言葉全部。(『赤い』『きれいな』など)
├─形容詞 …………… 形容詞『〜い』の『〜』部。(『赤』『美し』など)
└─形容動詞 ………… 形容動詞『〜な』の『〜』部。(『雑』『うかつ』など)
セリフ ………………… 名台詞・珍台詞など。(『遊びは、終わりだ!』など)
では、実際に単語を追加してみましょう。第1章の方法で新しいゴーストを準備した場合、単語関係はdict-word.txtに書き込まれています。
<「何か。」本体>
└─<ghost>
└─<Sample and Test>
├─<ghost>
│ └─<master>
│ ├─ dict-word.txt
│ └ .....
├─<shell>
│ └─<master>
│ └ .....
└ .....
これを直接編集していきましょう。(もちろん、前章で説明した「辞書ファイルの追加方法」を使って、新しい辞書ファイルを作ってもかまいません)
「GOA Lilith入門セット」の初期段階では、dict-word.txtの中身は次のようになっています。
#「華和梨」偽AI辞書
# Word Script
#################################################
#華和梨汎用単語
#################################################
#人物名 ${人名}
人名:あの人,誰か
#組織 ${組織}
組織:マイクロソフト,NTT,ドコモ
#地名 ${地名}
地名:日本,ロシア,アメリカ,中国,ソ連,朝鮮,台湾,北朝鮮
#道具 ${道具}
道具:財布,時計,電話,机,シャーペン,消しゴム,鉛筆,ゴミ箱
#食べ物 ${食べ物}
食べ物:きのこ,ワッフル,うなどん
#するコト ${サ変}
サ変:料理,洗濯,掃除
#必殺技 ${必殺技}
必殺技:中華キャノン
#名セリフ ${セリフ}
セリフ:えんいー
#長い単語 ${長い名詞}
長い名詞:${ns}する${npw}
#################################################
#ゴースト固有の単語
#################################################
# 自分の名前
sakura.name:リリス
kero.name:ヌー
# 嫌いなモノ ${嫌いなモノ}
嫌いなモノ:アンチョビ
#################################################
これを見てわかるとおり、エントリ定義の書式は
エントリ名 : 内容 , 内容 , 内容 , ...
です。内容は、カンマで区切ることにより1行に何個でも書くことができます(区切りであるコロンとカンマの両側には、半角空白を入れても入れなくてもかまいません)。
また、次のように同じエントリに対する登録を複数行に分けて書くこともできます。何行書いてもかまいません。
エントリ名 : 内容 , 内容 , 内容 , ...
エントリ名 : 内容 , 内容 , ...
さらに、行頭に"#"文字をおくと、その行はコメント文として扱われます。
こうしたルールをふまえて、ためしに「人名」を追加してましょう。以下のような行をファイル中(どの行でもかまいません)に書き加えてみます。
# 追加人名
人名 : 華和梨 , ぐにゅう , うにゅう , 理夢 , みれにぃ , まゆら , ねここ
これは、このように書いてもかまいません。
# 追加人名
人名 : 華和梨 , ぐにゅう
人名 : うにゅう
人名 : 理夢 , みれにぃ , まゆら , ねここ
1行が長くなりすぎて辞書が見にくくなる場合や、分類が同じでもジャンルが違う単語を登録する場合は、行を分けておいたほうがよいでしょう。特に、ジャンルごとに改行して辞書を作っておくと、あとで「このジャンルの言葉はちょっと止めよう」「このジャンルは入れよう」というような、コメントアウトを使ってのジャンル制御が可能になります。上の例で、たとえば「華和梨」関連の単語群の使用を止めたい場合は、
# 追加人名
#人名 : 華和梨 , ぐにゅう
人名 : うにゅう
人名 : 理夢 , みれにぃ , まゆら , ねここ
のように、行頭に"#"をつけて、辞書データ行をコメントアウトすることができます。
今度は、ゴーストがランダムトークをするときに使うネタを書いてみましょう。ネタもエントリですから、追加する仕組みは一緒です。
ランダムトークのネタは、(慣習として)辞書エントリ名"sentence"に追加します。もちろんエントリ名を変えたりしてもよいのですが、KEEPSやFUDSなどのゴースト作成支援スクリプトはこの慣習を前提に設計されていますので注意が必要です。(辞書中のランダムトークエンジン部を改変する必要が生じます。)
「GOA Lilith入門セット」のランダムトークエンジンもこの慣習に基づいていますので、それに従いましょう。第1章の方法で新しいゴーストを準備した場合、ネタ関係はdict-sent.txtに書き込まれています。(華和梨の仕組み上は別ファイルにせずともよいのですが、分類上別ファイルに分けています)
<「何か。」本体>
└─<ghost>
└─<Sample and Test>
├─<ghost>
│ └─<master>
│ ├─ dict-sent.txt
│ └ .....
├─<shell>
│ └─<master>
│ └ .....
└ .....
初期状態での中身はこんな感じです。
#「華和梨」偽AI辞書
# Sentence Script
#################################################
#偽AIトーク
#################################################
sentence:\0\s[0]トークです。\e
sentence:\0\s[0]やっほー。\e
sentence:\0\s[20]里々も使え!\n里々も!!\e
#################################################
(「さくらスクリプト」については、「何か。」内の「スクリプトリファレンス」を参照してください。)
ここにたとえば次のようなネタを追加してみましょう。
# 挨拶ネタ
sentence : \0ちぃーっす。\n\1どした、急に。\n\0ん?…なんとなく。\1左様か。\e
辞書のどの行に追加してもかまいません。
ネタもエントリのひとつですから、カンマで区切れば何個でも書き込むことができますが、1行につき1つ書き込むのがおすすめです。
さて、当然、ネタや単語の中で使う単語をランダムに変えさせたい(そのために華和梨の辞書システムがある)わけです。
エントリの中でエントリを使用するときは、使用するエントリ名(エントリ名)を"${"と"}"で囲みます。
# 簡易うわさ話1
sentence : \0${人名}ってさ、${食べ物}が好きなんだって。\n\1ふーん。\n\0もう少し、なんか言えよう…\e
この例では、エントリ"人名"と"食べ物"を使っていますね。なお、1つのsentenceの中に何個のエントリを使ってもかまいません。同じ名前のエントリを複数使ってもかまいません。
# 簡易うわさ話2
sentence : \0${人名}ってさ、${食べ物}が嫌いなんだって。\n\1ふーん。\n\0${人名}は、${食べ物}がないと生きていけないらしいよ。\n\1それで。\0…つれないなぁ。\e
この例の場合、${人名}と${食べ物}の2つのエントリがそれぞれ2回ずつ使われていますが、2回ともランダムに単語が呼び出されます(登録単語数などにもよりますが、違う単語が呼び出されることのほうが多いでしょう)。
(一度使ったエントリによって出てきた単語と同じものを、同一エントリ中でもう一度使いたい場合は、再帰定義を使用します。再帰定義については、第3章で説明します。)
また、
# 追加辞書2
地名 : 東京 , 秋葉原 , 浅草
必殺技 : 背負い投げ , 八艘飛び , 八極拳 , マグネシウム光線
人名 : 華和梨 , ぐにゅう , うにゅう
人名 : ${地名}に住んでるアイツ , ${必殺技}の達人
のように辞書に記述されていた場合、
# 知ってる人1
sentence : \0なんか、知ってる人を挙げろってさ。\n\1しかたないな。たとえば、${人名}なんかどうだ?\n\e
のようにエントリ人名を呼び出すと、「華和梨」「ぐにゅう」「うにゅう」といった単語のほかに、 「東京に住んでるアイツ」「八極拳の達人」「ぐにゅうの師匠」といった具合に、エントリにより部分的に変化する単語を作ることができます。
ただし、データを作るときには、単語のつなぎ目に注意する必要があります。
エントリの頭と終わりの部分は、実際に台本と文法的につながる部分です。再帰定義を使用した複合語、とくに助詞を使うなどして作った長い複合語は、前後のつながりに違和感を生じやすくなります。
たとえば、上の辞書例(追加辞書2)の場合「東京に住んでるアイツ」は厳密に言えば単語ではありません。固有名詞でもありません。次のようなスクリプトがあったとします。
# 知ってる人2
sentence : \0えー?${人名}さんには、私、会ったことないよ。\n\1そうか?\n\e
# 知ってる人3
sentence : \0…なんか、私、変なこと言ったかな。\n\1そんなことはないっ。戦う${人名}は、とってもかっこいいぞ。\e
前者(知ってる人2)では「東京に住んでるアイツさん」、後者(知ってる人3)では「戦う東京に住んでるアイツ」になります。……違和感がただよいますね。
このあたりまでは、まだ”MADでCOOL”と、笑っていられるレベルですが、もし辞書に
人名 : ${人名}さん
といった単語があると、「東京に住んでるアイツさんさん」なんてなっちゃいますね。これではちょっと人工無能バカまるだしといった感じになり、イカさないと思いませんか。…いや、もちろん、面白ければそれでいいんですが。
「待て待て、そんな簡単に済むわけないじゃないか。人名の単語中に人名を使ったら…」
そう、もう一つ、問題があります。ぐるぐるまわっちゃうんです。
「秋葉原に住んでるアイツさん」「マグネシウム光線の達人さん」
ぐらいで済めばかわいいものですが、
「うにゅうさんさんさんさんさんさんさんさんさん」「ぐにゅうさんさんさんさんさんさんさんさんさんさんさんさん」…
と、ループする場合があります。このループ、無限に続いてしまう可能性があるので注意が必要です。
ネタを作っていると、新しい単語分類が欲しくなることがあります。たとえば、「華和梨の嫌いな生き物を登録して、それが登場したら驚くようなネタを作ろう」と思ったとしますね。単語分類を見ると、「動物」はありますが…「世の生き物すべてを嫌うのも、ちょっとねぇ」と思うと、新しい単語分類「嫌いな生き物」が欲しくなるわけです。
こういう場合、エントリを新設することはとても簡単です。仮に、新しい分類として"嫌いな動物"という名前の分類を作ることにします。その場合、ユーザー辞書に
# 嫌いな生き物
嫌いな動物 : ゴキブリ , カエル , ヘビ
と追加するだけでOKです。ほかには、何の宣言も必要ありません。(じゃああの"dict-base.txt"はなんなんだ!!と思う人もいることでしょう。ツリー構造を作るために細工をしているのです。これについては第3章で説明します。)
そしてユーザーネタ辞書に、
# アニマルハラスメント
sentence : \1ほれ、${嫌いな動物}。\n\0イヤー!!何で連れてくんのよぉ!!殺す、殺す、殺すぅー!\e
とすれば、新しい分類をすぐに使うことができます。
新しく作った単語分類をほかの単語分類の中に組み込む(例の場合では"嫌いな動物"中の単語をすべて"動物"としても呼び出されるようにする)には、前節で説明した「単語内でエントリを使う」方法を応用します。単語のツリー構造を作る方法です。具体的な方法は第3章で説明します。
(例で使用した「ゴーストが嫌う生き物」のような分類は、ゴースト作成時にはゴースト固有データとしてゴースト専用ファイルに含むことが慣習として推奨されていましたが、もはや気にすることはないでしょう。「GOA Lilith入門セット」の場合は「嫌いなモノ」が、"duct-word.txt"の中で定義されています。)
華和梨は、辞書表記の都合上、さまざまな文字を特殊な文字として認識します。半角のスペースやカンマ、$記号などです。
これらをデータ中で使いたいときには、ダブルクォーテーションで囲えば可能です。たとえば、
sentence : \0これでカンマ「","」って書けるのさ。\e
sentence : "\1俺もカンマ「,」って書けるぜ。\e"
sentence : "\0ドル記号「$」もOK。\e" , "\1これは1000$の札束だぜ。\e"
といった具合に記述できます。また、ダブルクォーテーションそのものを書きたくなったときは、ダブルクォーテーションで囲った内側で"\""と記述すればOKです。たとえば
sentence : "\0うーむ、ダブルクォーテーション(\"〜\")って、書くのが難しいよぉ。\e"
このようにします。
このページは、偽Meisterが作成しています。