LUISが日本語の日付に対応していないので正規表現で引くことにした

LUISで日付認識させようとして、上手く行かないので一旦正規表現で対応したという話です。2018/11/15時点の内容なので、将来的には対応されると信じています。対応状況はこちらを見るとわかると思います。

LUISがDatetimeを認識しない

LUISのPreBuildのEntityにdatetimeがあるので、これで認識するのかと思ったら全く認識しないです。

2018年11月15日の天気は?
11月15日の天気は?
2018/11/15の天気は?
明日の天気は?
明後日の天気は?
昨日の天気は?
来月は何月?
今日の天気は?

⇑これを打ってみた結果がこちら⇓。私のやり方が悪いのか。。。認識率悪い。

f:id:yomon8:20181115150340p:plain

まず、 datetimeV2 というEntityが推奨なのに、ja-jp ではdatetimeV2は使えない。

作成済みエンティティ - LUIS - Azure Cognitive Services | Microsoft Docs

そもそも、今日(2018/11/15)時点の最新コミットでも定義が用意されていない。

https://github.com/Microsoft/Recognizers-Text/tree/19670a9181e20612502288ad85d4729141869577/Patterns/Japanese

そして、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で登録します。

f:id:yomon8:20181115150921p:plain

日付系は少しだけ抽出できるようになりました。

f:id:yomon8:20181115150908p:plain

APIで取ってくると「2018年11月15日」がStringで落ちてくるだけなので、プログラム側でParseしてあげる必要があります。

https://fi-ops-bot.scm.azurewebsites.net/api/diagnostics/runtime

Dialogflowは?

ちなみに、Dialogflowでも試しみたらキレイに認識されました。 f:id:yomon8:20181115151214p:plain

ドキュメントにも書いてあるけど、結構色々認識できるみたいです。LUISも早く対応してほしい。 https://dialogflow.com/docs/reference/system-entities#date-ja-v2

参考URL

正規表現で年月日を分解する