Claudeで翻訳の用語集を作成 — 原稿から候補を抜きTBXとCSVに書き出す
原稿から頻出語と固有名詞を拾い、訳語と使わない訳を人が決め、CSVとTBXの用語集ファイルにする手順です。TBXへの変換スクリプトと検証結果つき。
翻訳用語集は、原稿の中から「同じ訳でそろえたい語」を拾い、訳語を1つに決め、機械が読める形で保存すれば完成します。拾う作業はClaudeが速く、決める作業は人が持つのが筋です。この記事では、候補の抽出、訳語と使わない訳の決定、CSVとTBXへの書き出しまでを順に説明します。
TBX(TermBase eXchange)は、用語データベースの内容を別のツールへ渡すための国際規格(ISO 30042)の形式です。CSVだけでも運用はできますが、翻訳支援ツールに取り込みたい場面ではTBXが求められます。
用語集ができるまでの4段階
- 1
候補を抜く
原稿をClaudeに渡し、頻出語・固有名詞・社内用語をCSVで出させます。
- 2
人が決める
訳語、許容する訳、使わない訳を決めます。ここはClaudeに任せません。
- 3
CSVに整える
1語1行の形式にそろえ、状態の値を決まった語彙に限ります。
- 4
TBXに変換して検証する
スクリプトで書き出し、スキーマで形式の誤りを確かめます。
作った用語集を翻訳に効かせる側の手順は、Claudeで英文プレスリリースを翻訳するとClaudeとDeepLを連携する方法にあります。
先に用語集CSVの列を決める
最初にゴールの形を決めます。候補を抜く指示も、変換のスクリプトも、この列に合わせて書くためです。
次の表は、この記事で使う列です。1行が1つの語で、同じ意味の語は同じconcept_idを持ちます。
| 列 | 中身 | 例 |
|---|---|---|
| concept_id | 中身同じ概念の語をまとめる番号 | 例c002 |
| lang | 中身言語コード | 例ja / en |
| term | 中身語そのもの | 例承認フロー |
| status | 中身推奨・許容・使用禁止のいずれか | 例preferredTerm |
| pos | 中身品詞(任意) | 例noun |
| definition | 中身定義(原稿に根拠があるときだけ) | 例申請を決裁者へ順に回す手順 |
| note | 中身使い分けの条件 | 例社内向け資料では可 |
statusの値は3つに絞ります。
preferredTerm: 訳語として固定する語admittedTerm: 文脈によって使ってよい語deprecatedTerm: 使わない語
この3つは、TBX-BasicのサンプルファイルがadministrativeStatusに使っている値(preferredTerm-admn-stsなど)に対応させるためです。サンプルにはsupersededTerm-admn-stsもありますが、翻訳の現場では「使わない」で足りるため、この記事では扱いません。
「使わない訳」を行として持つのが、用語集と単なる対訳表の違いです。term listのような別の訳が出ないようにするには、禁止したい語をdeprecatedTermとして書いておきます。
原稿を渡して候補を抜かせる
原稿はチャットに添付するか、Projectのファイルに置きます。対応するのはPDF、DOCX、CSV、TXT、HTML、JSONなどの文書形式です。チャットに添付するなら1回の会話で20ファイルまで、Projectに置くなら1ファイル30MBまでです。
Projectを使うと、原稿が複数回に分かれても同じ用語集を育てやすくなります。Projectは、会話の履歴とナレッジベースを持つ独立した作業場所です。ここに原稿と、作りかけの用語集CSVを置いておきます。
原稿の中の画像は読み取られません。非PDF文書からは文字だけが抽出されるため、図の中の用語は候補から漏れます。図表の語が重要な原稿では、図中の語を本文に書き起こしてから渡してください。
候補を出させる指示の例
次のような指示を出すと、決める作業に必要な材料がそろいます。例として示す文面なので、原稿の種類に合わせて直してください。
添付した原稿から、訳語をそろえたい語の候補をCSVで出してください。
対象は、頻出語、固有名詞、社内用語、略語です。
列: candidate_id, kind, ja_variants, count, context, en_candidates, note
- ja_variants: 原稿内の表記ゆれを「/」で区切って全部書く
- count: コードを実行して数える。推測で書かない
- context: 初出の一文をそのまま引用する
- en_candidates: 訳語の案を最大3つ。決定はしない
- note: 同音異義や訳し分けが要りそうな点
原稿に書かれていない定義や意味を補わないでください。指示のポイントは3つあります。
1つ目は、出現回数をコードで数えさせることです。数え上げをClaudeの推測に任せると、回数がずれます。コードの実行とファイル作成は、Free・Pro・Maxでは、SettingsのCapabilitiesで「Code execution and file creation」がオンか確かめます。TeamとEnterpriseは既定でオンですが、組織のオーナーがオフにしている場合は使えません。
2つ目は、ja_variantsに表記ゆれを全部書かせることです。「承認フロー」「承認ワークフロー」「承認の流れ」が同じ概念なら、1行にまとめて出てきます。どれを残すかは次の段階で決めます。
3つ目は、en_candidatesを「案」にとどめることです。ここで訳が決まってしまうと、人が選ぶ余地がなくなります。
候補の返り方の例
返ってくるCSVは、たとえば次のような行になります。
| kind | ja_variants | count | en_candidates | note |
|---|---|---|---|---|
| 社内用語 | ja_variants承認フロー / 承認ワークフロー | count14 | en_candidatesapproval workflow / approval flow | note表記ゆれあり |
| 略語 | ja_variants稟議 | count6 | en_candidatesringi / internal approval | note直訳しにくい |
| 固有名詞 | ja_variants○○支店 | count9 | en_candidates○○ Branch | note地名の表記規則に依存 |
数字は、元になる原稿で本当に数えた値かどうかを必ず1行だけ照合します。コードを実行させたのに回数が極端に少ないときは、抽出された本文の改行や空白で語が分かれていないか、数えたコードを見せてもらって確かめます。
訳語と使わない訳は人が決める
候補が出たら、各行について「固定する訳」「許容する訳」「使わない訳」を人が決めます。Claudeにここまで決めさせると、もっともらしい訳が並ぶだけで、会社や媒体の事情が入りません。
判断に使う軸は次の3つです。
- 読む相手は誰か。社内向けなら許容する訳が増え、対外向けなら固定を厳しくします。
- 過去の公開物と合っているか。すでに公開した文書で使っている訳は、変えると読者が混乱します。
- 辞書的な訳より、検索や慣習で通じるか。
決めた結果は、Claudeにそのまま渡して長形式のCSVに直させます。
候補の1行を、用語集の3行にする
候補CSVの1行
承認フロー / 承認ワークフロー、count 14、案はapproval workflowとapproval flow
決定後の用語集CSV
c002のjaに承認フロー(推奨)。enにapproval workflow(推奨)、approval flow(許容。社内向け資料のみ)
その際の指示は、表記を変えさせないことが肝心です。
次の決定表をもとに、glossary.csv を作ってください。
列: concept_id, lang, term, status, pos, definition, note
- 私が書いた語は一字も変えない
- statusは preferredTerm / admittedTerm / deprecatedTerm の3つだけ
- definitionは、私が書いたものだけを入れる。空欄のままにする
- 同じ意味の語は同じconcept_idにするdefinitionを空欄で残させるのは、Claudeが定義をもっともらしく補うのを避けるためです。定義が必要な語は、原稿の中の説明をそのまま入れます。
次のCSVが、この記事で変換に使うglossary.csvです(ヘッダ行と2概念6行)。c002には、使わない訳としてterm listを入れています。
concept_id,lang,term,status,pos,definition,note
c001,ja,見積書,preferredTerm,noun,,
c001,en,quotation,preferredTerm,noun,,
c002,ja,承認フロー,preferredTerm,noun,,
c002,en,approval workflow,preferredTerm,noun,,
c002,en,approval flow,admittedTerm,noun,,社内向け資料のみ
c002,en,term list,deprecatedTerm,noun,,使用しない落とし穴
同じ語が別の概念になっているのに1行にまとめてしまう
「ライン」が製造ラインとLINEアプリの両方で出る原稿では、日本語の見た目が同じでも概念が別です。concept_idを分け、noteに「製造ライン」「連絡アプリ」と書いておきます。concept_idが同じだと、訳語が混ざります。
CSVをTBXに書き出す
CSVが整ったら、TBXに変換します。変換はClaudeに「TBXにして」と頼む方法もありますが、毎回同じ構造で出す必要があるので、スクリプトにして実行させるほうが安定します。ここでは、Pythonの標準ライブラリだけで動くスクリプトを使います。
出力は、TBX-Basicを前提にした最小の構造です。ルート要素はtbxで、conceptEntryの下に言語ごとのlangSecがあり、その下にtermSecとtermが並びます。状態はtermNoteのadministrativeStatusに入れます。
csv2tbx.py の全文
import csv, sys
from collections import OrderedDict
from xml.sax.saxutils import escape
STATUS = {
"preferredTerm": "preferredTerm-admn-sts",
"admittedTerm": "admittedTerm-admn-sts",
"deprecatedTerm": "deprecatedTerm-admn-sts",
}
concepts = OrderedDict()
with open(sys.argv[1], encoding="utf-8-sig", newline="") as f:
for row in csv.DictReader(f):
if row["status"] not in STATUS:
sys.exit(f"statusが不正です: {row['concept_id']} {row['term']}")
concepts.setdefault(row["concept_id"], []).append(row)
out = [
'<?xml version="1.0" encoding="utf-8"?>',
'<tbx type="TBX-Basic" style="dca" xml:lang="ja"'
' xmlns="urn:iso:std:iso:30042:ed-2">',
'<tbxHeader><fileDesc><sourceDesc>',
'<p>原稿から抽出した用語集</p>',
'</sourceDesc></fileDesc></tbxHeader>',
'<text><body>',
]
for cid, rows in concepts.items():
out.append(f'<conceptEntry id="{escape(cid)}">')
langs = OrderedDict()
for r in rows:
langs.setdefault(r["lang"], []).append(r)
for lang, items in langs.items():
out.append(f'<langSec xml:lang="{escape(lang)}">')
d = next((r["definition"] for r in items if r["definition"]), "")
if d:
out.append(
'<descripGrp><descrip type="definition">'
f'{escape(d)}</descrip></descripGrp>'
)
for r in items:
out.append("<termSec>")
out.append(f'<term>{escape(r["term"])}</term>')
if r["pos"]:
out.append(
f'<termNote type="partOfSpeech">{escape(r["pos"])}</termNote>'
)
out.append(
'<termNote type="administrativeStatus">'
f'{STATUS[r["status"]]}</termNote>'
)
if r["note"]:
out.append(f'<note>{escape(r["note"])}</note>')
out.append("</termSec>")
out.append("</langSec>")
out.append("</conceptEntry>")
out += ["</body></text>", "</tbx>"]
open(sys.argv[2], "w", encoding="utf-8").write("\n".join(out) + "\n")
print(f"{len(concepts)}概念を書き出しました")このスクリプトを、Claudeのコード実行に渡して動かします。次のような指示になります。
添付の glossary.csv と csv2tbx.py を使って glossary.tbx を作ってください。
スクリプトは書き換えず、そのまま実行してください。
実行後、glossary.tbx の先頭30行をそのまま表示してください。「スクリプトを書き換えない」と明記するのは、実行のたびに構造が変わるのを避けるためです。手元で動かす場合は次のとおりです。
python3 csv2tbx.py glossary.csv glossary.tbx筆者の手元(Python 3.12.2)で、上のglossary.csv(2概念6行)を変換すると、2概念を書き出しましたと表示され、conceptEntryが2つ入ったTBXができました。deprecatedTermにしたterm listの行には、administrativeStatusがdeprecatedTerm-admn-stsで入り、noteに「使用しない」が残ります。
スキーマで形式の誤りを確かめる
書き出したら、Claudeの報告を待たずに形式を検証します。TBXの公開リポジトリには、基本構造のRELAX NGスキーマ(TBXcoreStructV03.rng)があります。xmllintで検証できます。
curl -sLO https://raw.githubusercontent.com/LTAC-Global/\
TBX_Core_RNG/master/TBXcoreStructV03.rng
xmllint --noout --relaxng TBXcoreStructV03.rng glossary.tbx上のスクリプトの出力は、手元でglossary.tbx validatesと表示されました。TBX-Basicの公開サンプルも同じスキーマで通ります。
この検証が見るのは、要素の並びや必須の構造です。statusの値が正しいかどうかは、TBX-Basic固有の制約を持つSchematronファイルのほうが厳密に調べます。取り込み先のツールがTBX-Basicを求めるなら、そちらでも通しておくと確実です。
TBX自体の位置づけも押さえておきます。TBXの第3版は2019年の発行で、5年ごとの見直しが進んでいます。TBX-Basicは、LTAC Globalが公開している方言で、v1.2.1(2023-02-09)ではスキーマの責務が整理され、核となるデータモデルはRNGで、方言固有の制約はSchematronで検査する形になりました。
用語集をProjectに置いて確かめる
CSVとTBXができたら、Projectのナレッジに置きます。有料プランでは、Projectの内容が多くなるとRAG(検索で必要な部分だけ取り出す方式)に切り替わり、容量が最大10倍に広がります。用語集は小さいため、この切り替えは通常は気にしなくて構いません。
置いたあとで、効いているかを1回だけ確かめます。原稿の中から用語集に載る語を含む段落を5つほど選び、訳させて、deprecatedTermが1つも出ていないかを見ます。
用語集(glossary.csv)に従って、次の段落を英訳してください。
訳したあとで、使った用語と、用語集の該当行を表にしてください。表が出ると、Claudeがどの行を参照したかを人が突き合わせられます。このとき、用語集にない語がどう訳されたかも見えます。そこは次の候補になります。
TBXは取り込み先のツールによって読める範囲が違い、noteやdefinitionを無視するツールもあります。実際に使うツールに小さなTBXを1回取り込んで、statusが正しく表示されることを確認してから、全件を入れると手戻りが減ります。
よくあるつまずき
候補に頻出語ばかりが並ぶ
「会社」「サービス」のような一般語は、頻度が高くても用語集に要りません。候補を出させる指示に「一般的な語は除く。この原稿の中で訳が割れそうな語だけ」と足します。候補の数が多すぎるときは、countが3以上のものと固有名詞だけに絞って、1周目を終えます。
同じ語の訳がチャットごとに変わる
用語集を新しいチャットで渡し忘れると、訳がまた割れます。Projectのナレッジに置き、プロジェクト指示にも「用語集のstatusに従う」と書いておくと、毎回貼らずに済みます。適用の細かい手順は、Claudeで作業手順書を多言語化にあります。
CSVが文字化けする
Excelで開き直して保存したCSVは、文字コードが変わることがあります。Claudeには「UTF-8(BOM付き)で書き出して」と頼みます。上のスクリプトはBOMの有無どちらでも読み込めます。
Claudeが定義を勝手に足す
definitionを空にする指示を入れても、定義らしい文を作ることがあります。その場合は、定義の列だけを取り出して、原稿の中に根拠があるか1行ずつ見ます。根拠がない行は空欄に戻します。
検証は通るのに取り込み先で弾かれる
RNGが通っても、取り込み先がTBX-Basic以外の方言を求めていることがあります。方言名はtbx要素のtype属性に入ります。ツールの仕様に合わせて変更するか、そのツールのCSV取り込みに切り替えます。
まとめ
用語集作りは、拾う、決める、固定するの3つに分かれ、決める部分だけが人の仕事です。Claudeには、拾う作業と、決めた内容を壊さず別の形式に写す作業を任せます。
最小の運用は、候補CSV、決定後のglossary.csv、TBXの3つを同じProjectに置くことです。CSVが正本、TBXはそこから毎回スクリプトで作り直す出力、という関係にしておくと、訳語を直したときもCSVだけを編集すれば済みます。Projectの検索まわりはClaudeのProjectsのRAG検索の仕組み、海外取引先とのやりとりに使う例は海外サプライヤーへの英文メールとRFQで説明しています。