「明日14時にMTG」でカレンダー登録する仕組みの裏側
「明日14時にMTG」でカレンダー登録する仕組みの裏側
自然言語パーサーの役割
「明日14時にMTG、1時間」
この文字列から以下を抽出:
– タイトル: MTG
– 開始日時: 2026-03-21 14:00
– 期間: 60分
これを実現するのが自然言語パーサーです。
実装のポイント
1. 日時の抽出
dateparser ライブラリで「明日」「来週水曜」などの相対表現をサポート:
import dateparser
def extract_datetime(text: str):
settings = {
'TIMEZONE': 'Asia/Tokyo',
'PREFER_DATES_FROM': 'future'
}
parsed = dateparser.parse(text, settings=settings, languages=['ja'])
return parsed
2. 期間の抽出
正規表現で「1時間」「30分」を検出:
import re
def extract_duration(text: str) -> int:
patterns = [
(r'(\d+)時間', lambda m: int(m.group(1)) * 60),
(r'(\d+)分', lambda m: int(m.group(1))),
]
for pattern, converter in patterns:
match = re.search(pattern, text)
if match:
return converter(match)
return 60 # デフォルト1時間
3. タイトルの抽出
日時・期間を除いた残りがタイトル:
def extract_summary(text: str) -> str:
# 日時パターンを削除
cleaned = re.sub(r'明日|今日|来週', '', text)
cleaned = re.sub(r'\d+時間|\d+分', '', cleaned)
cleaned = re.sub(r'、|,', '', cleaned)
return cleaned.strip()
対応パターン
- 明日14時にMTG、1時間
- 来週水曜10時にチームMTG
- 3/25 9:30に朝会、30分
- 再来週金曜14時にA社と打ち合わせ
今後の改善
- 「1時間半」に対応
- 「午前」「午後」の曖昧表現対応
- 「明後日」「しあさって」対応
開発時間: 2日
対応言語: 日本語のみ