mirror of
https://github.com/QData/TextAttack.git
synced 2021-10-13 00:05:06 +03:00
57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
from textattack.constraints.pre_transformation import (
|
|
InputColumnModification,
|
|
RepeatModification,
|
|
StopwordModification,
|
|
)
|
|
from textattack.goal_functions import UntargetedClassification
|
|
from textattack.search_methods import PSOAlgorithm
|
|
from textattack.shared.attack import Attack
|
|
from textattack.transformations import WordSwapEmbedding, WordSwapHowNet
|
|
|
|
|
|
def PSOZang2020(model):
|
|
"""
|
|
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."
|
|
"""
|
|
#
|
|
# 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)
|
|
#
|
|
# Perform word substitution with a Particle Swarm Optimization (PSO) algorithm.
|
|
#
|
|
search_method = PSOAlgorithm(pop_size=60, max_iters=20)
|
|
|
|
return Attack(goal_function, constraints, transformation, search_method)
|