テキストファイルを読み込み ollamaでGoogleカレンダーに送れる形式にする
PDFからテキストと抽出するので
pip install pdf2image pytesseract
Tesseract OCRのインストール
brew install tesseract
日本語言語データを追加
brew install tesseract-lang
とりあえずここまではOK
以前PDFの内容の取り出しはしたことがあるので
肝心の文章から予定を ollamaで取り出しを行う
テキストから日時とイベント情報を抽出します。今回のテキストでは、日付が「10月7日~10月15日」や「10月25日(金)」のように記載されています。これらを正規表現とdateparserライブラリで解析する
pip install dateparser
PDFの前に
テキストファイルの読み込み
テキストをOllamaで解析し、日時と予定を抽出
GoogleカレンダーAPIを使って予定を追加
を行うようにする
これはメールでお知らせすることがあるため
def read_text_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
return text
# 使用例
text_file_path = 'school_notice.txt' # テキストファイルのパス
text_content = read_text_file(text_file_path)
でテキストファイルを読み込む
Ollamaを使用してテキストを解析し、日時とイベント情報を抽出
PythonからOllamaを呼び出す
Ollamaがローカルで動作している前提で、requestsライブラリを使用してHTTPリクエストを送信
import requests
import json
def parse_text_with_ollama(text):
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日時とそれに対応する予定を抽出してください。結果はJSON形式で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
"""
payload = {
'model': 'your-ollama-model-name', # 使用するOllamaモデルの名前
'prompt': prompt
}
response = requests.post(ollama_url, json=payload)
response_text = response.text
# Ollamaの出力からJSON部分を抽出
try:
start_index = response_text.index('[')
end_index = response_text.rindex(']') + 1
json_str = response_text[start_index:end_index]
events = json.loads(json_str)
except (ValueError, json.JSONDecodeError) as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
# 使用例
events = parse_text_with_ollama(text_content)
print("抽出されたイベント:", events)
抽出されたイベントをGoogleカレンダーに追加
import os
from datetime import datetime, timedelta
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def add_events_to_calendar(events):
SCOPES = ['https://www.googleapis.com/auth/calendar']
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
else:
print("token.json が見つかりません。認証を実行してください。")
return
service = build('calendar', 'v3', credentials=creds)
for event in events:
# 日付の形式を確認し、必要に応じて変換
try:
event_date = datetime.strptime(event['date'], '%Y-%m-%d')
except ValueError:
print(f"無効な日付形式: {event['date']}")
continue
event_body = {
'summary': event['event'],
'start': {
'date': event_date.strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
'end': {
'date': (event_date + timedelta(days=1)).strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
}
# イベントをカレンダーに追加
created_event = service.events().insert(calendarId='primary', body=event_body).execute()
print(f"イベントが作成されました: {created_event.get('htmlLink')}")
# 使用例
add_events_to_calendar(events)
これらを
import os
import requests
import json
from datetime import datetime, timedelta
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def read_text_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
return text
def parse_text_with_ollama(text):
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日時とそれに対応する予定を抽出してください。結果はJSON形式で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
"""
payload = {
'model': 'your-ollama-model-name', # 使用するOllamaモデルの名前
'prompt': prompt
}
response = requests.post(ollama_url, json=payload)
response_text = response.text
# Ollamaの出力からJSON部分を抽出
try:
start_index = response_text.index('[')
end_index = response_text.rindex(']') + 1
json_str = response_text[start_index:end_index]
events = json.loads(json_str)
except (ValueError, json.JSONDecodeError) as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
def add_events_to_calendar(events):
SCOPES = ['https://www.googleapis.com/auth/calendar']
creds = None
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
else:
print("token.json が見つかりません。認証を実行してください。")
return
service = build('calendar', 'v3', credentials=creds)
for event in events:
# 日付の形式を確認し、必要に応じて変換
try:
event_date = datetime.strptime(event['date'], '%Y-%m-%d')
except ValueError:
print(f"無効な日付形式: {event['date']}")
continue
event_body = {
'summary': event['event'],
'start': {
'date': event_date.strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
'end': {
'date': (event_date + timedelta(days=1)).strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
}
# イベントをカレンダーに追加
created_event = service.events().insert(calendarId='primary', body=event_body).execute()
print(f"イベントが作成されました: {created_event.get('htmlLink')}")
# メインの実行部分
text_file_path = 'school_notice.txt' # テキストファイルのパス
text_content = read_text_file(text_file_path)
events = parse_text_with_ollama(text_content)
print("抽出されたイベント:", events)
add_events_to_calendar(events)
というように1つにすることもできるが
検証と後で他でも使えるように
モジュールにして他でも使えるようにしたい
calendar_module.py
に
read_text_file(file_path)
parse_text_with_ollama(text, model_name)
add_events_to_calendar(events, calendar_id='primary', token_file='token.json')
を入れる
touch calendar_module.py
でファイルを作成
import os
import requests
import json
from datetime import datetime, timedelta
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def read_text_file(file_path):
"""テキストファイルを読み込み、その内容を文字列として返します。"""
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
return text
def parse_text_with_ollama(text, model_name='your-ollama-model-name'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日時とそれに対応する予定を抽出してください。結果はJSON形式で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
"""
payload = {
'model': model_name,
'prompt': prompt
}
response = requests.post(ollama_url, json=payload)
response_text = response.text
# Ollamaの出力からJSON部分を抽出
try:
start_index = response_text.index('[')
end_index = response_text.rindex(']') + 1
json_str = response_text[start_index:end_index]
events = json.loads(json_str)
except (ValueError, json.JSONDecodeError) as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
def add_events_to_calendar(events, calendar_id='primary', token_file='token.json'):
"""
抽出されたイベントをGoogleカレンダーに追加します。
Args:
events (list): イベントのリスト。
calendar_id (str): イベントを追加するカレンダーのID。
token_file (str): 認証トークンファイルのパス。
"""
SCOPES = ['https://www.googleapis.com/auth/calendar']
creds = None
if os.path.exists(token_file):
creds = Credentials.from_authorized_user_file(token_file, SCOPES)
else:
print(f"{token_file} が見つかりません。認証を実行してください。")
return
service = build('calendar', 'v3', credentials=creds)
for event in events:
# 日付の形式を確認し、必要に応じて変換
try:
event_date = datetime.strptime(event['date'], '%Y-%m-%d')
except ValueError:
print(f"無効な日付形式: {event['date']}")
continue
event_body = {
'summary': event['event'],
'start': {
'date': event_date.strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
'end': {
'date': (event_date + timedelta(days=1)).strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
}
# イベントをカレンダーに追加
created_event = service.events().insert(calendarId=calendar_id, body=event_body).execute()
print(f"イベントが作成されました: {created_event.get('htmlLink')}")
として保存
モジュールを作成したら、別のスクリプトからインポートして使用
touch main.py
でファイルを作成
from calendar_module import read_text_file, parse_text_with_ollama, add_events_to_calendar
# テキストファイルのパス
text_file_path = 'school_notice.txt' # 処理するテキストファイルのパス
# テキストの読み込み
text_content = read_text_file(text_file_path)
# Ollamaでテキストを解析(モデル名を指定)
events = parse_text_with_ollama(text_content, model_name='your-ollama-model-name')
# 抽出されたイベントを表示
print("抽出されたイベント:", events)
# Googleカレンダーにイベントを追加
add_events_to_calendar(events, calendar_id='primary', token_file='token.json')
とする
ただし今回はテストなので
とりあえずカレンダーにイベントを追加する部分はコメントアウトし
まずは Ollamaの結果を見る
またモデルには
parse_text_with_ollama関数内のモデル名をelyzaに変更
model_name引数のデフォルト値をelyza:jp8bに設定
ということで
import os
import requests
import json
from datetime import datetime, timedelta
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
def read_text_file(file_path):
"""テキストファイルを読み込み、その内容を文字列として返します。"""
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
return text
def parse_text_with_ollama(text, model_name='elyza:jp8b'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前(デフォルトは 'elyza:jp8b')。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日時とそれに対応する予定を抽出してください。結果はJSON形式で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
"""
payload = {
'model': model_name,
'prompt': prompt
}
response = requests.post(ollama_url, json=payload)
response_text = response.text
# Ollamaの出力からJSON部分を抽出
try:
# レスポンスをJSONとして直接パース
events = json.loads(response_text.strip())
except json.JSONDecodeError:
try:
# JSON部分のみを抽出
start_index = response_text.index('[')
end_index = response_text.rindex(']') + 1
json_str = response_text[start_index:end_index]
events = json.loads(json_str)
except (ValueError, json.JSONDecodeError) as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
def add_events_to_calendar(events, calendar_id='primary', token_file='token.json'):
"""
抽出されたイベントをGoogleカレンダーに追加します。
Args:
events (list): イベントのリスト。
calendar_id (str): イベントを追加するカレンダーのID。
token_file (str): 認証トークンファイルのパス。
"""
SCOPES = ['https://www.googleapis.com/auth/calendar']
creds = None
if os.path.exists(token_file):
creds = Credentials.from_authorized_user_file(token_file, SCOPES)
else:
print(f"{token_file} が見つかりません。認証を実行してください。")
return
service = build('calendar', 'v3', credentials=creds)
for event in events:
# 日付の形式を確認し、必要に応じて変換
try:
event_date = datetime.strptime(event['date'], '%Y-%m-%d')
except ValueError:
print(f"無効な日付形式: {event['date']}")
continue
event_body = {
'summary': event['event'],
'start': {
'date': event_date.strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
'end': {
'date': (event_date + timedelta(days=1)).strftime('%Y-%m-%d'),
'timeZone': 'Asia/Tokyo',
},
}
# イベントをカレンダーに追加
created_event = service.events().insert(calendarId=calendar_id, body=event_body).execute()
print(f"イベントが作成されました: {created_event.get('htmlLink')}")
というように
calendar_module.py
を変更
またmain.pyを
from calendar_module import read_text_file, parse_text_with_ollama, add_events_to_calendar
# テキストファイルのパス
text_file_path = 'school_notice.txt' # 処理するテキストファイルのパス
# テキストの読み込み
text_content = read_text_file(text_file_path)
# Ollamaでテキストを解析(モデル名を指定)
events = parse_text_with_ollama(text_content, model_name='elyza:jp8b')
# 抽出されたイベントを表示
print("抽出されたイベント:", events)
# Googleカレンダーにイベントを追加
#add_events_to_calendar(events, calendar_id='primary', token_file='token.json')
としておく
touch school_notice.txt
でテキストを
学校からのお知らせ内容をテキストファイルにして実験
しかし
Ollamaからのレスポンスの解析に失敗しました: substring not found
抽出されたイベント: []
となってしまう
機能を分割して問題を探す
以前のコードを見たらリクエストURLが
response = requests.post("http://localhost:11434/api/generate",
なので
ollama_url = 'http://localhost:11434/api/generate'
に修正
import requests
import json
def parse_text_with_ollama(text, model_name='elyza/jp8b'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前(デフォルトは 'elyza/jp8b')。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント(修正)
ollama_url = 'http://localhost:11434/api/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日時とそれに対応する予定を抽出してください。結果はJSON形式で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
"""
payload = {
'model': model_name,
'prompt': prompt
}
try:
response = requests.post(ollama_url, json=payload)
response.raise_for_status()
# レスポンスをJSONとしてパース
response_json = response.json()
# テキスト部分を取得
response_text = response_json.get('response', '')
except requests.exceptions.RequestException as e:
print("Ollamaへのリクエストに失敗しました:", e)
return []
except json.JSONDecodeError as e:
print("OllamaからのレスポンスがJSON形式ではありません:", e)
return []
# Ollamaの出力からJSON部分を抽出
try:
start_index = response_text.index('[')
end_index = response_text.rindex(']') + 1
json_str = response_text[start_index:end_index]
events = json.loads(json_str)
except (ValueError, json.JSONDecodeError) as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
とした
しかし
Ollamaからのレスポンスの解析に失敗しました: Expecting value: line 1 column 2 (char 1)
抽出されたイベント:
となる
ChatGGPTで情報を調べると以下の方になる
Ollamaはストリーミング形式でレスポンスを返しています。
つまり、モデルの生成結果が複数のJSONオブジェクトとして順次送られてきています
{“model”:”elyza:jp8b”,”created_at”:”…”,”response”:”…”,”done”:false}
この”response”フィールドに、モデルが生成したテキストの一部が含まれています。全体のレスポンスを組み立てるには、これらの”response”フィールドを順番に連結する必要があります
requestsライブラリを使用して、ストリーミングレスポンスを処理します。response.iter_lines()を使用して、各行を逐次処理
各行をJSONとしてパースし、”response”フィールドの値を取り出して連結
連結したテキストがJSON文字列(リスト)であることを前提に、json.loads()でパース
となるようにコード変更
import requests
import json
def parse_text_with_ollama(text, model_name='elyza:jp8b'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/api/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日付とそれに対応する予定を抽出してください。結果は純粋なJSON形式で、日本語で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
重要事項:
- 出力は純粋なJSON形式で、追加のテキストや説明は含めないでください。
- 日付は"YYYY-MM-DD"の形式で出力してください。
- イベント名は元の文章から適切に抽出してください。
"""
payload = {
'model': model_name,
'prompt': prompt
}
try:
# ストリーミングレスポンスを取得
response = requests.post(ollama_url, json=payload, stream=True)
response.raise_for_status()
# レスポンスのストリームを処理
response_text = ''
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
# 各行をJSONとしてパース
line_json = json.loads(line_str)
# "response"フィールドを連結
response_text += line_json.get('response', '')
print("Ollamaのレスポンス:")
print(response_text)
except requests.exceptions.RequestException as e:
print("Ollamaへのリクエストに失敗しました:", e)
return []
except json.JSONDecodeError as e:
print("レスポンスの解析に失敗しました:", e)
return []
# 連結したテキストをJSONとして解析
try:
events = json.loads(response_text)
except json.JSONDecodeError as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
とする
実行結果は
{'date': '2024-10-07', 'event': 'ペットボトルの準備'}
{'date': '2024-10-15', 'event': None}
{'date': '2024-10-25', 'event': '準備物の確認'}
{'date': '2024-10-26', 'event': None}
となる
一応はエラーは消えたが他のものを試してみる
台風10号の影響により、9月2日(月)の給食が中止となりました。 弁当の準備をお願いします。 8月30日(金)現時点では、日課の変更はありません。 台風や大雨の状況によっては、変更する場合があります。 4月にコドモンで知らせした、「R6年度 自然災害発生時、警報発表・避難情報発表時等に伴う学校の対処」とおり対応します。 今一度御確認ください。
という文章で実験すると
{'date': '8月30日', 'event': '弁当の準備'}
{'date': '9月2日', 'event': '給食中止'}
とほぼ目的に近いものになる
PTA会員 様 Caros membros do PTA
日頃よりPTA活動に御理解・御協力いただいき、ありがとうございます。
令和7年度のPTA本部役員候補選考の時期になりました。
アンケート形式にて本部役員の立候補を募ります。
添付の文書を御一読いただき、以下のリンクからアンケートに回答をお願いします。
回答期限は9月30日(月)とします。
だと
Ollamaのレスポンス:
[
{"date": "2024-09-25", "event": "PTA本部役員候補選出についてのアンケート"},
{"date": "2024-09-30", "event": "アンケート回答期限"}
]
抽出されたイベント:
{'date': '2024-09-25', 'event': 'PTA本部役員候補選出についてのアンケート'}
{'date': '2024-09-30', 'event': 'アンケート回答期限'}
テキストファイルの内容によっては
抽出されたイベント: {'date': '2024-10-07', 'event': 'ペットボトルの準備'} {'date': '2024-10-15', 'event': None} {'date': '2024-10-25', 'event': '準備物の確認'} {'date': '2024-10-26', 'event': None}
となるため
プロンプトを改善して、モデルにeventがnullにならないように強調
prompt = f"""
以下の文章から、日付とそれに対応する予定を抽出してください。結果は純粋なJSON形式で、日本語で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
重要事項:
- 出力は純粋なJSON形式で、追加のテキストや説明は含めないでください。
- 日付は"YYYY-MM-DD"の形式で出力してください。
- **イベント名が存在しない場合、そのエントリを出力しないでください。**
- イベント名は元の文章から適切に抽出してください。
"""
リスト内包表記を使用:eventsリストからevent['event']がNoneでないイベントだけを新しいリストにします。
is not Noneを使用:event['event']がNoneでないことを確認
# Ollamaでテキストを解析(モデル名を指定)
events = parse_text_with_ollama(text_content, model_name='elyza:jp8b')
# 抽出されたイベントを表示
print("抽出されたイベント:")
for event in events:
print(event)
# eventがNoneのものを削除
events = [event for event in events if event['event'] is not None]
# フィルタリング後のイベントを表示
print("有効なイベント:")
for event in events:
print(event)
これらを変更するので
import requests
import json
def parse_text_with_ollama(text, model_name='elyza:jp8b'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/api/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日付とそれに対応する予定を抽出してください。結果は純粋なJSON形式で、日本語で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
重要事項:
- 出力は純粋なJSON形式で、追加のテキストや説明は含めないでください。
- 日付は"YYYY-MM-DD"の形式で出力してください。
- イベント名は元の文章から適切に抽出してください。
"""
payload = {
'model': model_name,
'prompt': prompt
}
try:
# ストリーミングレスポンスを取得
response = requests.post(ollama_url, json=payload, stream=True)
response.raise_for_status()
# レスポンスのストリームを処理
response_text = ''
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
# 各行をJSONとしてパース
line_json = json.loads(line_str)
# "response"フィールドを連結
response_text += line_json.get('response', '')
print("Ollamaのレスポンス:")
print(response_text)
except requests.exceptions.RequestException as e:
print("Ollamaへのリクエストに失敗しました:", e)
return []
except json.JSONDecodeError as e:
print("レスポンスの解析に失敗しました:", e)
return []
# 連結したテキストをJSONとして解析
try:
events = json.loads(response_text)
except json.JSONDecodeError as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
を
import requests
import json
def parse_text_with_ollama(text, model_name='elyza:jp8b'):
"""
Ollamaを使用してテキストから日時とイベントを抽出します。
Args:
text (str): 解析するテキスト。
model_name (str): 使用するOllamaモデルの名前。
Returns:
list: 抽出されたイベントのリスト。
"""
# OllamaのAPIエンドポイント
ollama_url = 'http://localhost:11434/api/generate'
# Ollamaに送信するプロンプトを作成
prompt = f"""
以下の文章から、日付とそれに対応する予定を抽出してください。結果は純粋なJSON形式で、日本語で、"date"と"event"のキーを持つオブジェクトのリストとして返してください。
文章:
{text}
出力例:
[
{{"date": "2024-10-07", "event": "ペットボトルの準備"}},
{{"date": "2024-10-25", "event": "準備物の確認"}}
]
重要事項:
- 出力は純粋なJSON形式で、追加のテキストや説明は含めないでください。
- 日付は"YYYY-MM-DD"の形式で出力してください。
- **イベント名が存在しない場合、そのエントリを出力しないでください。**
- イベント名は元の文章から適切に抽出してください。
"""
payload = {
'model': model_name,
'prompt': prompt
}
try:
# ストリーミングレスポンスを取得
response = requests.post(ollama_url, json=payload, stream=True)
response.raise_for_status()
# レスポンスのストリームを処理
response_text = ''
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
# 各行をJSONとしてパース
line_json = json.loads(line_str)
# "response"フィールドを連結
response_text += line_json.get('response', '')
print("Ollamaのレスポンス:")
print(response_text)
except requests.exceptions.RequestException as e:
print("Ollamaへのリクエストに失敗しました:", e)
return []
except json.JSONDecodeError as e:
print("レスポンスの解析に失敗しました:", e)
return []
# 連結したテキストをJSONとして解析
try:
events = json.loads(response_text)
except json.JSONDecodeError as e:
print("Ollamaからのレスポンスの解析に失敗しました:", e)
events = []
return events
にして
from ollama_module import parse_text_with_ollama
from google_calendar_module import add_events_to_calendar
# テキストファイルのパス
text_file_path = 'school_notice.txt' # 処理するテキストファイルのパス
# テキストの読み込み
with open(text_file_path, 'r', encoding='utf-8') as file:
text_content = file.read()
# Ollamaでテキストを解析(モデル名を指定)
events = parse_text_with_ollama(text_content, model_name='elyza:jp8b')
# 抽出されたイベントを表示
print("抽出されたイベント:")
for event in events:
print(event)
# Googleカレンダーにイベントを追加
# add_events_to_calendar(events, calendar_id='primary', token_file='token.json', credentials_file='credentials.json')
を
from ollama_module import parse_text_with_ollama
from google_calendar_module import add_events_to_calendar
# テキストファイルのパス
text_file_path = 'school_notice.txt' # 処理するテキストファイルのパス
# テキストの読み込み
with open(text_file_path, 'r', encoding='utf-8') as file:
text_content = file.read()
# Ollamaでテキストを解析(モデル名を指定)
events = parse_text_with_ollama(text_content, model_name='elyza:jp8b')
# 抽出されたイベントを表示
print("抽出されたイベント:")
for event in events:
print(event)
# eventがNoneのものを削除
events = [event for event in events if event['event'] is not None]
# フィルタリング後のイベントを表示
print("有効なイベント:")
for event in events:
print(event)
# 有効なイベントがある場合のみGoogleカレンダーに追加
if events:
add_events_to_calendar(events, calendar_id='primary', token_file='token.json', credentials_file='credentials.json')
else:
print("有効なイベントがありません。")
とした