「明日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日
対応言語: 日本語のみ