自然言語パーサーでカレンダー登録を楽にした
自然言語パーサーでカレンダー登録を楽にした
「明日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活用 #自然言語処理 #カレンダー