LINEから出力したマークダウン形式の会話ログをいい感じにJSON形式にするrubyスクリプト

ChatGPT4でAIとロープレするためにLINEの会話ログをいい感じにJSON化したい

 会話内容によっては、LINEから出力したままのファイルを使ってもAIが読み込んでくれそうだが、経験上、構造を整えたJSON形式のファイルのほうがAIがうまく読み込むと思ったのでやってみた。

before=>after

before

2024.03.28 木曜日
15:07 hoge hogeがfugaをグループに追加しました。
16:29 hoge グループの設定が変更されました。今後このグループに招待する友だちには、グループに参加するかどうかを選んでもらう必要があります。
16:30 hoge hogeがグループ名を「3行日記」に変更しました。
16:41 hoge hogeがグループのプロフィール画像を変更しました。
16:41 hoge hogeがグループのプロフィール画像を変更しました。
20:56 hoge # 2024/03/28
- 顎が痛くてご飯がうまく食べられない。。
- スパーリングが楽しかった。
- fugaが家にいてよかった。
2024.03.29 金曜日
00:27 fuga # 2024/03/28
- 仕事忙しいと身体がしんどい
- おやつが美味しかった
- hogeとお家にいれてよかった
22:31 hoge # 2024/03/29
- 顎関節症が少し良くなった。
- 夕方暖かくて少し散歩した。
- 18時ごろからギターを弾き始めたら、気づいたら20時になってた。

 LINE上で、意味はないけどマークダウン形式で交換日記を書いていたので、素の状態でも結構整っている。

after

[
{
"date": "2024/03/28",
"speaker": "hoge",
"content": "顎が痛くてご飯がうまく食べられない。。, スパーリングが楽しかった。, fugaが家にいてよかった。"
},
{
"date": "2024/03/28",
"speaker": "fuga",
"content": "仕事忙しいと身体がしんどい, おやつが美味しかった, hogeとお家にいれてよかった"
},
{
"date": "2024/03/29",
"speaker": "hoge",
"content": "顎関節症が少し良くなった。, 夕方暖かくて少し散歩した。, 18時ごろからギターを弾き始めたら、気づいたら20時になってた。"
}
] 

 LINEのシステムメッセージや時間表示などを削除して、会話の中身がよくわかる形にしてみた。

LINEから出力したマークダウン形式の会話ログをいい感じにJSON形式にするrubyスクリプト

 需要はなさそうだけど、なんとなく載せてみる。

require 'json'

# ファイルを読み込む
file_path = 'sample.txt'
output_path = 'output.json'
entries = []

def remove_time_from_speaker(speaker)
# 正規表現を使用して時間を取り除く
speaker.gsub(/\d{1,2}:\d{2}\s*/, '')
end

File.open(file_path, 'r') do |file|
current_entry = nil
file.each_line do |line|
if match_data = line.match(/^(.+?)#\s*(\d{4}\/\d{2}\/\d{2})/)
# 不完全なエントリは追加しない
if current_entry && current_entry[:date] && !current_entry[:speaker].empty? && !current_entry[:content].empty?
entries << current_entry
end

# スピーカー名から時間を取り除く
speaker = remove_time_from_speaker(match_data[1].strip)
date = match_data[2].strip
current_entry = { date: date, speaker: speaker, content: [] }
elsif line.strip.start_with?('-') && current_entry
# コンテンツ行を追加
current_entry[:content] << line.strip[1..-1].strip
end
end
# 最後のエントリも確認して追加
if current_entry && current_entry[:date] && !current_entry[:speaker].empty? && !current_entry[:content].empty?
entries << current_entry
end
end

# コンテンツの配列を文字列に変換
entries.each do |entry|
entry[:content] = entry[:content].join(', ')
end

# JSONファイルとして保存
File.open(output_path, 'w') do |file|
file.write(JSON.pretty_generate(entries))
end

puts "JSONファイルが #{output_path} に保存されました。"


 

コメント