💨
rouge-scoreライブラリで日本語のROUGEを計算する
はじめに
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