意図解釈APIを利用して、相対的な日付表現を正規表現の日付に変換する方法をご紹介します。
Example
「今日」=>「2021年10月26日15時53分49秒」
実装方法
以下の3つの手順で、相対日付表現を正規日付表現に変換します。
意図解釈APIにリクエスト
汎用CGSを利用して、意図解釈APIにリクエストを送信します。
汎用CGSについてはこちら、意図解釈APIについてはこちらをご確認ください。
ご注意
相対日付表現を取得
意図解釈APIのレスポンスから相対日付表現を取得します。
操作手順
- レスポンスのJsonデータを
<predstore>
変数に格納します。 - 格納したJsonデータの
extractedWords
配列要素を<loop>
で回します。 +1D
のような相対日付表現をもつextractedWords
要素を<condition>
による正規表現を用いたマッチングで取得します。
正規日付表現に変換
意図解釈時刻表現変換CGSを利用して、取得した相対日付表現を正規日付表現に変換します。
意図解釈時刻表現変換CGSについては、こちらをご確認ください。
xAIML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<?xml version="1.0" encoding="UTF-8" ?> <aiml version="2.5.0" xmlns="http://www.nttdocomo.com/aiml/schema" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nttdocomo.com/aiml/schema/AIML.xsd"> <topic name="*"> <category> <pattern level="surface" partial="true">*</pattern> <template> <think> <!--汎用CGSを利用して意図解釈APIにリクエスト--> <ext name="multicgs"> <arg name="request"> { "method": "POST", <!--今回の例ではSUNABA意図解釈機能のURLを使用--> <!--商用で意図解釈機能を利用する場合は、ドコモAIエージェントAPIから払い出されたURLを記入--> "url": "https://api-sunaba.xaiml.docomo-dialog.com/taskRecognition", "header": { "HTTP-Version": "HTTP/1.1", "Content-Type":"application/json;charset=utf-8" }, "body": { "projectInfo":{ "projectKey":"DSU" }, "dialogMode":"on", "language":"ja-JP", "dialogStatus":{ "commandId":"00000000000", "task":{ "taskId":"ST001001" }, "loopCount":"0" }, "userUtterance":{ <!--今回の例では、ボットの入力発話をそのまま意図解釈の入力発話とする--> "utteranceText":"<get name="input"/>" } } } </arg> </ext> <!--意図解釈APIのレスポンスデータから相対日付表現を取得--> <predstore>json_response.setJson(<get name="_ext_multicgs_body"/>)</predstore> <!--レスポンスを変数名json_responseに格納--> <set name="_var_count">1</set> <!--ループカウント用の変数--> <set name="_var_day">undefined</set> <!--相対日付格納用の変数の初期化--> <condition name="_var_count"> <li value="|undefined"></li> <li value="15">15回終了</li> <!--_var_countが15になれば終了--> <li> <set name="_var_wordsvalue"><predstore>json_response.extractedWords.wordsValue.slice(1 1)</predstore></set> <!--wordsValueの1番目の値を取得--> <condition name="_var_wordsvalue"> <li regex="(\+|\-)[0-9]+[A-Z].*"> <!--wordsValueの値が指定した正規表現にマッチした場合変数_var_dayに格納--> <set name="_var_day"><get name="_var_wordsvalue"/></set> </li> <li value="|undefined"></li> <li regex=".*">なし</li> </condition> <set name="_var_count"><calc operator="+" name="_var_count">1</calc></set> <!--ループカウンタを+1--> <predstore>json_response.extractedWords.shift()</predstore> <!--extractedWordsの先頭要素を削除--> <loop/> <!--conditionへ戻る--> </li> </condition> <!--意図解釈時刻表現変換CGSを利用して正規日付表現に変換 --> <ext name="nludatetime"> <arg name="extracted_word"> <get name="_var_day" /> <!--取得した相対日付表現("+1D"など)--> </arg> </ext> </think> <get name="_ext_nludatetime_string_jp" /> <!--意図解釈時刻表現変換CGSのレスポンス--> </template> </category> </topic> </aiml> |
実行結果(APIコンソール)