class_docstr: Zang, Y., Yang, C., Qi, F., Liu, Z., Zhang, M., Liu, Q., & Sun, M.
  (2019).
  
  Word-level Textual Adversarial Attacking as Combinatorial Optimization.
  
  https://www.aclweb.org/anthology/2020.acl-main.540.pdf
  
  Methodology description quoted from the paper:
  
  "We propose a novel word substitution-based textual attack model, which reforms
  both the aforementioned two steps. In the first step, we adopt a sememe-based word
  substitution strategy, which can generate more candidate adversarial examples with
  better semantic preservation. In the second step, we utilize particle swarm optimization
  (Eberhart and Kennedy, 1995) as the adversarial example searching algorithm."
  
  And "Following the settings in Alzantot et al. (2018), we set the max iteration time G to 20."
code: def build(model_wrapper):
      #
      # Swap words with their synonyms extracted based on the HowNet.
      #
      transformation = WordSwapHowNet()
      #
      # Don't modify the same word twice or stopwords
      #
      constraints = [RepeatModification(), StopwordModification()]
      #
      #
      # During entailment, we should only edit the hypothesis - keep the premise
      # the same.
      #
      input_column_modification = InputColumnModification(
          ["premise", "hypothesis"], {"premise"}
      )
      constraints.append(input_column_modification)
      #
      # Use untargeted classification for demo, can be switched to targeted one
      #
      goal_function = UntargetedClassification(model_wrapper)
      #
      # Perform word substitution with a Particle Swarm Optimization (PSO) algorithm.
      #
      search_method = ParticleSwarmOptimization(
          pop_size=60, max_iters=20
      )
  
      return Attack(
          goal_function, constraints, transformation, search_method
      )
  
file_path: TextAttack/textattack/attack_recipes/pso_zang_2020.py
imports: from textattack import Attack
  from textattack.constraints.pre_transformation import InputColumnModification, RepeatModification, StopwordModification
  from textattack.goal_functions import UntargetedClassification
  from textattack.search_methods import ParticleSwarmOptimization
  from textattack.transformations import WordSwapHowNet
  from .attack_recipe import AttackRecipe
label_desc: Use image node_id 1 for calling the PSOZang2020 obj's underlying member method code with example usage: obj.build(model_wrapper) and returns: Attack