""" LanguageTool Grammar Checker ------------------------------ """ import language_tool_python from textattack.constraints import Constraint class LanguageTool(Constraint): """Uses languagetool to determine if two sentences have the same number of grammatical erors. (https://languagetool.org/) Args: grammar_error_threshold (int): the number of additional errors permitted in `x_adv` relative to `x` compare_against_original (bool): If `True`, compare against the original text. Otherwise, compare against the most recent text. language: language to use for languagetool (available choices: https://dev.languagetool.org/languages) """ def __init__( self, grammar_error_threshold=0, compare_against_original=True, language="en-US" ): super().__init__(compare_against_original) self.lang_tool = language_tool_python.LanguageTool(language) self.grammar_error_threshold = grammar_error_threshold self.grammar_error_cache = {} def get_errors(self, attacked_text, use_cache=False): text = attacked_text.text if use_cache: if text not in self.grammar_error_cache: self.grammar_error_cache[text] = len(self.lang_tool.check(text)) return self.grammar_error_cache[text] else: return len(self.lang_tool.check(text)) def _check_constraint(self, transformed_text, reference_text): original_num_errors = self.get_errors(reference_text, use_cache=True) errors_added = self.get_errors(transformed_text) - original_num_errors return errors_added <= self.grammar_error_threshold def extra_repr_keys(self): return ["grammar_error_threshold"] + super().extra_repr_keys()