LoginSignup
0
0

概要

日々、新しい言語モデルがHugging Faceなどに投稿されています。それらの翻訳性能を比較したいと思い、評価方法について調査しました。
その結果、sacreBLEUというツールが便利そうだったので、その使用方法をまとめます。

sacreBLEUのインストール

sacreBLEUはPythonで書かれており、pipコマンドでインストールできます。
日本語を扱う場合はmecab-python3 が必要らしく、ja オプションをつけてインストールします。

pip install "sacrebleu[ja]"

なお、jaオプションを付けているのにトークナイザー関連のエラーが出る場合、mecab-python3のアップデートが必要かもしれません。

pip install -U mecab-python3

テストデータの取得

まず、テストデータを選んで出力します。利用可能なデータセットの一覧は次のコマンドで確認できます。

sacrebleu --list

この例では、WMT23データセットを使用して英日翻訳の性能を評価します。
以下のコマンドでテストデータをファイルwmt23.en-ja.enに出力します。

sacrebleu -t wmt23 -l en-ja --echo src > wmt23.en-ja.en

評価対象の言語モデルを使ってこのファイルの各行を翻訳し、別のファイルに保存します。

テストデータの翻訳

実験として、軽量かつ高性能なfuguMTを使用して翻訳を行います。
この実験では、CTranslate2Rustバインディングを介して使用しました。
具体的なソースコードは以下のとおりです。

Cargo.toml
[package]
name = "translate"
edition = "2021"

[dependencies]
anyhow = "1.0.86"
ct2rs = "0.8.5"
hf-hub = "0.3.2"
src/main.rs
use std::env;
use std::fmt::Display;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;

use anyhow::{anyhow, Result};
use ct2rs::{TranslationOptions, Translator};

fn main() -> Result<()> {
    let translator = Translator::new(find_model_dir("fugumt-en-ja")?, &Default::default())?;
    let opts = TranslationOptions {
        beam_size: 5,
        ..Default::default()
    };

    let n = 8; // batch size
    let mut iter = BufReader::new(File::open(
        env::args()
            .skip(1)
            .next()
            .ok_or_else(|| anyhow!("input file is required"))?,
    )?)
    .lines()
    .peekable();
    while iter.peek().is_some() {
        let res = translator.translate_batch(
            &iter
                .by_ref()
                .take(n)
                .collect::<std::result::Result<Vec<String>, std::io::Error>>()?,
            &opts,
            None,
        )?;
        res.into_iter().for_each(|(r, _)| println!("{}", r));
    }

    Ok(())
}

fn find_model_dir<T: Display>(model: T) -> Result<PathBuf> {
    let api = hf_hub::api::sync::Api::new()?;
    let repo = api.model(format!("jkawamoto/{}-ct2", model));

    let mut res = None;
    for f in repo.info()?.siblings {
        let path = repo.get(&f.rfilename)?;
        if res.is_none() {
            res = path.parent().map(PathBuf::from);
        }
    }

    res.ok_or_else(|| anyhow!("no model files are found"))
}

以下のコマンドを実行すると、fugumt.outファイルに翻訳結果が保存されます。

cargo run -- wmt23.en-ja.en > fugumt.out

翻訳結果の評価

翻訳結果からBLEUスコアを計算するには、次のコマンドを実行します。

sacrebleu -t wmt23 -l en-ja -i fugumt.out

beam_size5に設定したfuguMTによるBLEUスコアは、18.0という結果でした。

{
 "name": "BLEU",
 "score": 18.0,
 "signature": "nrefs:1|case:mixed|eff:no|tok:ja-mecab-0.996-IPA|smooth:exp|version:2.4.2",
 "verbose_score": "53.8/25.1/13.4/7.5 (BP = 0.940 ratio = 0.942 hyp_len = 49459 ref_len = 52516)",
 "nrefs": "1",
 "case": "mixed",
 "eff": "no",
 "tok": "ja-mecab-0.996-IPA",
 "smooth": "exp",
 "version": "2.4.2"
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0