Source code for OpenAttack.metric.algorithms.modification
from typing import List
from .base import AttackMetric
from ...text_process.tokenizer import Tokenizer
[docs]class Modification(AttackMetric):
NAME = "Word Modif. Rate"
[docs] def __init__(self, tokenizer : Tokenizer):
"""
Args:
tokenizer: A tokenizer that will be used in this metric. Must be an instance of :py:class:`.Tokenizer`
"""
self.tokenizer = tokenizer
@property
def TAGS(self):
if hasattr(self.tokenizer, "TAGS"):
return self.tokenizer.TAGS
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.
Returns:
Modification rate.
Make sure two list have the same length.
"""
va = tokenA
vb = tokenB
ret = 0
if len(va) != len(vb):
ret = abs(len(va) - len(vb))
mn_len = min(len(va), len(vb))
va, vb = va[:mn_len], vb[:mn_len]
for wordA, wordB in zip(va, vb):
if wordA != wordB:
ret += 1
return ret / len(va)
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) )