ナード戦隊データマン

機械学習, 自然言語処理, データサイエンスについてのブログ

Language Identificationの2つのモデルのパフォーマンスを比較

Language Identificationとは、与えられたテキストの言語の種類を予測するタスクです。

2つのモデル

langdetectモジュール

pythonのlangdetectモジュールは言語検出のために使えます。

langdetect · PyPI

pip3 install langdetect
from langdetect import detect
print(detect("俺は人間やめる"))

[出力]

'ja'

fasttextの公開モデル

fasttextは言語検出モデルを公開しています。

Language identification · fastText

wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin
pip3 install fasttext
from fasttext import load_model
model = load_model("lid.176.bin")
print(model.predict("俺は人間やめる"))

[出力]

(('__label__ja',), array([0.99936599]))

パフォーマンス比較

2つのモデルの実行速度と精度を比較します。

実行の前提:

コード

import time
from langdetect import detect
from fasttext import load_model
from tqdm import tqdm

model = load_model("./lid.176.bin")


def predict1(text):
    try:
        return detect(text)
    except Exception:
        return "Error"


def predict2(text):
    try:
        return model.predict(text)[0][0].split("__")[-1]
    except Exception:
        return "Error"


def load_data(xfile, yfile):
    X = []
    y = []
    with open(xfile) as fx, open(yfile) as fy:
        for text, label in zip(fx, fy):
            X.append(text.strip())
            y.append(label.strip()[:2])
    return X, y


def evaluate(X, y, predict):
    preds = []
    s = time.time()
    for i, (text, label) in tqdm(enumerate(zip(X, y))):
        preds.append(label.startswith(predict(text)[:2]))
    e = time.time()
    acc = float(sum(preds)) / float(len(preds))
    return {"acc": acc, "speed": e - s}


def main():
    X, y = load_data("./wili2018/x_test.txt", "./wili2018/y_test.txt")
    print("langdetect:", evaluate(X, y, predict1))
    print("fasttext:", evaluate(X, y, predict2))


if __name__ == "__main__":
    main()

結果

langdetect: {'acc': 0.16065531914893616, 'speed': 559.3077516555786}
fasttext: {'acc': 0.38189787234042555, 'speed': 7.339310884475708}

考察

fasttextの公開モデルのほうが対応言語数、精度、速度のすべての点でlangdetectモジュールを上回ります。Parallel Corpus Filteringというタスクでは、フィルタリングスコアに言語検出の結果を利用することがあります。その際に、langdetectのように非常に遅いモデルだと、実用面で使い物にならない可能性があります。一般的に、クロールによって収集されたパラレルコーパスのデータ量は非常に多いです。