序論
前回と引き続き、タイムスケジュール管理ツールの作成を行っています。前回はGeminiによるスケジュールの提案を行いました。
今回は文字列処理を行っていきます!
製作段階
- プロンプトエンジニアリング
- 文字列処理 ← ここ
- スプレッドシート書き込み
- Google カレンダー登録
- フロントエンド構築
- Flaskに送信
- 入力欄追加
- バックエンド構築
- 1~4のプログラムの書き込み
- ポモドーロテクニックの適用
- フィードバック機能の追加
文字列処理
Geminiの返答は、1つのプロンプトで帰ってきます。1プロンプトのみではGoogleカレンダーの登録は極めて難しいです。そこで、splitを使った文字列処理を行う必要があります。
今回は前回と同じプロンプトを入力します。
#日付#
2024/3/22
#決まった時間#
・起床時間→9:30
・朝の支度→9:30~10:00
・ノーコードミーティング→10:00~11:00
・昼ごはん→12:00~12:30
・晩御飯→19:00~19:30
・入浴→19:30~20:00
・就寝時間→23:30~翌日6:30
#1日でやる内容#
・ブログ: 旅行 30分
・就活: 自己分析 30分
・開発: 日程調整作成 30分
・就活: インターン検索 30分
「#1日でやる内容」を行う時間帯をを箇条書きで割り当ててください。
例えば「- 筋トレ: リングフィット→13:30~14:00」、という感じでお願いします。
#割り当てる時間帯#
11:00以降
文字列処理を行うと、以下のように出力されます。
[{'task': 'ブログ: 旅行 ', 'starttime': ' 11:00', 'endtime': '11:30'},
{'task': '就活: 自己分析 ', 'starttime': ' 11:30', 'endtime': '12:00'},
{'task': '開発: 日程調整作成 ', 'starttime': ' 12:30', 'endtime': '13:00'},
{'task': '就活: インターン検索 ', 'starttime': ' 13:00', 'endtime': '13:30'}]
しかし、文字列処理をしない場合は以下のように出力されます。
- ブログ: 旅行 → 11:00~11:30
- 就活: 自己分析 → 11:30~12:00
- 開発: 日程調整作成 → 12:30~13:00
- 就活: インターン検索 → 13:00~13:30
こうなると、Google Calendarの登録が難しくなりますね。こういう時に文字列処理を行います。
文字列処理の順番
- タスクを箇条書きに分割するために「\n」(改行)で分割
- 行頭文字を除去する
- 「→」を中心に「タスク内容,時間帯」に分割する
- タスク開始・終了時刻を分割する際、「~」を中心に分ける
そうすると、文字列を分割してそれぞれのカラムに入れることができます。
文字列処理のアルゴリズムは以下の通りです。
def make_schedule():
message = suggest_schedule() #Geminiでタスク生成をする
tasks = message.split("\n") #1.の改行を分ける
made_schedule = [] #スケジュールを格納する
#タスク数分配列を作る
for task in tasks:
task1 = task.split("- ")[-1] #2. の行頭文字を分ける。
#0番目を指定すると菜時も出力されない
#1または-1を指定するとタスク内容が出力される
task2 = task1.split("→") # タスク内容と時間帯を分ける
task3 = task2[1] #時間帯を選択
task4 = task3.split("~") #開始時刻と終了時刻を分ける
starttime = task4[0]+""
endtime = task4[1]+""
#task: タスク内容, starttime: 開始時刻, endtime: 終了時刻
made_schedule.append({"task":task2[0],"starttime":starttime,"endtime":endtime})
return made_schedule
make_schedule関数は、関数内でsuggest_schedule関数(Geminiによる生成でスケジュール提案する)を呼び出して、1つのタスクの詳細を細分化することができます。
いざ、以下のように実行してみます。
tasks = make_schedule()
tasks
実行結果
[{'task': 'ブログ: 旅行', 'starttime': '11:00', 'endtime': '11:30'},
{'task': '就活: 自己分析', 'starttime': '11:30', 'endtime': '12:00'},
{'task': '開発: 日程調整作成', 'starttime': '12:30', 'endtime': '13:00'},
{'task': '就活: インターン検索', 'starttime': '13:00', 'endtime': '13:30'}]
しっかり細分化ができました!次回はスプレッドシートの書き込みをします!
感想とまとめ
Geminiからの回答を簡単にまとめるには、文字列処理が必要です。文字列処理はAtcoderやPaizaでも役に立つので、アプリ開発を機にAtcoderで役に立ちました。