Watson Conversationの「システム・エンティティ」の日本語対応の様子を調べた（2017/09月時点)

# はじめに
Watson Conversationに[システム・エンティティ](https://console.bluemix.net/docs/services/conversation/system-entities.html#system-entity-details)が追加され[日本語もサポート](https://console.bluemix.net/docs/services/conversation/lang-support.html)されましたが、ドキュメントの例文が英語しかないので、**「日本語でどんな表現が使えるの？」**を調べてみました。

- 「個人的にやってみたら、**2017/09月時点では**こうだった」という結果です
- 今後も引き続き機能強化・改善されると思います
- 日本語環境での結果です

# システム・エンティティとは？

Watson Conversationでの「エンティティ」（～を、に相当するもの）は基本、文脈に沿って抜き出したい内容をご自身でエンティティとして定義する必要があります。しかし「日付」や「時刻」などの汎用・共通的なものまでユーザー側で定義するのは大変ですので、Watson側で提供することにしたのが「システム・エンティティ」です。要は**いちいち定義しなくても使えるエンティティ**です。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4f3598d0-99bf-60aa-eb2f-913c967b1e72.png)

現時点では以下のシステム・エンティティが利用可能です。今回は日本語対応が興味の対象なので1-5のみ使っています。

|#|種類| エンティティ|日本語対応|
|:---|:---|:---|:---:|
|1|日付| @sys-date | ○ |
|2| 時刻・時間 | @sys-time |○  |
|3| 数値 | @sys-number |○ |
|4| 通貨 | @sys-currency | ○ |
|5| パーセント| @sys-percent | ○ |
|6| 場所 | @sys-location | ×(英語のみ-Beta) |
|7| 人名| @sys-person | ×(英語のみ-Beta) |

認識したシステム・エンティティは①ノードでの条件判定で指定　したり　②コンテキストに保管　して利用できます。

【インテント=予約で日付も一緒に指定があった場合の例】
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3390e2e9-70ca-05e8-2d25-3740ddabc984.png)

【レスポンスの条件にも指定できます】
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ba486e55-af60-c302-e63e-8c96135ce1f0.png)

【スロットでも使えます】
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/d576de70-aaf7-3c07-896a-d348f8502297.png)

なお、認識したエンティティには各々「属性（Attribute)」があり、様々な表現で判定やレスポンス中に記述できます。例えば以下は「通貨(@sys-currency)」での属性の例です。(詳しくはドキュメントをご参照ください)

|Attribute|Type| 意味| 例) 「1000円」を認識すると|
|---|---|---|---|
|@sys-currency| string|通貨数量|1000|
|@sys-currency.literal| string|入力| 1000円
|@sys-currency.numeric_value|number| 通貨数量|1000|
|@sys-currency.location|array|入力中で出現する開始・終了位置|[0,5]|
|@sys-currency.unit|string|ISO通貨コード|JPY|

ドキュメント:
[System entity details](https://console.bluemix.net/docs/services/conversation/system-entities.html#system-entity-details)
[Supported Languages](https://console.bluemix.net/docs/services/conversation/lang-support.html#supported-languages)

# システム・エンティティの有効化
システム・エンティティは
- **デフォルトでは無効化されています**ので使う際は有効化します
- ワークスペース単位・カテゴリー単位で使う・使わないを指定できます

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f8f576e5-d5d0-3896-fe5f-03b9c93dab0e.png)

日本語を扱う場合はワークスペースを作成する際に「Japanese｣を選択します

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/49114ce7-415d-4a42-7b8a-825f4d103efb.png)

# 調査方法

日本語環境で色々な表現（文）を入力して、認識するか？どう認識したか？を調査しました。
- 簡単なツールを作成して、まとめて確認しました
- 「個人的にやってみたら、**2017/09月時点では**こうだった」という結果
- ＝「仕様」とは言えませんし、先々機能強化で変わるかもしれません
- 記事では「主だった結果・所見」だけ記載します。明細は別ページ「[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529)」に掲載します。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7f292f04-6531-3503-0125-0ffa1a59487a.png)

なお、作ったアプリは[Bluemixの提供するGitLab](https://git.ng.bluemix.net/e051466/system-entity-check-toolchain-e051466)に置いておきますので、cloneすればご自身のPC環境でも動かせます。よろしければご利用ください。

# 調査結果や印象
## 全般

特に「日本語特有の表現をどこまで許容するか？」に興味があったのですが、結果から見ると、まあいい線行ってました。例えば以下などは大筋オッケーでした。

- 漢用数字（例. 一/二/三/百/千）
- 全角・半角
- 言葉での表現　　　 (例. 明日、今、来年、月曜）
- 相対的な時間軸の表現　（例. 次の月曜)

今回のテストでは「**こんな入力、普通しないだろ！**」というものもやってみたので「認識できない」「誤って認識した」ものもありますが、まあ普通の（＝素直な）表現の対話であれば大丈夫かな、という印象を持ちました。

とはいえ以下のような注意点もありますので、エンティティを認識した後の「利用者への確認」（ＸＸでよろしいですか？）は必要だと思います。

- 独特の解釈ルール、癖　
    - 例）「１月に」→　月初日～月末日までの「範囲」となる
    - 「来月の15日」→  「来月」のみ認識され15日は無視される 
- 「誤認識」～**文章で表現する以上、正確な認識には限界がある**
    - 例) 「来月の第一月曜」→「来月」と「一月」と別々に認識される
    - 「この前の月曜」はOKだが「このまえの月曜」や「先日の月曜」はNG
    - 「10月1日から3日間」→「10月1日」と「今日から３日間（範囲）」と別々に認識される

◆「聞き方を工夫する」こともあるでしょう。例えば「いつがいいですか？」と聞いたら利用者は自由な表現・言い方で日付を指定してきますが、「YYYY/MM/DDの形式でお聞かせください」とお願いすれば合わせてくれる可能性が高いです。
◆認識した値の形式をSpELの正規表現でチェックする、なども可能でしょう。

以下、個別のエンティティについて記載します。

## 日付(@sys-date)
### 仕様サマリー
- 認識フォーマットは YYYY-MM-DD
- ①特定の日付を返す場合( 「今日」=＞2017/09/01 )
- ②日付の範囲を返す場合(「９月」＝＞ 2017/09/01と2017/09/30の２つ)

### 利用に際しての注意点
- API利用時、日付と時刻はデフォルトでは「UTC」ベースですので、「今日」や「今」は世界標準時刻で返ります。日本の現地時間で欲しい場合（普通は、そうでしょう）は /messageの contextで[timezone]()を"Asia/Tokyo"か"Japan"に設定する必要があります
- ![image](https://qiita-image-store.s3.amazonaws.com/0/108535/89541364-e10a-1b7c-7e2a-1a10e31aad27.png)
- Dialogの「Try it out!」では上記対応済です

### 正しく認識できた表現の例
**今日(実行日)=2017/09/08**です

|表現|認識結果|コメント|
|---|---|---|
| 2017/09/08 | 2017/09/08 | YYYY/MM/DD |
| 2017年9月8日 | 2017/09/08 | 年月日表現 |
| 12/31| 2017/12/31 |年がなければ「今年」|
| 一月十五日| 2017/01/15 |年がなければ「今年」|
| 1月| 2017/01/01と2017/01/31|範囲|
|2017年| 2017/01/01と2017/12/31|範囲|
|平成30年1月1日| 2018/01/01|和暦|
|昨日・きのう| 2017/09/07|　|
|今日・きょう| 2017/09/08|　|
|明日・あした| 2017/09/07|　|
|明後日・あさって|2017/09/10|　|
|一昨日・おととい|2017/09/06|　|
|１ケ月後| 2017/10/08|　|
|今週末|2017/09/09と2017/09/10| 週末=土日|
|今週|2017/09/03と2017/09/09| 日曜から土曜まで|

### 注意を要する表現の例

|表現|認識結果|コメント|
|---|---|---|
|15日|n/a|「いつの15日か」が特定できないので認識しない|
|再来月・さ来月| 2017/10/01と2017/10/31 |「来月」として認識|
|九月|2018/09/01と2018/09/30|「**来年の**」9月|
|十月|2017/10/01と2017/10/30|「**今年の**」10月|
|2月29日| 2017/03/01 |2017年はうるう年ではないので計算している|
|12/01/01|1970/12/01| 年が2桁=1～12は月と認識|
|13/01/01|2013/01/01| 年が2桁=13以上は年と認識|
|3か月|2017-12-08|「範囲」ではなく「３か月後の日」となる|
|来週の月曜から金曜まで|2017/09/11|「来週の月曜」のみ認識|
|来週の今日|:2017-09-10 と2017-09-16と2017-09-08|「来週」と「今日」を別々に認識|
|成人の日・クリスマス・大晦日|n/a|祝日や行事には未対応の模様|

個別の実行結果は[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529#%E6%97%A5%E4%BB%98sys-date)にあります。

## 時刻・時間(@sys-time)
### 仕様サマリー
- 認識フォーマットは HH:MM:SS
 
### 利用に際しての注意点
- @sys-dateと同様にデフォルトでは「UTC」ベース
- 特定の「時刻」＝「点」を表現するものであり（一分間・６０分間などの）「時間の幅・範囲」のためのものではないように見受けられる

### 正しく認識できた表現の例
**今(実行時間)=2017/09/11 12:16:42**です

|表現|認識結果|コメント|
|---|---|---|
| 1:00 | 01:00:00 | HH.mm.ss |
| 23:59:59 | 23:59:59 | HH.mm.ss |
|1時・一時| 01:00:00|漢数字も認識 |
|二時二分二秒|02:02:02|同上|
|午前9:00・AM9:00| 09:00:00|　 |
|午後9:00・PM9:00| 21:00:00|　|
|9時半| 09:30:00| 時刻が数字なら「半」もOK|
|今| 2017-09-11と12:16:42|日付と時刻の両方を認識|
|2時間後|14:17:45| 　|
|今晩| 2017-09-11と18:00:00|「晩」は18:00らしい|
|2012/06/30 23:59:00|2012-06-30と23:59:00|　|

### 注意を要する表現の例

|表現|認識結果|コメント|
|---|---|---|
|九時半|09:00:00|「九」が漢数字だと「半」が無視される|
|3時間の間|15:16:52|3時間「後」と認識|
|10時10分前| 02:07:40 |9:50ではなく10時間10分前の時刻になる|
|今から１０分後|2017-09-11と12:17:44と01:00:00|「今」と「10分後」で別々に認識|
|1秒・1分| n/a| 「1時間」は「1時間後」となるが分・秒等の「時間の幅」は認識しない|
|0.1分・0.1秒|00:01:00|1分と解釈。0.1秒は誤り|

個別の実行結果は[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529#%E6%99%82%E5%88%BBsys-time)にあります。


## 数字(@sys-number)
### ご説明
要は「数字」です
### 正しく認識できた表現の例

|表現|認識結果|コメント|
|---|---|---|
| 1000 | 1000 | 　 |
| 1,000 | 1000 | 3桁カンマ |
| 2万一千 | 21000　| 数字・漢数字および混在　|
| 1.1 | 1.1 | 小数点 |
|６０兆・六十兆  | 60000000000000　| 　|
|-1000  | -1000　|マイナス|
|-10,000  | -10000　|マイナスとカンマ|


### 注意を要する表現の例

|表現|認識結果|コメント|
|---|---|---|
|10,00| n/a|カンマ位置が誤っていると認識しない|
|1.1| sys-time:01:01:00と sys-number:1.1 ( 1 )|numberは正しいが無効な時刻も同時に認識|
|１，０００,000|1と0|全角と半角が混在すると誤り|
|ー1000  | 1000　|全角マイナスは無視|

個別の実行結果は[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529#%E6%95%B0%E5%AD%97sys-number)にあります。

## 通貨(@sys-currency)
### ご説明
- 数値(@sys-number)から派生した通貨表現です
- 数値と通貨単位から成ります

### 利用に際しての注意点
- 現時点ではいくつか誤認識する問題があるようなので、（お金はセンシティブでもあり）@sys-currencyは要注意です。もし使うなら利用者に入力形式を指示したり、チェックを厳しくするなどのガードが必要かと思います。また①@sys-currencyではなく@sys-numberで代替する　②本来@sys-numberと@sys-currencyは一致するはずなので、同じかどうかチェックする　などもあるでしょう。

### うまく行った例

|表現|認識結果|コメント|
|---|---|---|
|123,456円|123456|カンマもOK|
|10.12円|10.12|小数点もOK|
|100,00円|10000|カンマ誤り→@sys-numberはNGだが@sys-currencyは認識|
|九円|9|漢数字|
|百万円|1000000|　|
|￥１，０００|1000|全角円記号|
|$10.51・＄１０．５１| 10.51|半角・全角ドル記号|
|１米ドル・1ドル|1|ドル|
|1ユーロ・1人民元・1香港ドル| 1 |主要な通貨のみ対応|


### 注意を要する表現の例

|表現|認識結果|コメント|
|---|---|---|
|一円|n/a|二円～はOK. バグと思われる|
|１万円|110000|数字+千円/万円が誤り。バグと思われる|
|\1000|n/a|半角円記号は文字化けの可能性|
|￥１，０００．９９|100099|誤り。全角小数点が無視されている|

個別の実行結果は[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529#%E9%80%9A%E8%B2%A8sys-currency)にあります。

## パーセント(@sys-percent)
### ご説明
- @sys-numberからの派生でパーセントを示す

### うまく行った例

|表現|認識結果|コメント|
|---|---|---|
|21%・２１％| 21|全角・半角とも認識|
|99.9999%| 99.9999|小数点|
|21パーセント|21|文字表現|
|1-2%| 1と2| -で２つ認識|
|100%から120パーセント|100と120| 2つ同時に認識|

### 注意を要する表現の例

|表現|認識結果|コメント|
|---|---|---|
|１~２％|12|~が無視され連結されている|

個別の実行結果は[参考資料](http://qiita.com/ishida330/items/12241b4d4d58b511c529#%E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88sys-percent)にあります。

以上です