💨

rouge-scoreライブラリで日本語のROUGEを計算する

2024/03/28に公開

はじめに

rouge-scoreというROUGEを簡単に計算できるライブラリがあるのですが、日本語のTokenizerを適用させる方法が分からなかったので備忘録です。

日本語Tokenizerクラスの作成

rouge-scoreのソースコードに以下のようなTokenizerの親クラスがあったのでこれを継承して作成します。

rouge_score/tokenizers.py
class Tokenizer(abc.ABC):
  """Abstract base class for a tokenizer.

  Subclasses of Tokenizer must implement the tokenize() method.
  """

  @abc.abstractmethod
  def tokenize(self, text):
    raise NotImplementedError("Tokenizer must override tokenize() method")

今回、形態素解析機はMeCabを使用します。

MeCabを使用したTokenizerクラスが以下になります。

class MeCabTokenizer(Tokenizer):
  """rouge-score用のMeCabを用いたTokenizerクラス

  Args:
      use_stemmer (bool, optional): Trueの場合、単語の原型で分割する. Defaults to False.
  """
  def __init__(self, use_stemmer=False):
    self._stemmer = use_stemmer
    
    self.tagger = MeCab.Tagger()
    self.wakati = MeCab.Tagger("-Owakati")


  def tokenize(self, text):
    if self._stemmer:
        node = self.tagger.parseToNode(text)
        original_forms = []
        while node:
            feature = node.feature.split(",")
            original_forms.append(feature[6])
            node = node.next

        return original_forms
      
    else:
      return self.wakati.parse(text).split()

Sudachi等の他のTokenizerを使用したい場合もこのクラスを修正すれば大丈夫です。

日本語のROUGEを計算

以下が先程作成したMeCabTokenizerクラスを使用して日本語のrougeLを計算するサンプルコードです。

mecab_tokenizer = MeCabTokenizer()
scorer = rouge_scorer.RougeScorer(["rougeL"], use_stemmer=False, tokenizer=mecab_tokenizer)

target = "たかしが公園で遊んでいた。"
prediction = "たかしが公園にいたようだ。"

rouge_score = scorer.score(target, prediction)
print(rouge_score)
結果
{'rougeL': Score(precision=0.5714285714285714, recall=0.5333333333333333, fmeasure=0.5517241379310344)}

Discussion