Claude Media
Claudeで翻訳の用語集を作成 — 原稿から候補を抜きTBXとCSVに書き出す

Claudeで翻訳の用語集を作成 — 原稿から候補を抜きTBXとCSVに書き出す

原稿から頻出語と固有名詞を拾い、訳語と使わない訳を人が決め、CSVとTBXの用語集ファイルにする手順です。TBXへの変換スクリプトと検証結果つき。

翻訳用語集は、原稿の中から「同じ訳でそろえたい語」を拾い、訳語を1つに決め、機械が読める形で保存すれば完成します。拾う作業はClaudeが速く、決める作業は人が持つのが筋です。この記事では、候補の抽出、訳語と使わない訳の決定、CSVとTBXへの書き出しまでを順に説明します。

TBX(TermBase eXchange)は、用語データベースの内容を別のツールへ渡すための国際規格(ISO 30042)の形式です。CSVだけでも運用はできますが、翻訳支援ツールに取り込みたい場面ではTBXが求められます。

手順

用語集ができるまでの4段階

  1. 1

    候補を抜く

    原稿をClaudeに渡し、頻出語・固有名詞・社内用語をCSVで出させます。

  2. 2

    人が決める

    訳語、許容する訳、使わない訳を決めます。ここはClaudeに任せません。

  3. 3

    CSVに整える

    1語1行の形式にそろえ、状態の値を決まった語彙に限ります。

  4. 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は、たとえば次のような行になります。

kindja_variantscounten_candidatesnote
社内用語ja_variants承認フロー / 承認ワークフローcount14en_candidatesapproval workflow / approval flownote表記ゆれあり
略語ja_variants稟議count6en_candidatesringi / internal approvalnote直訳しにくい
固有名詞ja_variants○○支店count9en_candidates○○ Branchnote地名の表記規則に依存

数字は、元になる原稿で本当に数えた値かどうかを必ず1行だけ照合します。コードを実行させたのに回数が極端に少ないときは、抽出された本文の改行や空白で語が分かれていないか、数えたコードを見せてもらって確かめます。

訳語と使わない訳は人が決める

候補が出たら、各行について「固定する訳」「許容する訳」「使わない訳」を人が決めます。Claudeにここまで決めさせると、もっともらしい訳が並ぶだけで、会社や媒体の事情が入りません。

判断に使う軸は次の3つです。

  • 読む相手は誰か。社内向けなら許容する訳が増え、対外向けなら固定を厳しくします。
  • 過去の公開物と合っているか。すでに公開した文書で使っている訳は、変えると読者が混乱します。
  • 辞書的な訳より、検索や慣習で通じるか。

決めた結果は、Claudeにそのまま渡して長形式のCSVに直させます。

前と後

候補の1行を、用語集の3行にする

BEFORE

候補CSVの1行

承認フロー / 承認ワークフロー、count 14、案はapproval workflowとapproval flow

AFTER

決定後の用語集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で説明しています。

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