(更新: 2026.03.25)

自然言語パーサーでカレンダー登録を楽にした

自然言語パーサーでカレンダー登録を楽にした

「明日14時にMTG」「来週水曜の午後会議」みたいな雑な言い方でカレンダーに予定を入れたい。

OpenClawに投げるだけで、自動でGoogleカレンダーに登録される仕組みを作った。

なぜ自然言語パーサーが必要なのか

従来のカレンダー登録:
1. Googleカレンダーを開く
2. 「作成」をクリック
3. タイトル・日時・場所を入力
4. 保存

めんどくさい。

理想:
「明日14時にMTG」→ 自動登録

これを実現するために、自然言語パーサーを実装した。

実装のポイント

1. 日時の解析

// dash/parse_event.js
const parseDateTime = (text) => {
  const now = new Date();

  // 「明日」の検出
  if (/明日/.test(text)) {
    const tomorrow = new Date(now);
    tomorrow.setDate(now.getDate() + 1);
    return tomorrow;
  }

  // 「来週水曜」の検出
  if (/来週水曜/.test(text)) {
    const nextWeek = new Date(now);
    nextWeek.setDate(now.getDate() + 7);
    // 水曜日に調整
    const dayOfWeek = nextWeek.getDay();
    const daysToWednesday = (3 - dayOfWeek + 7) % 7;
    nextWeek.setDate(nextWeek.getDate() + daysToWednesday);
    return nextWeek;
  }

  // その他のパターン...
};

2. 時刻の抽出

const extractTime = (text) => {
  // 「14時」「午後2時」「14:00」などに対応
  const patterns = [
    /(\d{1,2})時/,
    /午後(\d{1,2})時/,
    /(\d{1,2}):(\d{2})/
  ];

  for (const pattern of patterns) {
    const match = text.match(pattern);
    if (match) {
      return parseTimeFromMatch(match);
    }
  }

  return null; // 時刻指定なし
};

3. タイトルの抽出

const extractTitle = (text) => {
  // 日時・時刻パターンを除去して、残りをタイトルとする
  let title = text
    .replace(/明日|来週|今週|(\d{1,2})時|午前|午後/g, '')
    .trim();

  return title || 'イベント';
};

対応パターン

入力例 解析結果
明日14時にMTG 明日14:00、タイトル「MTG」
来週水曜の午後会議 来週水曜14:00、タイトル「会議」
3/25 10時 打ち合わせ 3/25 10:00、タイトル「打ち合わせ」
毎週月曜9時 朝会 毎週月曜9:00、タイトル「朝会」(定期予定)

詰まったポイント

曖昧な表現の扱い

「午後」だけだと、何時か分からない。
→ デフォルトで14:00にする仕様にした。

タイムゾーン

Node.jsのDateオブジェクトはUTCベースなので、日本時間(JST)に変換する必要がある。

const toJST = (date) => {
  return new Date(date.getTime() + 9 * 60 * 60 * 1000);
};

定期予定の扱い

「毎週水曜」みたいな表現は、Googleカレンダーの繰り返しルールとして登録する。

if (/毎週/.test(text)) {
  recurrence = 'RRULE:FREQ=WEEKLY;BYDAY=WE';
}

まとめ

自然言語パーサーは完璧じゃないけど、8割のケースで正しく解析できればOK。

間違ったらGoogleカレンダーで手動修正すればいいだけ。完璧を目指さず、利便性重視で実装した。

タグ: #AI活用 #自然言語処理 #カレンダー