Source code for ferret.explainers
"""Explainers API"""
import warnings
from abc import ABC, abstractmethod
from typing import Optional, Union
from ..modeling import create_helper
from ..modeling.base_helpers import BaseTaskHelper
[docs]
class BaseExplainer(ABC):
@property
@abstractmethod
def NAME(self):
pass
[docs]
def __init__(
self, model, tokenizer, model_helper: Optional[BaseTaskHelper] = None, **kwargs
):
# We use the task_name parameter to specify the correct helper via the create_helper() function
task_name = kwargs.pop('task_name', None)
if model is None or tokenizer is None:
raise ValueError("Please specify a model and a tokenizer.")
self.init_args = kwargs
# The user can now specify the task name even for explainers, and that will set the correct helper
# even if no model_helper is specified. If the user does not specify anything, we show the Warning.
if model_helper is None:
if task_name is None:
task_name = "text-classification"
warnings.warn(
"No helper provided. Using default 'text-classification' helper."
)
self.helper = create_helper(model, tokenizer, task_name)
else:
self.helper=model_helper
@property
def device(self):
return self.helper.model.device
@property
def model(self):
return self.helper.model
@property
def tokenizer(self):
return self.helper.tokenizer
def _tokenize(self, text, **tok_kwargs):
return self.helper._tokenize(text, **tok_kwargs)
def get_tokens(self, text):
return self.helper.get_tokens(text)
def get_input_embeds(self, text):
return self.helper.get_input_embeds(text)
@abstractmethod
def compute_feature_importance(
self, text: str, target: int, target_token: Optional[str], **explainer_args
):
pass
def __call__(
self,
text: str,
target: Union[str,int],
target_token: Optional[str] = None,
**explainer_args
):
return self.compute_feature_importance(
text, target, target_token, **explainer_args
)