ToDo アプリはどうやって「明日の午前9時」を理解するのか
自然言語の日付解析の短いツアー、その背後にある正規表現の技、そしてオンデバイス AI が可能なことを変えている理由。
良い ToDo アプリに「明日の午前9時に Sam にメール」と入力すると、2つのうちどちらかが起こるはずです。タイトル「Sam にメール」と翌日の午前9時に設定された締め切り日を持つきれいなオブジェクトとしてタスクが返ってくるか、アプリが何もせずあなたが日付ピッカーを埋めなければならないかです。この2つの結果の違いが、あなたが実際にそのアプリを使うかどうかを決めます。
自然言語の日付解析は何十年も前からあります。Quicksilver を動かしました。Fantastical を動かしました。今日では出荷する価値のあるほぼすべての生産性アプリを動かしています。しかし、内部での動き方はここ2、3年で興味深い形で変わり、その結果、2026年は、この技術がほとんどのアプリで英語に対して本当に解決され、ほかの言語でもうまく動き始めた最初の年になりました。
この記事は、その仕組みのツアーです。
問題の基本的な形
ユーザーが文を入力します。アプリは以下を行う必要があります。
- その文がそもそも日付を含むかを判断する。
- 含む場合、テキストのどの範囲が日付を指すかを見つける。
- その範囲を絶対的な日付と時刻に解決する。
- その日付の範囲を文から取り除き、残りのテキストがタスクのタイトルだけになるようにする。
これらの各ステップにはそれぞれの失敗パターンがあります。初期の実装の多くはステップ1でもろく、誤検出を生みました。「15件のレポートを受け取る」が月の15日の締め切りになってはいけません。「りんごを3個買う」が何か3つのものとして解釈されてはいけません。「IBM の Sam にメール」は、おそらく時刻を「I.B.M. に」に固定してはいません。
古典的な戦略は正規表現です。これは驚くほどこれに向いています。ひと握りの注意深く書かれたパターンで、人々が実際に ToDo アプリに入力する日付フレーズの90%以上を認識できます。
\bin\s+(a|an|\d+|some|several)\s+(min|minute|minutes|hour|hours|hr|hrs|day|days|week|weeks|month|months)\b\b\d{1,2}(:\d{2})?\s*(am|pm)\b\b(tomorrow|today|tonight|noon|midnight)\b\b(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b
これらのパターンを15個か20個組み合わせると、ロングテールをカバーできます。それからマッチをつなぎ合わせます。曜日の語に時刻の語が加わると特定の瞬間になります。修飾語のない曜日名は「その曜日の次の出現」を意味します。日付のない裸の時刻の語は今日を意味します。
正規表現が行き詰まるところ
正規表現は3種類の入力で壁にぶつかります。
- あいまいなフレーズ。 「来週のどこかで」は日付ですが、特定の日付ではありません。
- 多義性。 「金曜日の午後」は、慣習によって午後2時にも午後4時にもなり得ます。
- スペルミスとスラング。 「tmrw at 9p」は人間には解析できますが、多くのバリエーションなしには厳密な正規表現には解析できません。
長い間、ToDo アプリはこれらに肩をすくめるだけでした。「tmrw at 9p」と入力すれば何も得られませんでした。「明日いちばんに」と入力しても何も得られませんでした。ユーザーは正式なバージョンを入力するよう学びました。
ここ1年の興味深い進展は、オンデバイスの言語モデルが、ネットワークに何も送らずにこれらのケースを扱えるようになったことです。macOS 26 以降で利用できる Apple の Foundation Models フレームワークは、ローカルで動き、正規表現が外したときのフォールバックとして使えるほど速いモデルを出荷しています。Google も Android で同様のものを提供しています。結果として生まれるパターンはこうなります。
速い経路が90%のケースをカバーします。モデルが残りを処理します。どちらの段階も、ユーザーのテキストをネットワークに送りません。プライバシーと速度の両方が保たれます。
なぜ「2時間後」は見た目より難しいのか
「2時間後」というフレーズは簡単に見えます。そうではありません。
ユーザーは以下のいずれをも意味し得ます。
- 今からちょうど2時間後、分単位で。
- 今から2時間後、見栄えのために最も近い15分に丸めて。
- 今から2時間後、ただしそれがユーザーの設定した睡眠時間に当たるなら、翌朝。
- 次の正時の始まりから2時間後(午後1時55分に言った「2時間後」は、午後3時55分ではなく午後4時を意味するかもしれない)。
ほとんどのアプリは1つを選んでそれを貫きます。最も一般的なのは「今からちょうど2時間後、分単位で」で、これは優雅さを予測可能性と引き換えにします。午後1時23分に「2時間後」と入力したユーザーは午後3時23分に通知を受けます。きれいな時刻が欲しいときは整数を入力するよう学びます。
なぜ「明日」はデフォルトで午前9時になるのか
時刻なしで「明日」と入力すると、アプリは時刻を選ばなければなりません。慣習は市場のほぼすべてのアプリで午前9時に収束しています。なぜでしょうか。
推測を外したときのコストが非対称だからです。アプリが午前9時を選び、あなたが午前11時を望んでいたなら、気づいたときにすぐ調整できます。アプリが真夜中やほかの適当な時刻を選ぶと、寝ている間に通知が来るか、まったく見逃します。午前9時は、ほぼあらゆる種類の仕事のタスクにとって安全なデフォルトです。
午前8時をデフォルトにするアプリもいくつかあります。タスクを入力した時刻を使うものもあります(「午後2時に言ったから、おそらく明日の午後2時を意味する」)。後者は賢いですが信頼できません。午後2時にタスクを入力する人のほとんどは、翌日のちょうど午後2時ではなく、将来の勤務日にやりたいタスクのために、勤務日中にそうしているからです。
TodoBar の内部ではこれがどう見えるか
TodoBar は上で説明した2段階のパターンを使っています。時間を表すフレーズを含むタスクを入力すると、まず正規表現の層が1ミリ秒未満で発火します。日付を見つけると、正しい締め切り時刻が付いたタスクがリストに現れます。正規表現の層がフレーズを解決できない場合、オンデバイスの Foundation Models 分類器が、約50ミリ秒という典型的なレイテンシで挑戦します。どちらにせよ、テキストが Mac から出ることはありません。
正規表現の層が認識するパターンはサポートページに記載されています。簡単なリファレンスとして、以下はすべて動きます。
- “in 30 minutes”
- “in 2 hours”
- “in a couple hours”
- “tomorrow”
- “tomorrow at 9am”
- “tonight”
- “tonight at 8”
- “next Friday”
- “Friday at 5pm”
- “May 12”
- “May 12 at 2pm”
- “the 15th”
- “in 3 days”
- “1 week from now”
- “first thing tomorrow”
パーサーが扱えないものを入力した場合でも、タスクは締め切りなしで追加され、行のベルボタンから手動で締め切りを付けられます。パーサーの失敗パターンは「タスクの紛失」ではなく「日付が付かない」です。
これがすべて向かう先
次の興味深いフロンティアは多言語の解析です。「mañana a las 9」のようなスペイン語のフレーズが英語の同等物と同じくらいうまく動くべきで、ローカライズを真剣に受け止めるアプリではますますそうなっています。Apple のオンデバイスモデルは、私たちの内部テストでスペイン語をうまく扱います。同じアプローチが、フランス語、ドイツ語、日本語、そしておそらくほとんどの主要言語で、来年のうちに動くようになるでしょう。
部品はすべて揃っています。かつては高価なクラウドへの往復だったものが、今では50ミリ秒で済むローカルの関数呼び出しです。インディーの ToDo アプリが、無料で、ユーザーごとの推論の請求なしにそれを出荷できるという事実こそが、本当の物語です。
TodoBar は macOS 向けの親しみやすいメニューバー ToDo リストです。話し言葉そのままの締め切り、グローバルホットキー、iCloud 同期。一度の購入で、ずっとあなたのもの。
App Store で TodoBar を入手