Source code for OpenAttack.metric.algorithms.bleu
from typing import List
from .base import AttackMetric
from ...text_process.tokenizer import Tokenizer
[docs]class BLEU(AttackMetric):
NAME = "BLEU"
[docs] def __init__(self, tokenizer : Tokenizer) -> None:
"""
Args:
tokenizer: A tokenizer that will be used in this metric. Must be an instance of :py:class:`.Tokenizer`
:Language: english
"""
from nltk.translate.bleu_score import sentence_bleu
from nltk.translate.bleu_score import SmoothingFunction
self.smooth = SmoothingFunction()
self.sentence_bleu = sentence_bleu
self.tokenizer = tokenizer
@property
def TAGS(self):
if hasattr(self.tokenizer, "TAGS"):
return self.tokenizer.TAGS
else:
return set()
[docs] def calc_score(self, tokenA : List[str], tokenB : List[str]) -> float:
"""
Args:
tokenA: The first list of tokens.
tokenB: The second list of tokens.
Retruns:
The BLEU score.
Make sure two list have the same length.
"""
ref = [ tokenA ]
cand = tokenB
return self.sentence_bleu(ref, cand, smoothing_function = self.smooth.method1)
def after_attack(self, input, adversarial_sample):
if adversarial_sample is not None:
return self.calc_score( self.tokenizer.tokenize(input["x"], pos_tagging=False), self.tokenizer.tokenize(adversarial_sample, pos_tagging=False) )
else:
return None