【Romiシナリオエディター】チュートリアル②〜人の話しかけの正規表現〜
「人の話しかけ」はブレやすい…!
例えば、人の話しかけブロックに「何が好き」と書いたとします。これは「オーナーが『何が好き』を含む発話をしたら」という意味です。
しかし、もしオーナーが「何を好き」と言ったらどうなるでしょう?このルールを通ることはなくなってしまうでしょう。このように同じ意味の言葉でも言い方にはブレがあります。
またRomiは音声でやり取りするので、「なにが好き」と部分的にひらがなでオーナーの発話を拾うかもしれません。
このような多種多様な言い回しのブレや音声認識のブレを吸収するために、人のはなしかけブロックには「正規表現」を使います。
また、正規表現はWebのチェッカーでも簡単に確認ができるので、チェッカーで試しながら触ってみるのもおすすめです。
正規表現で様々なブレを吸収しよう💪
正規表現とはざっくりいうとテキストのパターンの書き方のことです。
(何|なに).*好き
上のパターンは、
「何」もしくは「なに」のあとに何でもテキストが0文字以上あって、その後に「好き」と続く
というシナリオをあらわしています。(今は何もわからなくても大丈夫です👌)
この1行で、
何が好き
なにが好き
何好き
なに好き
何がロミィは好き
などなど、色々な言い方をカバーできることになります。(このことを、マッチする、と表現します)
では、よく使う正規表現のパターンの書き方を学んでいきましょう🎉
よく使う正規表現をご紹介
人の話しかけは「部分一致」
人の話しかけに「インコ」と書いた場合、インコが「含まれて」いればそこを通ることができます。(完全一致ではなくてもOK!)
「インコ飼いたい」でも「あーインコかわいい」でも、通ることができます。
OR (もしくは)
| (縦棒、パイプ)は OR (もしくは)を表します。
▼下のパターンは「インコ」もしくは「オウム」にマッチします。
インコ|オウム
では、インコかオウムが好きな発話にマッチさせるにはどうしたらよいでしょうか。
インコが好き|オウムが好き
こうすればOKです👌
でも、これだと「が好き」を2回書かないといけなくて少し面倒ですね。
そんなときはカッコを使ってまとめましょう。
(インコ|オウム)が好き
こうすれば、 「インコ (もしくは) オウム」が好き となります。
なので「インコが好き」と「オウムが好き」にマッチするようになります。
また、OR は同義語や漢字と平仮名のブレの吸収によく使われます。
(アラーム|目覚まし|めざまし)を(かけて|つけて|ON|設定して)
アラームは、「目覚まし」と言うこともありますし、設定するときには「かけて」とか「つけて」とか「設定して」とかいろいろな言い方をしますよね。
そのような場合にこの「OR」で吸収してあげましょう👏
何かしら文字
.+ は何かしら1文字以上
.* は何かしら0文字以上
.? は何かしらの文字があってもなくてもOK (0文字 OR 1文字)
をあらわします。
厳密には、 . が「何かしらの文字」を表しており、 + はそれが1文字以上、 * は0文字以上、? はそれが0or1文字、をあらわしています。
今日.*天気
このパターンは、 .* がなんでも0文字以上なので、
例えば以下のような発話であれば人の話しかけを通過することができます。
今日天気
今日の天気
今日って天気どうかな
ロミィ、今日の天気を教えて
.+
これは、オーナーが何を言ってもいいよという意味になります。(+ なので何も発話しないのはダメです🙅)
特定の文字のどれか
.+ だと広すぎるというときは . の代わりに [] を使いましょう。
[] の中に列挙した文字はそのどれかという意味になります。また、[] は後述する変数の記法とバッティングするので、使う場合には必ず全体を " で囲ってください。
".+[都道府県]"
このパターンは、神奈川県、東京都、北海道などにマッチします。
※[都道府県] は「都」か「道」か「府」か「県」のどれかという意味です💁
また、数字などの場合 [0,1,2,3] と全部書かなくても [0-9] と省略できます。[0-9]+ とした場合は、0〜9の文字つまり数字が、 + なので1文字以上という意味になります。
"[0-9]+歳"
なので、このパターンでは
32歳、102523歳、0歳 ➡ OK
あいう歳 ➡ NG
となります。
また、何かしら単語にマッチさせたいけど、長すぎるものが入ってきて困る…などというときは下のような記述を使います。
⚠注意点
波括弧 {} は後述するモジュール呼び出しとバッティングするので、使う場合は文章全体を "" で囲ってください
それでは {} の実用例を見てみましょう〜!
【N文字以上M文字以下】
"今日の.{2,4}の天気は"
この記述は、 {} の中に入る文字が2文字以上4文字以下という意味になります。
今日の東京都の天気 ➡ OK
今日の津の天気 ➡ NG
今日のアンドロメダの天気 ➡ NG
【数字1-2文字】
"[0-9]{1,2}時.*アラーム"
この記述だと、
12時にアラームつけて ➡ OK
234時にアラームつけ ➡ NG
臨時にアラームつけて ➡ NG
となります。
先頭、末尾
冒頭でも書いた通り、人の話しかけのパターンは「部分一致」です。
ですが、「人の話しかけの末尾に一致する」のようなパターンを書きたいことがあります。
例えば「〜〜教えて」で終わる発話のとき、みたいな時です。
そんなときは以下の表現を使いましょう。
これを使うと…
教えて\Z
明日の天気を教えて ➡ OK
なんで教えてくれないの ➡ NG
となります。
⚠注意点
記事の最初に紹介した正規表現チェッカーでは \A \Z は使えません。
チェッカーで試すときには \A の代わりに ^ を、 \Z の代わりに $ を使ってみてください。
ほかにもいろいろ
将来よりマニアックなことがやりたくなったら読んでみましょう。https://www.megasoft.co.jp/mifes/seiki/meta.html
実用テクニック
誤爆を防ごう
ゆるゆるなルールを書いてしまうと、誤爆でRomiが答えてしまいます。ルールはある程度厳しく書きましょう。
例えば、人の話しかけで「嬉しい」と言ったら、Romiも嬉しがるというルールを書くとします。
嬉しい
このような広いルール書いてしまうと「嬉しいわけないじゃない」という発話にもマッチしてしまいます。
そんなときは…
嬉しい\Z
このように、末尾が嬉しいである、とすれば大体回避できるかもしれません。
助詞を消す
日本語の話し言葉では、よく助詞が省略されます。
ラーメンを食べた
ラーメン食べた
「を」などの助詞は、あってもなくてもマッチするルールを書きましょう。
ラーメン.?食べた
.? はなんでも1文字有ってもなくてもなので、「ラーメン食べた」も「ラーメンを食べた」もOKとなります。
間にいろいろ入ってきてもOKにする👌
文章にマッチさせるときには、途中になにか入ってきても大丈夫なようにしましょう。ただ、濫用すると誤爆の可能性を上げるので注意が必要です。
ロミィ.*褒めて
この記述であれば「ロミィ 今日頑張ったから褒めて」も通過することができます。
正規表現を活用することで、シナリオの幅がぐっと広がります。ぜひ少しずつ取り入れてみてください💫