LUISで日付認識させようとして、上手く行かないので一旦正規表現で対応したという話です。2018/11/15時点の内容なので、将来的には対応されると信じています。対応状況はこちらを見るとわかると思います。
LUISがDatetimeを認識しない
LUISのPreBuildのEntityにdatetimeがあるので、これで認識するのかと思ったら全く認識しないです。
2018年11月15日の天気は? 11月15日の天気は? 2018/11/15の天気は? 明日の天気は? 明後日の天気は? 昨日の天気は? 来月は何月? 今日の天気は?
⇑これを打ってみた結果がこちら⇓。私のやり方が悪いのか。。。認識率悪い。
まず、 datetimeV2
というEntityが推奨なのに、ja-jp
ではdatetimeV2は使えない。
作成済みエンティティ - LUIS - Azure Cognitive Services | Microsoft Docs
そもそも、今日(2018/11/15)時点の最新コミットでも定義が用意されていない。
そして、datetime
(not V2)は「明日」というワードに「明日」とString返してくるだけなので、使いにくい。この辺りもdatetimeV2で対応されるはずなのですが。
正規表現で対応することにした
色々書きましたが、LUISが将来的に対応してくれることを信じて、直近は以下の正規表現を使って日付抽出することにしました。年が入らないことがあるので
((?<year>[0-90-9]{1,4})[-\/\./-ー.年]{1})?(?<month>[0-90-9]{1,2})[-\/\./-ー.月]{1}((?<day>[0-90-9]{1,2})[-\/\./-ー.日]?)?
【追記】
2018/11/16現在は 8.9.4
が最新なので、上記の正規表現での <year>
みたいなES2018のNamed Capture Groupsの機能使えないです。
Which versions of node.js are available on Azure Web Sites? - Stack Overflow
帰ってくる配列で取得すれば同じことできます。
(([0-90-9]{1,4})[-\/\./-ー.年]{1})?([0-90-9]{1,2})[-\/\./-ー.月]{1}(([0-90-9]{1,2})[-\/\./-ー.日]?)
EntityType Regexで登録します。
日付系は少しだけ抽出できるようになりました。
APIで取ってくると「2018年11月15日」がStringで落ちてくるだけなので、プログラム側でParseしてあげる必要があります。
https://fi-ops-bot.scm.azurewebsites.net/api/diagnostics/runtime
Dialogflowは?
ちなみに、Dialogflowでも試しみたらキレイに認識されました。
ドキュメントにも書いてあるけど、結構色々認識できるみたいです。LUISも早く対応してほしい。 https://dialogflow.com/docs/reference/system-entities#date-ja-v2