0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第3回:CodexでWordPress記事100本のカテゴリー分類案を作る|Codex CLIとWordPress REST APIで記事整理自動化

0
Posted at

CodexでWordPress記事100本のカテゴリー分類案を作る

はじめに

前回は、WordPress REST APIを使って、既存記事をCSVにエクスポートしました。

作成したファイルは以下です。

data/posts_export.csv
data/posts_export.json

このCSVには、WordPressの記事ごとに以下のような情報が入っています。

post_id
title
slug
date
status
link
excerpt_text
content_text
categories
tags

ここまでできると、WordPressの記事を管理画面で1件ずつ見るのではなく、手元のCSVとして扱えるようになります。

今回は、この posts_export.csv をもとに、記事100本のカテゴリー分類案を作ります。

やりたいことは、以下です。

WordPress記事100本
↓
Codexで分類案を作る
↓
categorized_posts.csv を出力する
↓
人間がCSVを見直す
↓
次回、WordPressに反映する

今回も、WordPress側はまだ更新しません。

あくまで、カテゴリー分類案のCSVを作るだけです。

なぜカテゴリー分類を自動化したかったのか

WordPressの記事が100本くらいになると、カテゴリー整理がかなり大変になります。

管理画面から1記事ずつ開いて、

この記事は旅行記?
これはマイル?
これはクレカ?
これは思想系?
タグは何をつける?

と考えていくと、それだけでかなり時間がかかります。

しかも、記事が増えるほど分類がブレます。

最初の頃は「マイル」に入れていた記事でも、あとから見ると「旅の設計」の方が近かったりします。

逆に、旅行記に見える記事でも、実際には旅程の組み方や家族との時間設計が主題だったりします。

つまり、単純なキーワードだけでは分類しきれません。

ただ、人間が100本すべてをゼロから分類するのも大変です。

そこで今回は、Codexに分類案を作ってもらい、人間はそれを見直す形にしました。

方針:完全自動ではなく、分類案を作る

最初に決めた方針はこれです。

AIに最終決定させない
AIにたたき台を作らせる
人間がCSVで見直す
WordPress反映は次の工程に分ける

これはかなり大事だと思っています。

AIに「全部いい感じに分類して反映して」と頼むと、確かに楽そうです。

でも、カテゴリーはサイトの構造そのものです。

読者がどの入口から記事に入るか、どの本棚に置くかを決める作業なので、完全自動にするのは少し怖いです。

そのため、今回はまず categorized_posts.csv という分類案ファイルを作るところまでにしました。

カテゴリーを7つに絞る

まず、WordPress側で使うカテゴリーを決めました。

今回は以下の7カテゴリにしました。

旅の設計
ポイント・マイルをためる
旅行記
クレカ・保険
通信・スマホ
家族・暮らしのデザイン
思考のデザイン

カテゴリーは増やしすぎない方針です。

100記事くらいであれば、カテゴリーは7個前後にして、細かいテーマはタグで扱う方が見通しがよいと考えました。

たとえば、以下のような考え方です。

カテゴリー:旅の設計
タグ:ANAマイル / スターアライアンス / ストップオーバー / 台湾

カテゴリー:ポイント・マイルをためる
タグ:楽天証券 / 楽天キャッシュ / ANA Pay / 楽天Edy

カテゴリー:通信・スマホ
タグ:JALモバイル / IIJmio / ahamo / povo

カテゴリーは本棚、タグは付箋、というイメージです。

7カテゴリの役割

今回のカテゴリーは、以下のように考えました。

旅の設計

旅程をどう組むか、マイルをどう使うか、どのルートを選ぶか、という記事です。

たとえば以下のような内容です。

ANA特典航空券
JALどこかにマイル
どこかにビューーン!
スターアライアンス
ストップオーバー
特典航空券のルート設計

実際に行った旅行記というより、旅の組み立て方が主役の記事をここに入れます。

ポイント・マイルをためる

マイルやポイントの原資づくりに関する記事です。

楽天証券
楽天キャッシュ
ANA Pay
楽天Edy
ポイントサイト
Vポイント
JALマイル
ANAマイル

旅に出るための燃料を作る話です。

旅行記

実際に行った旅の記録です。

福岡日帰り
沖縄日帰り
香港ディズニー日帰り
韓国旅行
初島旅行
松山旅行

行った場所や体験が主役の場合は、ここに入れます。

クレカ・保険

クレジットカード、旅行保険、空港サービス、決済まわりの記事です。

クレジットカード
海外旅行保険
カード付帯保険
ラウンジ
空港サービス
手荷物宅配
海外決済

マイルを貯めるカードの話は「ポイント・マイルをためる」と迷いますが、保険やサービス設計が主役ならこちらにします。

通信・スマホ

スマホ回線、eSIM、子どもスマホ、JALモバイルなどです。

JALモバイル
IIJmio
ahamo
povo
eSIM
子どもスマホ

旅そのものではなく、通信環境やスマホ運用が主役の記事です。

家族・暮らしのデザイン

家族旅行、子どもとの体験、介護帰省割引、暮らしの設計に関する記事です。

子どもとの旅
家族旅行
介護帰省割引
暮らしの工夫
親との旅行

単なる旅行記ではなく、家族や暮らしの文脈が中心の記事を入れます。

思考のデザイン

旅やマイルを通じて考えたこと、価値観、体験利回り、人生設計寄りの記事です。

体験利回り
旅の価値
マイルの意味
旅行は投資
思考メモ

ノウハウではなく、考え方そのものが主役の記事です。

分類ルールをCodexに渡す

次に、Codexに分類スクリプトを作ってもらいます。

作成するファイルは以下です。

scripts/classify_posts.py

Codexには、以下のように指示しました。

data/posts_export.csv を読み、記事ごとのカテゴリー分類案を作る scripts/classify_posts.py を実装してください。

分類カテゴリーは以下に限定してください。

- 旅の設計
- ポイント・マイルをためる
- 旅行記
- クレカ・保険
- 通信・スマホ
- 家族・暮らしのデザイン
- 思考のデザイン

ルール:
- main_category は必ず1つ
- sub_category は空欄でもよい
- tags は3〜8個
- confidence は high, medium, low のいずれか
- reason は判断理由を短く書く
- 分類に迷う記事は confidence を low にする
- title, excerpt_text, content_text を見て判断する
- 出力は data/categorized_posts.csv
- タグの区切りは | にする

CSV列:
post_id,title,slug,main_category,sub_category,tags,confidence,reason

まずは --limit 20 で20件だけ分類できるようにしてください。
--all で全件分類できるようにしてください。

この時点でも、WordPress APIは叩きません。

入力は data/posts_export.csv、出力は data/categorized_posts.csv だけです。

出力CSVの形式

出力するCSVの列は以下にしました。

post_id
title
slug
main_category
sub_category
tags
confidence
reason

それぞれの役割は以下です。

post_id

WordPressの投稿IDです。

次回、カテゴリーやタグをWordPressへ反映するときに使います。

title

記事タイトルです。

人間がCSVを確認するときに必要です。

slug

現在のslugです。

slug整理の参考にもなります。

main_category

今回決めたいメインカテゴリーです。

必ず7カテゴリのどれかにします。

sub_category

サブカテゴリー候補です。

今回はWordPress上のサブカテゴリーとしては使わず、参考情報として残す程度にしました。

tags

タグ候補です。

複数タグを扱うため、区切り文字は | にしました。

ANAマイル|スターアライアンス|ストップオーバー

confidence

分類の確信度です。

high
medium
low

の3段階にしました。

分類に迷う記事は low にします。

reason

なぜそのカテゴリーにしたかの簡単な理由です。

たとえば、以下のようなイメージです。

ANA特典航空券とルート設計が中心のため
実際の福岡日帰り体験が主題のため
JALモバイルの回線運用が中心のため

まず20件だけ分類する

いきなり全件分類する前に、まず20件だけ実行します。

python scripts/classify_posts.py --limit 20

出力ファイルを確認します。

ls -lh data/categorized_posts.csv

中身を軽く確認します。

python - <<'PY'
import pandas as pd

df = pd.read_csv("data/categorized_posts.csv")
print(df.head())
print(df["main_category"].value_counts())
print(df["confidence"].value_counts())
PY

ここで見るポイントは以下です。

- main_category が7カテゴリのどれかになっているか
- tags が3〜8個くらいになっているか
- confidence が入っているか
- reason が極端に長すぎないか
- 明らかに変な分類がないか

20件の分類を見て、大きくズレていなければ全件に進みます。

全件分類する

20件で問題なければ、全件分類します。

python scripts/classify_posts.py --all

件数を確認します。

python - <<'PY'
import pandas as pd

src = pd.read_csv("data/posts_export.csv")
cat = pd.read_csv("data/categorized_posts.csv")

print(f"posts_export.csv: {len(src)}件")
print(f"categorized_posts.csv: {len(cat)}件")
print(f"差分: {len(src) - len(cat)}件")
print()
print(cat["main_category"].value_counts())
print()
print(cat["confidence"].value_counts())
PY

posts_export.csvcategorized_posts.csv の件数が合っていればOKです。

confidence=low を中心に見直す

全件分類したあと、すべてをゼロから見直すと大変です。

そこで、まず confidence=low の記事だけ確認します。

python - <<'PY'
import pandas as pd

df = pd.read_csv("data/categorized_posts.csv")
low = df[df["confidence"] == "low"]

print(f"confidence=low: {len(low)}件")
print(low[["post_id", "title", "main_category", "tags", "reason"]].to_string(index=False))
PY

このやり方がかなり便利でした。

100記事すべてを人間が最初から分類するのではなく、Codexにたたき台を作らせて、怪しいところだけ人間が見る。

これでかなり作業量が減ります。

分類で迷いやすかった記事

実際に分類してみると、迷いやすい記事がありました。

たとえば、JALモバイルの記事です。

JALモバイルはスマホ回線なので、普通に考えると「通信・スマホ」です。

ただ、記事によっては、JALモバイルの回線そのものよりも、どこかにマイルやマイル獲得の入口として扱っている場合があります。

その場合は、「ポイント・マイルをためる」や「旅の設計」に近い場合もあります。

同じテーマでも、記事の主役によってカテゴリーが変わります。

JALモバイルの開通手順
→ 通信・スマホ

JALモバイルでどこかにマイルを安く使う
→ 旅の設計 or ポイント・マイルをためる

子ども用回線としてJALモバイルを使う
→ 家族・暮らしのデザイン or 通信・スマホ

このあたりは、キーワードだけでは決めきれません。

読者が何を期待して読むかで決める

分類で迷ったときは、以下のルールにしました。

記事の書き手側の都合ではなく、
読者が何を期待してその記事を読むかで決める

たとえば、記事の中に「ANAマイル」という単語が出ていても、実際の主題が旅行記なら「旅行記」にします。

逆に、旅行の話が出てきても、主題が旅程設計なら「旅の設計」にします。

この考え方をCodexへの指示にも入れると、分類が安定しやすくなります。

追加するなら、以下の一文です。

分類に迷う場合は、記事の「読者が何を期待して読むか」を優先して main_category を決めてください。

カテゴリーは、書き手の整理棚であると同時に、読者の入口でもあります。

タグは細かくしてよい

カテゴリーは7つに絞りましたが、タグはある程度細かくしてよいと考えました。

たとえば、カテゴリーが「ポイント・マイルをためる」でも、タグでは以下のように分けられます。

楽天証券
楽天キャッシュ
ANA Pay
楽天Edy
Vポイント
JALマイル
ANAマイル
ポイントサイト

カテゴリーを増やしすぎるとサイト全体が見づらくなりますが、タグなら細かいテーマを拾いやすくなります。

ただし、タグも無限に増やすと混乱します。

そのため、1記事あたりのタグは3〜8個にしました。

CSVを人間が見直す

分類が終わったら、data/categorized_posts.csv を開いて人間が見直します。

見直すポイントは以下です。

- main_category が適切か
- タグが多すぎないか
- タグの表記ゆれがないか
- confidence=low の記事が納得できるか
- reason が分類理由として自然か

表記ゆれは特に注意です。

たとえば、以下のようなゆれが出ることがあります。

ANAマイル
ANA
ana-mile

JALモバイル
JAL Mobile
jal-mobile

どこかにマイル
どこマイ

最終的にWordPressへ反映する前に、CSV上でそろえておきます。

この段階でもWordPressは更新しない

今回作ったのは、あくまで分類案CSVです。

WordPress側にはまだ何も反映していません。

ここが大事です。

今回の流れは以下です。

posts_export.csv
↓
classify_posts.py
↓
categorized_posts.csv
↓
人間が確認
↓
次回、WordPressへ反映

AIに分類してもらうことと、WordPressに反映することを分けています。

これにより、分類ミスがあっても、WordPress本体には影響しません。

今回できたこと

今回できたことは以下です。

- WordPress記事100本の分類用CSVを作った
- 7カテゴリに分類する方針を決めた
- classify_posts.py を作った
- categorized_posts.csv を出力した
- confidence を付けた
- low の記事を中心に人間が見直せるようにした
- カテゴリーとタグを分けて考えられるようにした

ここまでできると、WordPressの記事整理はかなり進みます。

管理画面で1記事ずつ考えるのではなく、CSV上で記事群を見ながら分類できるようになりました。

次回

次回は、見直し済みの categorized_posts.csv を使って、WordPressにカテゴリー・タグを反映します。

やることは以下です。

- WordPress側にカテゴリー・タグを作成する
- 既存カテゴリー・タグがあれば再利用する
- 投稿にカテゴリー・タグを反映する
- dry-runで確認する
- --limit 5 で5件だけテストする
- 問題なければ全件反映する
- slugも25文字以内に整理する

いよいよ次回は、WordPress本体に変更を入れます。

ここからは便利さだけでなく、安全設計がかなり重要になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?