Spaces:
Running
Running
| """ | |
| 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() | |