Claude Media
Claude Codeで翻訳見積りのワード数と繰り返し率を数える手順

Claude Codeで翻訳見積りのワード数と繰り返し率を数える手順

原稿ファイルのワード数と、完全一致・類似文の繰り返し率をスクリプトで数え、翻訳見積りの根拠表にするまでの手順です。Claude Codeには書かせて実行させ、数字は読ませません。

翻訳見積りの数字をClaude Codeに数えさせるときの分担

翻訳の見積りに要るのは、原稿の総ワード数と、そのうち何割が「すでに訳した文の繰り返し」かの2つです。Claude Codeでは、この2つを数えるスクリプトを書かせ、手元で実行させます。数字そのものは、スクリプトが出した値だけを使います。

分担ははっきりしています。数える処理はスクリプトの仕事です。Claude Codeの仕事は、スクリプトを書くこと、実行すること、出力を見積りの根拠表に整えることです。原稿を貼って「何ワードですか」と聞く使い方とは違い、同じ原稿なら何度実行しても同じ値になります。

公式の概要ページは、Claude Codeをclaude -pでパイプやCIに組み込める道具として紹介しています。例の1つが、claude -p "translate new strings into French and raise a PR for review"という翻訳の自動化です。本記事はその前段、訳す前に分量を測る工程を扱います。

先に決めておくこと

  • 原稿は.mdか.txtのファイルで、1つのフォルダに置く
  • 数える単位は「ワード」と「文(セグメント)」の2つにする
  • 繰り返しは「完全一致」「類似」「新規」の3つに分ける
  • 類似とみなす閾値は自分で決め、見積書に書く

最後の閾値は特に重要です。翻訳メモリ(過去の訳文を蓄える仕組み)の一般的な解説では、完全一致でない照合を「ファジーマッチ」と呼び、0%より大きく100%未満の一致率を割り当てる製品があるとされます。ただし同じ解説に、一致率の数値はスコアの付け方が示されない限り製品間で比べられない、とあります。ここで作る数字も、翻訳支援ツールの分析結果とは別物です。

数えるスクリプトを用意する

count_words.pyは標準ライブラリだけで動きます。Claude Codeに書かせてもよいのですが、仕様を固定するために全文を載せます。仕様は4つです。コードブロックは対象外、英数字の語は1語、日本語の文字は1文字を1と数える、類似はdifflibの一致率で判定する。

#!/usr/bin/env python3
"""翻訳見積り用: ワード数と、文(セグメント)の繰り返し率を数える。"""
import csv, re, sys, difflib
from pathlib import Path
 
FUZZY = 0.85  # これ以上を「類似」とみなす
WORD = re.compile(r"[A-Za-z0-9]+(?:['’\-][A-Za-z0-9]+)*")
CJK = re.compile(r"[぀-ヿ㐀-鿿]")
 
def strip_noise(text):
    text = re.sub(r"```.*?```", "", text, flags=re.S)
    return re.sub(r"^#+\s*", "", text, flags=re.M)
 
def segments(text):
    for line in strip_noise(text).splitlines():
        for s in re.split(r"(?<=[.!?。!?])\s*", line.strip()):
            if s.strip():
                yield s.strip()
 
def norm(s):
    return re.sub(r"\s+", " ", s.lower()).strip()
 
rows, seen = [], []
for path in sorted(Path(sys.argv[1]).rglob("*")):
    if path.suffix not in {".md", ".txt"}:
        continue
    for seg in segments(path.read_text(encoding="utf-8")):
        n = norm(seg)
        words = len(WORD.findall(seg)) + len(CJK.findall(seg))
        if n in seen:
            kind, score = "exact", 1.0
        else:
            score = max((difflib.SequenceMatcher(None, n, p).ratio()
                         for p in seen), default=0.0)
            kind = "fuzzy" if score >= FUZZY else "new"
        if kind != "exact":
            seen.append(n)
        rows.append((path.name, seg, words, kind, round(score, 2)))
 
total = sum(r[2] for r in rows)
by = {k: sum(r[2] for r in rows if r[3] == k)
      for k in ("exact", "fuzzy", "new")}
print(f"files={len({r[0] for r in rows})} segments={len(rows)} words={total}")
for k, w in by.items():
    print(f"{k:5} {w:4} words {w / total:6.1%}")
with open("segments.csv", "w", newline="", encoding="utf-8") as f:
    csv.writer(f).writerows([("file", "segment", "words", "kind", "score"),
                             *rows])

先に出現した文を基準にして、後から出た文を繰り返しと数えます。最初の1回は「新規」、同じ文が2回目以降に出ると「完全一致」です。完全一致した文はseenに積みません。比較対象が増え続けないので、処理が少し軽くなります。

動作確認に使った小さな原稿

挙動を確かめるため、2ファイルの小さな英文マニュアルを用意しました。manual-a.mdは設定画面の案内を3回繰り返し、manual-b.mdはインストーラーの文を再利用します。Python 3.12.2で実行した結果は次のとおりです。

python3 -I count_words.py src
files=2 segments=20 words=102
exact   36 words  35.3%
fuzzy   14 words  13.7%
new     52 words  51.0%

102ワードのうち、完全一致が36ワード(35.3%)、類似が14ワード(13.7%)、新規が52ワード(51.0%)です。この数字だけで「半分は訳さなくてよい」と読むのは早計です。理由は次の節で述べます。

出力の読み方と、閾値で数字が動く場所

segments.csvを開くと、どの文が何と判定されたかが1行ずつ分かります。見積りの根拠表は、この行を示せるかどうかで説得力が変わります。サンプルでは、次の2行が判定の分かれ目でした。

文比較相手一致率判定
Click Save to apply the changes.比較相手Click Save to apply your changes.一致率0.89判定類似
Open the Settings screen.比較相手Open the Settings page.一致率0.83判定新規

2文とも、既出の文から単語を1つ変えただけです。それでも、後者は閾値0.85に届かず「新規」に入りました。短い文ほど1語の差が一致率に大きく響きます。閾値を0.80に下げれば後者も類似に入り、類似の割合は上がります。

落とし穴

閾値を変えると繰り返し率が変わり、見積額も変わる

閾値は見積りの前提条件です。数字だけを依頼元に渡すと、発注側が翻訳支援ツールの分析結果と照らしたときに食い違います。見積書には「文単位、一致率0.85以上を類似」のように、数え方を1行添えてください。

重みを掛けて「実質ワード数」にする

繰り返し率から金額を出すときは、区分ごとの単価の掛け率を使います。次の掛け率はこの記事の計算例のための仮の数字です。実際の値は、発注先や自社の料金表から取ってください。

区分ワード数掛け率(仮)実質ワード数
新規ワード数52掛け率(仮)1.0実質ワード数52.0
類似ワード数14掛け率(仮)0.5実質ワード数7.0
完全一致ワード数36掛け率(仮)0.2実質ワード数7.2
合計ワード数102掛け率(仮)実質ワード数66.2

この例なら、見積りの基準は102ワードではなく66.2ワードです。掛け率をClaude Codeに決めさせないでください。料金表に載っている値をそのまま渡し、計算だけを任せます。

Claude Codeに作業を任せる

ここからがClaude Codeの出番です。作業は2段階に分かれます。スクリプトの実行と根拠表の整形を一続きの指示にまとめ、権限は最小限にします。

CLAUDE.mdに数え方を書いておく

数え方がセッションごとに変わると、見積りの数字がぶれます。プロジェクトのルートにCLAUDE.mdを置き、方針を固定します。公式の概要ページによれば、CLAUDE.mdはセッションの開始時に毎回読まれるファイルです。

## 翻訳見積りの数え方
- ワード数・繰り返し率は `python3 count_words.py <原稿フォルダ>` の出力だけを使う
- 自分で原稿を読んで数えない。スクリプトを修正するときは、変更点と閾値を明記する
- 類似の閾値は 0.85。変更するときは理由を書く
- 出力は segments.csv と、区分別のワード数の表にする

対話で根拠表まで作らせる

対話セッションなら、次のように頼めます。スクリプトを書き直させるのでなく、実行して結果を整えさせる指示です。

src フォルダの原稿について、count_words.py を実行してください。
区分(新規・類似・完全一致)ごとのワード数と割合を表にし、
類似と判定された文を segments.csv から5件抜き出して、
比較相手と一致率を並べてください。数字はスクリプトの出力だけを使うこと。

非対話で同じ流れを再現する

原稿が更新されるたびに数え直すなら、claude -pが使えます。公式のヘッドレス実行ページによれば、非対話モードは標準入力を読めます。スクリプトの出力だけをパイプで渡すのが、権限を絞れる構成です。

python3 count_words.py src | claude --bare -p \
  "この集計を区分別の表と、閾値0.85と明記した注記にしてください"

公式は、スクリプトやSDKの呼び出しには--bareを推奨しています。--bareを付けると、フックやスキル、MCPサーバー、CLAUDE.mdなどの自動読み込みを飛ばして起動します。したがってこの構成では、CLAUDE.mdは読まれません。必要な条件は、プロンプトに直接書いてください。

スクリプトも走らせたいときは、許可するツールを--allowedToolsで列挙します。次の例は、Pythonの実行とファイルの読み取りだけを許可します。

claude -p "src を count_words.py で集計し、区分別の表にしてください" \
  --allowedTools "Read,Bash(python3 count_words.py *)"

公式の権限ページでは、Bash(npm run *)のようにワイルドカードを使ってコマンドを許可できます。Bashだけを許可するとあらゆるシェルコマンドが通るので、実行するスクリプトに絞った書き方のほうが安全です。また、ヘッドレス実行のページには、claude -pが許可のない呼び出しを拒否する場合があるとあります。v2.1.302以降で権限モードを指定しないclaude -pは、Manualモードで始まります。承認が要る呼び出しは、--allowedToolsなどで許可しない限り拒否されます。

分量とコストを見積りに載せる

--output-format jsonを付けると、応答にtotal_cost_usdが入ります。公式はこの値をクライアント側の推定として扱っており、実際の請求額とは異なる場合があります。見積りの作業原価の目安にするなら、数回実行して幅を見ておくのが安全です。モデルの呼び出し費用そのものを事前に測りたいときは、Token Count APIで日本語コンテンツの費用を事前に見積もる方法があります。

大きな原稿と日本語原稿で気をつけること

数字を翻訳支援ツールの分析と突き合わせる前に、このスクリプトの限界を知っておく必要があります。

注意点

このスクリプトの限界

  • 処理量は文数の2乗で増える

    各文を既出のすべての文と比べます。数万文を超える原稿では、実行時間が目に見えて伸びます。

  • 日本語の数え方は1つに決まらない

    このスクリプトは日本語の文字を1文字1ワードと数えます。この数え方は筆者の選択で、発注先の規則と一致する保証はありません。

  • 文の区切りが粗い

    句点と英文のピリオドで切るだけです。略語のピリオド(e.g.など)や箇条書きの途中で、区切りがずれることがあります。

  • 書式の違いは見ない

    正規化は小文字化と空白の整理だけです。太字や番号の違いは別の文として扱われます。

翻訳メモリの一般的な解説によれば、技術マニュアルのように反復の多い文書は翻訳メモリが効きやすく、マーケティング文書や創作は向かないとされます。つまり、繰り返し率が高く出る原稿は、設定画面の手順書や取扱説明書のような文書だと予想できます。

原稿が大きいときの代替

標準入力は10MBが上限で、超えるとエラーで終了します。公式は、大きな入力はファイルに書き出してパスを指定するよう案内しています。上のスクリプトはフォルダを読む作りなので、この制約には当たりません。ただし、集計結果のsegments.csvをそのまま渡すと大きくなりやすいので、区分別の合計だけをパイプで渡してください。

見積書に添える根拠表の書き方

根拠表は、依頼元が数字を再現できる形にします。次の5項目があれば、第三者が検算できます。

  1. 対象ファイルの一覧と、更新日付
  2. 数え方(ワードの定義、文の区切り、閾値)
  3. 区分別のワード数と割合
  4. 掛け率とその出典(自社の料金表など)
  5. 類似と判定した文の例と、その一致率

segments.csvをそのまま添付すれば、3と5は満たせます。Claude Codeに頼むのは、1と2の下書き、そして全体の体裁の整えです。

翻訳そのものの精度の確認と用語集の扱いは、Claude翻訳の精度を検証してから確定するワークフローにあります。翻訳会社への発注をMCPで行う場合は、ClaudeとLILTを連携する方法が手順を扱っています。非対話実行の権限まわりは、claude -pオプションの解説で確認できます。

まとめ

見積りの数字は、スクリプトの出力だけから取ります。Claude Codeは、スクリプトの作成と実行、そして結果の整形に使います。閾値と数え方を見積書に書いておけば、翻訳支援ツールの分析結果と食い違ったときも、理由を説明できます。

最初の1回は、手元の小さな原稿でsegments.csvを開き、類似と判定された文を目で確かめてください。閾値が妥当かどうかは、そこで分かります。

この記事を共有:XはてブLinkedIn