Amazon Lex のスロットタイプのAMAZON.Timeは、日本語の時刻に関する言葉をどこまで認識してくれるか調査してみた
はじめに
Amazon Lexのスロットタイプで、AMAZON.Timeを利用した際に、Lexが日本語の時刻に関する言葉をどこまで認識してくれるか調査しました。
例えば、AMAZON.Timeをスロットに適用し、テストした場合、15時
と入力すると、Lexは、時刻を認識し、具体的な時間に変換してくれます。
下記は、テストしたときの画像です。
15時
を認識し、15:00に変換されていますね。
日本語では、15時
と同じ意味でも、PM3時
、午後3時
、2時間後(時刻が13時の場合)
...など様々な言い回しがあります。
Lexではどこまで認識してくれるか調査しました。
調査結果
先に調査結果を出します。
ただし、調査日(2023年2月3日 金曜日)時点でのLexの認識能力のため、時間が立てば、認識能力が上がることで、より聞き取ってくれる可能性はあります。
時間を様々な言い方でテストした結果
表のLexの認識のうち-
のところは、Lexが認識しなかった箇所です。
入力内容 | Lexの認識 | 判定 |
---|---|---|
9 | - | × |
9時 | - | × |
AM9 | 09:00 | ○ |
午前9時 | 09:00 | ○ |
12 | - | × |
12時 | - | × |
AM0 | 00:00 | ○ |
AM12 | 00:00 | ○ |
午前0 | 00:00 | ○ |
午前12 | 00:00 | ×(12:00が正解) |
PM0 | 12:00 | ○ |
PM12 | 12:00 | ×(00:00が正解) |
午後0時 | 12:00 | ○ |
午後12時 | 12:00 | ○ |
正午 | - | × |
13 | 13:00 | ○ |
13時 | 13:00 | ○ |
じゅうさんじ | - | × |
2時間後 | - | × |
「午後(PM)0時」「午後(PM)12時」は、12:00と認識し、「午前(AM)0時」「午前(AM)12時」は、00:00と認識するようですね。
日本語では、「午後12時」は「00:00」、「午前12時」は「12:00」のことでなので、Lexが間違えてますね。。
あいまいな時刻
「9時」が認識されない理由は、厳格には認識していますが、09:00と21:00の2通りあり、どちらに変換すればよいか分からないため、スロット値に入らないようです。
ドキュメントにも2通りある時刻をあいまいな時刻
と表現し、Lambda関数に値を渡して、処理する必要があると記載がありました。
ただし、「午前9」にすると、あいまいな時刻ではないので、「9:00」と認識してくれますね。
あいまいな時刻の解決が含まれています。ユーザーがあいまいな時刻を入力すると、Amazon Lex は slotDetails イベントの Lambda 属性を使用して、あいまいな時刻の解決を Lambda 関数に渡します。たとえば、ボットからユーザーに配達時間を尋ねたときにユーザーが「10 時」と答えると、この時刻はあいまいです。午前 10:00 なのか午後 10:00 なのかが不明です。この場合、slots マップの値は null となり、slotDetails エンティティには 2 つの可能な時刻の解決が含まれます。
あいまいな時間の対処法は、以前下記のブログを書きましたので、一読ください。
分を様々な言い方でテストした結果
入力内容 | Lexの認識 | 判定 |
---|---|---|
9:13 | - | × |
12:00 | - | × |
13分 | 13:00 | × |
34分 | - | × |
13時13分 | 13:13 | ○ |
13:13 | 13:13 | ○ |
30分後 | - | × |
日付を表す単語を日付形式に変換するスロットタイプの一つであるAMAZON.Date
では、日付が2月6日のときに「5日」と入力すると、未来の日付である「3月6日」と認識されます。
ただし、AMAZON.Time
の場合、時刻が13:30のときに「13分」と入力しても、「14:13」ではなく、「13:00」と分ではなく、時間と認識されるようです。
秒を様々な言い方でテストした結果
入力内容 | AMAZON.Timeの認識 | 判定 |
---|---|---|
13:55:32 | 13:55 | × |
13秒 | - | × |
秒数は、切り捨てられるようです。
JSONで確認すると、originalValue
は、13:55:32 でしたが、
interpretedValue
が13:55になっていることが確認できました。
interpretedValue
- Amazon Lex V2 がスロットについて決定する値。
- ユーザーが入力した値を使用できるか、Amazon Lex に
resolvedValues
のリスト中の値を選ばせるかを行えます。
originalValue
- スロットに対して入力されたユーザーからの発話のテキスト。
resolvedValues
- スロットで認識された追加の値のリスト。
"value": { "originalValue": "13:55:32", "interpretedValue": "13:55", "resolvedValues": [ "13:55" ] }
調査環境の作成
調査するために、作成したボットとインテントの作成方法を説明します。
ボットの作成
- Lexのコンソール画面から、[ボットの作成]をクリックします。
- [空のボットを作成します]を選択し、ボット名を記載し、下記画像の通りに入力します。
- 日本語を選択し、[完了]をクリックします。
これでボットが作成できました。
インテントの作成
- インテント名を入力し、サンプル発話に「予約時間」を追加します。
- [スロットを追加]から、スロットタイプ[AMAZON.Time]を選択します。プロンプトと名前も記載します。
- [Confirmation]の確認プロンプトに、以下を記載します
{time}でよろしいでしょうか?
- [応答を閉じる]をアクティブにします。
- インテントを保存後、Buildすると、インテントのテストが行えます。
テスト方法
- [Test]をクリックし、「予約時間」と入力後、「予約時間を教えて下さい」と問われるため、「15時」などを入力すると、Lexが認識できた場合のみ、確認プロンプトで作成した文章が返ってきます。
このインテントで、AMAZON.Time
のテストが行えます。
最後に
スロットタイプのAMAZON.Time
では、「2時間後」は認識できず、「午後12時」を間違って認識、秒数切り捨てられるなど、実際にテストしないと分からない部分がありました。
他のスロットタイプもどこまで日本語を認識してくれるか調査してみてもよいですね。
Lexを使用する際に、参考になれば幸いです。