GPT4の力でブログのタグ付けを自動化 このブログは1つの記事に1つのカテゴリーと1~4個のタグを付けている。 この記事の場合は、
カテゴリー:
タグ:
タグ付けは雑であり自分でも把握できていない。 大体過去の似た記事からタグをコピーして使いまわしている。
カテゴリーに関しては過去の100以上のブログ記事のすべてが「software」。 漫画の記事も羊毛フェルトの記事も全て「software」。
ここで、言語処理に強いOpenAIのAPIを使うことでブログのタグ付けカテゴリー付けを自動化できるのではないかと考えた。
1. 結果 中身を貼ったところで誰も興味ないのでスクショで済ませる。
思った以上に良い感じだ。 これは記事を書いた本人にしか分からないがちゃんとそれらしいタグを付けてくれている。
実際のタグ付けまで自動でやらせるのは心配なので、 今後はこの表を見ながら手動でタグを追加していくと良さそう。
2. コード Pythonで書いた。 OpenAIのAPIを持ってて、かつGPT4が使える前提。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import openai import os import glob import csv import time # OpenAI APIキーの設定 openai.api_key = os.getenv("OPENAI_API_KEY") # タグ予測関数 def suggest_tag_categories(blog_article): # チャットモデルの初期化(タグ予測) chat_models_suggest = openai.ChatCompletion.create( model="gpt-4", messages=[ { "role": "system", "content": ( "You are a helpful assistant. " "Your task is to analyze a blog article and " "suggest an appropriate category (only one) and multiple tags. " "***The output should be in the format 'category:〇\ntags:〇,〇,...\n'***" ) }, { "role": "user", "content": blog_article } ] ) # レスポンスからタグとカテゴリーを取得 response = chat_models_suggest["choices"][0]["message"]["content"] return response # ブログ記事の読み込み # 指定されたフォルダ内のすべてのマークダウンファイルのリストを取得 md_dir_path = "フォルダ名\\*.md" md_files = glob.glob(md_dir_path) # 結果を保持するリスト results = [] md_file_path = md_files[0] for md_file_path in md_files: with open(md_file_path, "r", encoding="utf-8") as file: blog_article = file.read() # レスポンスを取得 response = suggest_tag_categories(blog_article[:5000] ) time.sleep(30) # APIのレート制限を避けるためのスリープ # ファイル名のみ表示 filename = md_file_path.split("\\")[-1] print(f"filename: {filename}") # レスポンスをパースする suggest_category, suggest_tags = response.split("\n") # 結果をリストに追加 results.append({ "ファイル名": filename, "推薦カテゴリ": suggest_category.split(":")[1].strip(), "推薦タグ": suggest_tags.split(":")[1].strip() }) # CSVファイルを開く with open("output.csv", "w", newline="", encoding="utf-8") as csvfile: fieldnames = ["ファイル名", "推薦カテゴリ", "推薦タグ"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # CSVのヘッダーを書き込む writer.writeheader() # リストの内容をCSVに書き込む for result in results: writer.writerow(result)
プロンプトは英語の方が性能が良くなりがちなのでChatGPTに英語で書いてもらった。
OpenAIのChatAPIの制限によって1分間に10000トークンまでしか扱えないので以下の処理で乗り切った
各記事のはじめの5000文字までを切り取る
1処理につき30秒のスリープ