タイトルをプロンプトにしてDiffusionBeeで生成された画像 |
VSCodeでPythonをいじり始めました。
VSCodeのインストールについてはこちらを参照。
Pythonの導入についてはこちらを辛抱強く読み進めてなんとか使えるようにしました。
ちなみにVSCodeでコードの任意の場所に文字を入力しようとしても、バックスペースで文字を削除しようとしても、改行キーを押しても何も反応しませんでした。
例えば、変更後の文字をコピーして変更したい文字を選択し右クリックでメニューを出してペーストを選択すればコードの変更はできたので、最初は「そういう仕様」なのかと思って使っていました。
「誤ってコードを打ち損じたりしないからこういう仕様なのかな? プログラマーってこんなに不便なアプリで仕事してるのかー」と関心してたのですが、どうやら違うようで、こちらに対処法がありました。
これでフツーに使えます。いやあこれでホッとしました。
これもちゃっぴー(ChatGPT)あってのことです。
他にもホームページ製作をちゃっぴーに聞きながらDreamweaverで進めているところです。
これもちゃっぴー無しではどうにもなりませんでした。
例えば、Whisperで会議を文字起こしすると4万文字とかになってしまいますので、長すぎてチャッピーでは要約できません。
Whisperの使用方法についてはこちらを参照。
またはMac用アプリ「Whisper Transcription」を使う方法もあります。
2000文字ずつに分割してチャッピーに入れて要約することを20回繰り返せば4万文字になりますが、面倒臭すぎます。
そこでチャッピーに聞いたら
「Python使ってできるよ!」というので、
見よう見まねで、VSCodeでPythonを走らせてみると、長文文字起こしテキストファイルを自動で分割してチャッピー(OpenAIのAPI)で要約してサマリーを作ってくれました。
ただし、一発ではうまくいかなくて、
何度も何度も繰り返しチャッピーに聞きながらやりました。
できた。しかし!
結果、Whisper, VSCode+Python+OpenAI APIの自動議事録サマリーより、
私が印象で「会議3行まとめ」を書いた方が精度が良かったです(笑)
理由は、セミナー的なきっちりしてる会議ならAIでもいいのかもだけど、
世間話混じりの自由度の高い雑談からアイデアを絞っていくタイプの会議の場合だと要点がどこかAIには分からないからでしょう。
雑談には人間関係の歴史が文脈として含まれていますし、何を共通としてるかの暗黙的な了解もあります。
文字起こしテキストだけでは暗黙の文脈までは汲み取れず、AI自動要約ではどこがキモだったのか理解できないのでトンチンカンなサマリーになってしまう。
言葉のやり取りの端々から空気を読んで、暗黙知まで分かってくれることになればきっと本当にAGIなのでしょう。
そして、長文要約の試行錯誤でめっちゃトークン使ってしまったOpenAIのAPI料金だけが残りましたとさ。
めでたしめでたし
ということで、4万字とかのテキストファイルを自動で分割して要約するPythonコードを置いておきます。
- VSCodeを使います
- OpenAIのAPIキーを取得します
- 任意のフォルダー(例:Python)を作ります
- 文字起こしした会議のテキストファイル(例:会議01.txt)を「Python」フォルダーに入れます
- VSCodeを使って「Python」フォルダーを開き、Pythonファイル(例:summary.py)を作ります
- 「summary.py」に以下のコードを書きます (コードに「OpenAI APIキー」、要約したいテキストファイル「例:会議01.txt」、生成させたいサマリーテキストファイル「例:会議01_summary.txt」を入力します)
- VSCodeの右上にある実行アイコン▷を押します
- しばらくすると「会議01_summary.txt」が「Python」フォルダー内に生成されます。
以下Pythonコード
============================
import openai
import re
# ここでOpenAI APIキーを設定してください
openai.api_key = "ここにOpenAI APIキーを設定してください"
def summarize_text(text):
response = openai.Completion.create(
engine="text-davinci-003",
prompt="Please provide a coherent and concise summary of the following text: " + text,
max_tokens=100,
n=1,
stop=None,
temperature=0.7,
)
summary = response.choices[0].text.strip()
# もし要約が途中で切れているようであれば、適切な句読点で修正します
if not re.match(r'[.!?]$', summary):
summary = re.sub(r'\W*$', '.', summary)
return summary
def split_text(file_path, chunk_size=2500):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return [content[i:i+chunk_size] for i in range(0, len(content), chunk_size)]
def generate_summary(input_file, output_file):
chunks = split_text(input_file)
summaries = []
for chunk in chunks:
summary = summarize_text(chunk)
summaries.append(summary)
with open(output_file, 'w', encoding='utf-8') as f:
f.write(" ".join(summaries))
# ここでテキストファイル名を入力してください
input_file = "テキストファイル名を入力してください(例:会議01.txt)"
output_file = "ここにサマリーとして出力したいテキストファイル名を入力してください(例:会議01_summary.txt)"
generate_summary(input_file, output_file)
============================
お役に立てたら幸いです。
最後までお読みいただき有り難うございました!
0 件のコメント:
コメントを投稿