Re:ゼロから始めるML生活

どちらかといえばエミリア派です

BERTScoreで文章の類似性を測定してみた

f:id:nogawanogawa:20200816093523p:plain

最近こんな記事を見かけました。

ai-scholar.tech 

機械翻訳や機械要約のタスクでは、自然文を生成することになりますが、その際に生成された文がどれほど良いかについて評価する必要が出てきます。 ICLRで発表されたBERTScoreはこれを従来の評価指標より正しく評価できるとのことでした。

ということで、今回はそのBERTScoreを使ってみたので、そのメモです。

元論文

元論文はこちら。

arxiv.org

生成タスクにおける評価指標

ai-lab.lapras.com

こちらの記事によれば、従来の文書生成に関する指標として

  • BLEU
  • ROUGE-N
  • NIST
  • METEOR
  • TER

などが挙げられています。

その他、論文中では、Embeddingベースの指標や機械学習ベースの指標などが挙げられています。 こうした従来の手法では、文の解釈が十分になされていないというのが課題感としてあるようで、きちんと内容を自動で解釈して生成文を評価したいというのがモチベーションとしてあるようです。

BERTScore

本題のBERTScoreは、その名の通りBERTを使用して生成文に対して評価を行うことができます。 詳細は記事に詳しく書かれていますので、そちらをご参照ください。

ai-scholar.tech 

使ってみる

本題です。 BERTScoreを実際に使ってみたいと思います。

github.com

英語に関しては、tutorialが用意されているので、そちらを動かしてみるのが早いかと思います。

colab.research.google.com

今回は日本語でやってみます。

インストールは

pip install bert-score

だけです。 一応こんな感じで書き換えてみました。

from bert_score import score

def calc_bert_score(cands, refs):
    """ BERTスコアの算出

    Args:
        cands ([List[str]]): [比較元の文]
        refs ([List[str]]): [比較対象の文]

    Returns:
        [(List[float], List[float], List[float])]: [(Precision, Recall, F1スコア)]
    """
    Precision, Recall, F1 = score(cands, refs, lang="ja", verbose=True)
    return Precision.numpy().tolist(), Recall.numpy().tolist(), F1.numpy().tolist()


if __name__ == "__main__":
    """ サンプル実行 """ 
    with open("hyps.txt") as f:
        cands = [line.strip() for line in f]

    with open("refs.txt") as f:
        refs = [line.strip() for line in f]
    
    P, R, F1 = calc_bert_score(cands, refs)
    for p,r, f1 in zip(P, R, F1):
        print("P:%f, R:%f, F1:%f" %(p, r, f1))

テキストファイルを2つ読み込んで、行ごとにスコアを算出していくようになっています。

Precision とRecall、F1スコアが返ってきています。

done in 0.34 seconds, 29.72 sentences/sec
P:0.863339, R:0.933878, F1:0.897224
P:0.757125, R:0.881904, F1:0.814765
P:0.924870, R:0.961351, F1:0.942758
P:0.809138, R:0.884285, F1:0.845044
P:0.894764, R:0.889748, F1:0.892249
P:0.824118, R:0.944584, F1:0.880248
P:0.834614, R:0.850940, F1:0.842698
P:0.803638, R:0.842413, F1:0.822569
P:0.897082, R:0.883126, F1:0.890050
P:0.716954, R:0.767821, F1:0.741516

※Transformerのところでめっちゃワーニングが出ます。

データセットは簡単のため、こちらから一部抜粋して使用させていただきました。ありがとうございます。

nlp.ist.i.kyoto-u.ac.jp

使ったコード

一応使ったコードを残しておきます。

github.com

感想

というわけで、今回は自然文の生成に関してどんな指標があるのかわからず調べてみた次第です。 こういうところの指標としてはBLEUなどがよく使われている印象でしたが、文の意味までは踏み込めていない印象だったので、BERTの事前学習モデルを使った指標であれば、より正しく文書生成について評価ができるのかなという印象です。

実際に研究などで使用するかはおいておいても、文書生成した際の品質を評価する際の参考としては有効だと思います。 また使う機会があれば使ってみたいと思います。