翻訳メモリの構築や対訳データの整理において、英文と日本語訳文の「セグメントアライメント」(文書整合)は欠かせない作業です。手作業で行うのは大変ですが、Google Colabと自然言語処理モデルLaBSEを使えば、誰でも簡単に高精度なアライメントが実現できます。 この記事では、英語と日本語のテキストファイルをアップロードし、文ごとに自動アライメントを行い、TMXまたはTSV形式でダウンロードするまでの一連の流れをご紹介します。

- 目次
1. 「Colab」とは?
Google Colab(コラボ)は、Googleが提供する無料のクラウド型ノートブック環境です。Pythonコードをブラウザ上でそのまま実行でき、GPUやTPUも無料で使用できます。インストール不要で、ファイルのアップロードやダウンロード、データの可視化なども簡単に行えるため、機械学習や自然言語処理の実験に最適です。特にプログラミング初心者でも、コードのセルを順に実行するだけで処理を進められるのが大きなメリットです。
2. 「LaBSE」とは?
LaBSE(Language-agnostic BERT Sentence Embedding)は、Google Researchが開発した多言語文埋め込みモデルです。100以上の言語に対応しており、異なる言語間でも意味的に類似した文は、類似したベクトル(数値表現)として扱えるのが大きな特徴です。
LaBSEは翻訳品質の評価やクロスリンガル検索、多言語文書のアライメントにおいて非常に有用です。このプロジェクトでは、英語と日本語の文をLaBSEでベクトル化し、意味の近さ(コサイン類似度)で最もマッチするペアを自動で見つけ出しています。
2-1. ステップ1:セットアップとファイルのアップロード
まず、Google Colab 上でライブラリ環境をセットアップします。次のコードをColabのコードの新規セルにコピーし、実行してください(以下のステップでも同様に実行してください)。
続いて、英語ファイルと日本語ファイルをアップロードします。
# ファイルをアップロード
from google.colab import files
print("🔼 英語ファイルをアップロードしてください(.txt)")
uploaded_en = files.upload()
print("🔼 日本語ファイルをアップロードしてください(.txt)")
uploaded_jp = files.upload()
2-2. ステップ2:文ごとの分割(セグメンテーション)
NLTKを使って英語を文に分割します。
# 英語ファイルの読み込みと文分割
from google.colab import files
import nltk
import io
# 必要なリソースをダウンロード(初回のみ)
nltk.download('punkt_tab')
# 文ごとに分割するためのリスト
en_segments = []
# アップロードされたファイルを読み取り
for filename in uploaded_en:
text = io.StringIO(uploaded_en[filename].decode('utf-8')).read()
# 行単位で処理し、各行を文に分割
for line in text.splitlines():
line = line.strip()
if line: # 空行を無視
sentences = nltk.sent_tokenize(line)
en_segments.extend(sentences)
# 結果確認(必要に応じて)
for i, sent in enumerate(en_segments[:10]):
print(f"{i+1}: {sent}")
print(f"✅ 英語セグメント数: {len(en_segments)}")
日本語は正規表現を使って分割します。
# 日本語ファイルの読み込みと文分割
import re
def split_ja(text):
text = text.replace('\r\n', '\n').replace('\r', '\n') # 改行を統一
# 改行ごとに分割 → さらに句点(。!?)で分割
lines = text.splitlines()
segments = []
for line in lines:
line = line.strip()
if not line:
continue
sents = re.split(r'(?<=[。!?])\s*', line)
segments.extend([s.strip() for s in sents if s.strip()])
return segments
jp_segments = []
for name in uploaded_jp.keys():
with open(name, encoding='utf-8') as f:
jp_segments += split_ja(f.read())
print(f"✅ 日本語セグメント数: {len(jp_segments)}")
2-3. ステップ3:LaBSEで意味的に類似した文を自動ペア化
LaBSEモデルでそれぞれの文をベクトル化し、意味の近いペアを見つけます。
# LaBSE モデルの読み込みとテキストのベクトル化
from sentence_transformers import SentenceTransformer
from tqdm import tqdm
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
model = SentenceTransformer('sentence-transformers/LaBSE')
en_embeddings = model.encode(en_segments, convert_to_numpy=True, show_progress_bar=True)
jp_embeddings = model.encode(jp_segments, convert_to_numpy=True, show_progress_bar=True)
tm_pairs = []
used_en = set()
# 全ての日本語文のベクトルに対して、英語文との類似度を計算
for i, jp_vec in tqdm(enumerate(jp_embeddings), total=len(jp_segments)):
sims = cosine_similarity([jp_vec], en_embeddings)[0]
top_idx = np.argmax(sims) # 最も類似度が高いインデックスを取得
sim_score = sims[top_idx] # その類似度スコア
tm_pairs.append((en_segments[top_idx], jp_segments[i], sim_score))
2-4. ステップ4:TMX・TSV形式で出力
作成した対訳ペアは、翻訳メモリツールに使えるTMX形式、あるいはExcelなどで閲覧しやすいTSV形式で保存・ダウンロードできます。
以下のコードはTMX形式でダウンロードします。
# TMXファイル生成とダウンロード
from xml.etree.ElementTree import Element, SubElement, ElementTree
from google.colab import files
# TMX出力
tmx = Element('tmx', version="1.4")
header = SubElement(tmx, 'header', {
'creationtool': 'ColabTM',
'creationtoolversion': '1.0',
'segtype': 'sentence',
'adminlang': 'en-US',
'srclang': 'en',
'datatype': 'PlainText'
})
body = SubElement(tmx, 'body')
for en, ja, score in tm_pairs:
tu = SubElement(body, 'tu')
tuv_en = SubElement(tu, 'tuv', {'xml:lang': 'en'})
seg_en = SubElement(tuv_en, 'seg')
seg_en.text = en
tuv_ja = SubElement(tu, 'tuv', {'xml:lang': 'ja'})
seg_ja = SubElement(tuv_ja, 'seg')
seg_ja.text = ja
# 保存とダウンロード
tree = ElementTree(tmx)
tree.write('output.tmx', encoding='utf-8', xml_declaration=True)
files.download('output.tmx')
以下のコードはTSV形式でダウンロードします。
# TSVファイル生成とダウンロード
import pandas as pd
# tm_pairsからDataFrameを作成
df_tsv = pd.DataFrame(tm_pairs, columns=["English", "Japanese", "Similarity"])
# TSVファイルとして保存
tsv_path = "output.tsv"
df_tsv.to_csv(tsv_path, sep="\t", index=False)
files.download('output.tsv')
3. 補足
今回の例では英語と日本語のペアを対象としましたが、実はこの方法はLaBSEが対応する100以上の言語に応用可能です。たとえば「英語とフランス語」「中国語とスペイン語」など、任意の言語ペアで同じようにアライメント処理ができます。ファイルの言語を変更し、セグメントの分割方法だけ各言語に合わせて調整すれば、多言語翻訳メモリの作成にも活用できます。多国語展開を見据えたプロジェクトにも非常に有効です。
4. まとめ
この記事ではLaBSEを利用した高精度な意味ベースのセグメントアライメントを行う方法を説明しました。翻訳メモリの構築、機械翻訳の学習データ作成、対訳コーパスの準備などに幅広く活用できます。プログラミング初心者の方でも安心して使える内容ですので、ぜひ活用してみてください。
ヒューマンサイエンスでは、翻訳メモリの構築、機械翻訳の学習データ作成、対訳コーパスの準備の支援も行っております。ご質問やご依頼は以下お問い合わせフォームよりご連絡ください。