◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Cowork
◈ Cowork/2026-06-23上級

無人の記事生成タスクが『ほぼ同じ記事』を二度書く前に止める重複検出ゲート

Cowork のスケジュールタスクで毎日記事を生成していると、無人ゆえに数日前と中身がほぼ重なる記事を作ってしまいます。公開直前に slug の類似度と当日ログを照合して重複を止めるゲートを、実際に誤公開を防いだ実装とともにお届けします。

Cowork46スケジュールタスク25重複検出自動化87Python22SEOコンテンツ運用

✦ プレミアム記事

今朝、Cowork のスケジュールタスクがプロンプトキャッシュの TTL を 5 分から 1 時間へ延ばす設計、という題材で記事を書き始めようとしていました。手が滑って公開していたら、半年前に出した claude-api-prompt-cache-5m-1h-two-tier-ttl-design とほぼ同じ内容が、別 URL でもう一本増えていたはずです。

無人で毎日記事を生成していて一番こわいのは、エラーで止まることではありません。エラーは止まればログに残り、翌日気づけます。本当にこわいのは、止まらずに「数日前と中身がほぼ重なる記事」を淡々と公開し続けることです。一本ずつ見れば破綻していないので、人間がレビューしない限り気づけません。そして Google から見れば、これは薄い記事を量産しているサイトの典型的な挙動です。

私はこの半年、4 サイトを無人のスケジュールタスクで回してきて、この「静かな重複」が検索評価をじわじわ削る最大の要因だと感じています。今日はその対策として、記事を公開する前に slug の近さと当日ログを照合し、重複しそうなら公開を止めるゲートの作り方を、実際に動いているコードでお伝えします。

なぜ「件数チェック」だけでは重複を防げないのか

多くの自動投稿パイプラインは、push 直前に日本語版と英語版の件数一致を確認します。これは 404 を防ぐためには必須ですが、重複検出には何の役にも立ちません。件数が揃っていても、中身が数日前と重なっていれば、それは「正しく数えられた重複記事」が一本増えるだけです。

タイトルの完全一致チェックも役に立ちません。無人タスクは毎回少しずつ違う言い回しでタイトルを作るので、「プロンプトキャッシュの TTL 設計」と「キャッシュ有効期限を延ばすコスト設計」は文字列としては一致せず、すり抜けます。

重複を捉えるには、表記ではなく「その記事がどの概念について書いているか」を比較する必要があります。そして幸い、私たちは概念を要約した短い文字列をすでに持っています。slug です。slug はハイフン区切りの英単語列で、記事の主題語がそのまま並んでいます。これをトークンの集合として比較すれば、表記ゆれに強い重複判定ができます。

slug をトークン集合にして Jaccard 類似度で測る

考え方はシンプルです。候補記事の slug と既存記事の slug をそれぞれハイフンで分割し、単語の集合にします。二つの集合がどれだけ重なっているかを Jaccard 係数(積集合のサイズ ÷ 和集合のサイズ)で測り、しきい値を超えたら「同一概念の疑いあり」と判定します。

#!/usr/bin/env python3
"""dup_gate.py — 候補 slug が既存記事と概念的に重複していないか検査する。
使い方:
  python3 dup_gate.py <repo> <category> <candidate-slug>
終了コード:
  0  重複なし(公開してよい)
  1  重複の疑いあり(角度を変えるか加筆昇格に切り替える)
"""
import sys
from pathlib import Path
 
# slug を主題語の集合に変換する。ノイズ語は主題ではないので落とす。
STOPWORDS = {
    "claude", "api", "sdk", "cli", "guide", "the", "a", "to", "for",
    "with", "and", "of", "in", "on", "how", "your", "cowork",
}
 
def slug_tokens(slug: str) -> set:
    parts = [p for p in slug.lower().split("-") if p]
    return {p for p in parts if p not in STOPWORDS and len(p) > 1}
 
def jaccard(a: set, b: set) -> float:
    if not a or not b:
        return 0.0
    return len(a & b) / len(a | b)
 
def main():
    repo, category, candidate = sys.argv[1], sys.argv[2], sys.argv[3]
    cand = slug_tokens(candidate)
    ja_dir = Path(repo) / "content" / "articles" / "ja" / category
    hits = []
    for mdx in ja_dir.glob("*.mdx"):
        existing = mdx.stem
        if existing == candidate:
            continue
        score = jaccard(cand, slug_tokens(existing))
        if score >= 0.5:
            hits.append((score, existing))
    hits.sort(reverse=True)
    if hits:
        print(f"❌ 重複の疑い: {candidate}")
        for score, existing in hits[:5]:
            print(f"   {score:.2f}  {existing}")
        sys.exit(1)
    print(f"✅ 重複なし: {candidate}")
    sys.exit(0)
 
if __name__ == "__main__":
    main()

このスクリプトを今朝の例で動かすと、候補 claude-api-prompt-cache-ttl-5m-to-1h-refresh-design に対して、既存の claude-api-prompt-cache-5m-1h-two-tier-ttl-design が 0.62 で引っかかります。共通トークンは prompt, cache, 5m, 1h, ttl, design の 6 語で、和集合は 10 語前後。表記は違うのに、概念は明確に重なっていることが数値で出ます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦既存 slug をトークン分解して Jaccard 類似度を測り、しきい値で『同一概念の記事』を公開前に弾く Python ゲートの実装
✦当日ログと近接 slug を二段で照合し、誤検出と見逃しのどちらにも倒れないしきい値(0.5 前後)の決め方
✦重複を検出したあとの分岐 — 別角度へ振り直すか、既存記事の加筆昇格に切り替えるかの判断基準
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ Cowork2026-09-18
Cowork と Claude Code のどちらに置くかを、承認の挟まり方で決めています
同じ Claude が動く Cowork と Claude Code を、機能の比較ではなく「途中で人の承認が挟まってよいか」で置き分けている基準と、無人の面に残す書き方を実例つきでお伝えします。
◈ Cowork2026-09-16
定期タスクが動く日と動かない日があったのは、フォルダを1つ指定していたからでした
Cowork の定期タスクは既定でリモート実行ですが、手元のファイルやアプリを必要とした瞬間に端末実行へ切り替わります。作成画面の最後の一項目が実行場所を決めている仕組みと、タスクを作る前に決めておきたい三つの問いを書き残します。
◈ Cowork2026-10-15
一覧には見えているのに、名前で探すと0件——日本語ファイル名の「濁点が分かれている」問題を数えました
Cowork に渡した作業フォルダで、日本語名のファイルが名前検索に当たらない。約1.9万件を数えると、濁点・半濁点が分かれた名前が17件ありました。数え方と直し方を書き残します。