mirror of
https://github.com/QData/TextAttack.git
synced 2021-10-13 00:05:06 +03:00
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
"""
|
|
Cheng, Minhao, et al.
|
|
|
|
Seq2Sick: Evaluating the Robustness of Sequence-to-Sequence Models with
|
|
Adversarial Examples
|
|
|
|
ArXiv, abs/1803.01128.
|
|
|
|
|
|
This is a greedy re-implementation of the seq2sick attack method. It does
|
|
not use gradient descent.
|
|
|
|
"""
|
|
|
|
from textattack.shared.attack import Attack
|
|
from textattack.constraints.overlap import LevenshteinEditDistance
|
|
from textattack.constraints.semantics import WordEmbeddingDistance, RepeatModification, StopwordModification
|
|
from textattack.goal_functions import NonOverlappingOutput
|
|
from textattack.search_methods import GreedyWordSwapWIR
|
|
from textattack.transformations import WordSwapEmbedding
|
|
|
|
def Seq2SickCheng2018BlackBox(model, goal_function='non_overlapping'):
|
|
#
|
|
# Goal is non-overlapping output.
|
|
#
|
|
goal_function = NonOverlappingOutput(model)
|
|
# @TODO implement transformation / search method just like they do in
|
|
# seq2sick.
|
|
transformation = WordSwapEmbedding(max_candidates=50)
|
|
#
|
|
# Don't modify the same word twice or stopwords
|
|
#
|
|
constraints = [
|
|
RepeatModification(),
|
|
StopwordModification()
|
|
]
|
|
#
|
|
# In these experiments, we hold the maximum difference
|
|
# on edit distance (ϵ) to a constant 30 for each sample.
|
|
#
|
|
constraints.append(
|
|
LevenshteinEditDistance(30)
|
|
)
|
|
#
|
|
# Greedily swap words with "Word Importance Ranking".
|
|
#
|
|
search_method = GreedyWordSwapWIR()
|
|
|
|
return Attack(goal_function, constraints, transformation, search_method)
|