1
0
mirror of https://github.com/QData/TextAttack.git synced 2021-10-13 00:05:06 +03:00

clean up ignored flies

This commit is contained in:
uvafan
2019-11-25 14:33:24 -05:00
parent d53d808daa
commit a5409f1dac
129 changed files with 0 additions and 27018 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +0,0 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 2d09ffbcef6e05bce8419451285fcd74
tags: 645f666f9bcd5a90fca523b33c5a78b7

View File

@@ -1,479 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>attacks.attack &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>attacks.attack</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for attacks.attack</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">difflib</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="kn">from</span> <span class="nn">textattack</span> <span class="k">import</span> <span class="n">utils</span> <span class="k">as</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">textattack.constraints</span> <span class="k">import</span> <span class="n">Constraint</span>
<span class="kn">from</span> <span class="nn">textattack.tokenized_text</span> <span class="k">import</span> <span class="n">TokenizedText</span>
<div class="viewcode-block" id="Attack"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack">[docs]</a><span class="k">class</span> <span class="nc">Attack</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An attack generates adversarial examples on text. </span>
<span class="sd"> Args:</span>
<span class="sd"> model: A PyTorch or TensorFlow model to attack</span>
<span class="sd"> constraints: A list of constraints to add to the attack</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">constraints</span><span class="o">=</span><span class="p">[]):</span>
<span class="sd">&quot;&quot;&quot; Initialize an attack object.</span>
<span class="sd"> </span>
<span class="sd"> Attacks can be run multiple times</span>
<span class="sd"> </span>
<span class="sd"> @TODO should `tokenizer` be an additional parameter or should</span>
<span class="sd"> we assume every model has a .tokenizer ?</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
<span class="c1"># Transformation and corresponding constraints.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">constraints</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">constraints</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_constraints</span><span class="p">(</span><span class="n">constraints</span><span class="p">)</span>
<span class="c1"># List of files to output to.</span>
<span class="bp">self</span><span class="o">.</span><span class="n">output_files</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">output_to_terminal</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">output_to_visdom</span> <span class="o">=</span> <span class="kc">False</span>
<div class="viewcode-block" id="Attack.add_output_file"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack.add_output_file">[docs]</a> <span class="k">def</span> <span class="nf">add_output_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> When attack runs, it will output to this file. </span>
<span class="sd"> Args:</span>
<span class="sd"> file (str): The path to the output file</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">directory</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
<span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">output_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">file</span><span class="p">)</span></div>
<div class="viewcode-block" id="Attack.add_constraint"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack.add_constraint">[docs]</a> <span class="k">def</span> <span class="nf">add_constraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Adds a constraint to the attack. </span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> constraint: A constraint to add, see constraints</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If the constraint is not of type :obj:`Constraint`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">constraint</span><span class="p">,</span> <span class="n">Constraint</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Cannot add constraint of type&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">constraint</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">constraint</span><span class="p">)</span></div>
<div class="viewcode-block" id="Attack.add_constraints"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack.add_constraints">[docs]</a> <span class="k">def</span> <span class="nf">add_constraints</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">constraints</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Adds multiple constraints to the attack. </span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> constraints: An iterable of constraints to add, see constraints. </span>
<span class="sd"> Raises:</span>
<span class="sd"> TypeError: If the constraints are not iterable</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Make sure constraints are iterable.</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">iter</span><span class="p">(</span><span class="n">constraints</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">te</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;Constraint list type {type(constraints)} is not iterable.&#39;</span><span class="p">)</span>
<span class="c1"># Store each constraint after validating its type.</span>
<span class="k">for</span> <span class="n">constraint</span> <span class="ow">in</span> <span class="n">constraints</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_constraint</span><span class="p">(</span><span class="n">constraint</span><span class="p">)</span></div>
<div class="viewcode-block" id="Attack.get_transformations"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack.get_transformations">[docs]</a> <span class="k">def</span> <span class="nf">get_transformations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transformation</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">original_text</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Filters a list of transformations by self.constraints. </span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> transformation:</span>
<span class="sd"> text:</span>
<span class="sd"> original text (:obj:`type`, optional): Defaults to None. </span>
<span class="sd"> **kwargs:</span>
<span class="sd"> Returns:</span>
<span class="sd"> A filtered list of transformations where each transformation matches the constraints</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">transformations</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">transformation</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span>
<span class="k">for</span> <span class="n">C</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">constraints</span><span class="p">:</span>
<span class="n">transformations</span> <span class="o">=</span> <span class="n">C</span><span class="o">.</span><span class="n">call_many</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">transformations</span><span class="p">,</span> <span class="n">original_text</span><span class="p">)</span>
<span class="k">return</span> <span class="n">transformations</span></div>
<span class="k">def</span> <span class="nf">_attack_one</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">label</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Perturbs `text` to until `self.model` gives a different label</span>
<span class="sd"> than `label`. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_call_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tokenized_text_list</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns model predictions for a list of TokenizedText objects. </span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ids</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">([</span><span class="n">t</span><span class="o">.</span><span class="n">ids</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">tokenized_text_list</span><span class="p">])</span>
<span class="n">ids</span> <span class="o">=</span> <span class="n">ids</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">get_device</span><span class="p">())</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">()</span>
<div class="viewcode-block" id="Attack.attack"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.Attack.attack">[docs]</a> <span class="k">def</span> <span class="nf">attack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Runs an attack on the given dataset and outputs the results to the console and the output file.</span>
<span class="sd"> Args:</span>
<span class="sd"> dataset: An iterable of (label, text) pairs</span>
<span class="sd"> shuffle (:obj:`bool`, optional): Whether to shuffle the data. Defaults to False.</span>
<span class="sd"> Returns:</span>
<span class="sd"> The results of the attack on the dataset</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">shuffle</span><span class="p">:</span>
<span class="n">random</span><span class="o">.</span><span class="n">shuffle</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">label</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">dataset</span><span class="p">:</span>
<span class="n">tokenized_text</span> <span class="o">=</span> <span class="n">TokenizedText</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_attack_one</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_to_terminal</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">result</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">results</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="o">*</span><span class="mi">35</span><span class="p">,</span> <span class="s1">&#39;Result&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span> <span class="s1">&#39;-&#39;</span><span class="o">*</span><span class="mi">35</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">print_</span><span class="p">()</span>
<span class="nb">print</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_files</span><span class="p">:</span>
<span class="k">for</span> <span class="n">output_file</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_files</span><span class="p">:</span>
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="n">output_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">output_to_visdom</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="o">*</span><span class="mi">80</span><span class="p">)</span>
<span class="k">return</span> <span class="n">results</span></div></div>
<div class="viewcode-block" id="AttackResult"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.AttackResult">[docs]</a><span class="k">class</span> <span class="nc">AttackResult</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Result of an Attack run on a single (label, text_input) pair. </span>
<span class="sd"> Args:</span>
<span class="sd"> original_text (str): The original text</span>
<span class="sd"> perturbed_text (str): The perturbed text resulting from the attack</span>
<span class="sd"> original_label (int): he classification label of the original text</span>
<span class="sd"> perturbed_label (int): The classification label of the perturbed text</span>
<span class="sd"> </span>
<span class="sd"> @TODO support attacks that fail (no perturbed label/text)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original_text</span><span class="p">,</span> <span class="n">perturbed_text</span><span class="p">,</span> <span class="n">original_label</span><span class="p">,</span>
<span class="n">perturbed_label</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">original_text</span> <span class="o">=</span> <span class="n">original_text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">perturbed_text</span> <span class="o">=</span> <span class="n">perturbed_text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">original_label</span> <span class="o">=</span> <span class="n">original_label</span>
<span class="bp">self</span><span class="o">.</span><span class="n">perturbed_label</span> <span class="o">=</span> <span class="n">perturbed_label</span>
<span class="k">def</span> <span class="nf">__data__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">original_text</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">original_label</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">perturbed_text</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">perturbed_label</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">data</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__data__</span><span class="p">())</span>
<div class="viewcode-block" id="AttackResult.diff"><a class="viewcode-back" href="../../attacks/attack.html#attacks.attack.AttackResult.diff">[docs]</a> <span class="k">def</span> <span class="nf">diff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Highlights the difference between two texts using color.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_color</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">color_text_terminal</span>
<span class="n">t1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">original_text</span>
<span class="n">t2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">perturbed_text</span>
<span class="n">words1</span> <span class="o">=</span> <span class="n">t1</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="n">words2</span> <span class="o">=</span> <span class="n">t2</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="n">c1</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">color_from_label</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">original_label</span><span class="p">)</span>
<span class="n">c2</span> <span class="o">=</span> <span class="n">utils</span><span class="o">.</span><span class="n">color_from_label</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">perturbed_label</span><span class="p">)</span>
<span class="n">new_is</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">new_w1s</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">new_w2s</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">words1</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">words2</span><span class="p">))):</span>
<span class="n">w1</span> <span class="o">=</span> <span class="n">words1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">w2</span> <span class="o">=</span> <span class="n">words2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="n">w1</span> <span class="o">!=</span> <span class="n">w2</span><span class="p">:</span>
<span class="n">new_is</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">new_w1s</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_color</span><span class="p">(</span><span class="n">w1</span><span class="p">,</span> <span class="n">c1</span><span class="p">))</span>
<span class="n">new_w2s</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_color</span><span class="p">(</span><span class="n">w2</span><span class="p">,</span> <span class="n">c2</span><span class="p">))</span>
<span class="n">t1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">original_text</span><span class="o">.</span><span class="n">replace_words_at_indices</span><span class="p">(</span><span class="n">new_is</span><span class="p">,</span> <span class="n">new_w1s</span><span class="p">)</span>
<span class="n">t2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">original_text</span><span class="o">.</span><span class="n">replace_words_at_indices</span><span class="p">(</span><span class="n">new_is</span><span class="p">,</span> <span class="n">new_w2s</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">t1</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">t2</span><span class="p">))</span></div>
<span class="k">def</span> <span class="nf">print_</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">original_label</span><span class="p">),</span> <span class="s1">&#39;--&gt;&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">perturbed_label</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">diff</span><span class="p">()))</span></div>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">textattack.attacks</span> <span class="k">as</span> <span class="nn">attacks</span>
<span class="kn">import</span> <span class="nn">textattack.constraints</span> <span class="k">as</span> <span class="nn">constraints</span>
<span class="kn">from</span> <span class="nn">textattack.datasets</span> <span class="k">import</span> <span class="n">YelpSentiment</span>
<span class="kn">from</span> <span class="nn">textattack.models</span> <span class="k">import</span> <span class="n">BertForSentimentClassification</span>
<span class="kn">from</span> <span class="nn">textattack.transformations</span> <span class="k">import</span> <span class="n">WordSwapCounterfit</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="c1"># Only use one GPU, if we have one.</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;CUDA_VISIBLE_DEVICES&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;0&#39;</span>
<span class="c1"># Disable tensorflow logs, except in the case of an error.</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;TF_CPP_MIN_LOG_LEVEL&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;3&#39;</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">BertForSentimentClassification</span><span class="p">()</span>
<span class="n">transformation</span> <span class="o">=</span> <span class="n">WordSwapCounterfit</span><span class="p">(</span><span class="n">max_candidates</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
<span class="n">attack</span> <span class="o">=</span> <span class="n">attacks</span><span class="o">.</span><span class="n">GreedyWordSwapWIR</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">transformation</span><span class="p">)</span>
<span class="n">attack</span><span class="o">.</span><span class="n">add_constraints</span><span class="p">(</span>
<span class="p">(</span>
<span class="n">constraints</span><span class="o">.</span><span class="n">semantics</span><span class="o">.</span><span class="n">GoogleLanguageModel</span><span class="p">(</span><span class="n">top_n</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
<span class="c1"># constraints.syntax.LanguageTool(1),</span>
<span class="c1"># constraints.semantics.UniversalSentenceEncoder(0.9, metric=&#39;cosine&#39;),</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="n">yelp_data</span> <span class="o">=</span> <span class="n">YelpSentiment</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># yelp_data = [</span>
<span class="c1"># (1, &#39;I hate this Restaurant!&#39;), </span>
<span class="c1"># (0, &quot;Texas Jack&#39;s has amazing food.&quot;)</span>
<span class="c1"># ]</span>
<span class="c1"># attack.enable_visdom()</span>
<span class="n">attack</span><span class="o">.</span><span class="n">add_output_file</span><span class="p">(</span><span class="s1">&#39;outputs/test.txt&#39;</span><span class="p">)</span>
<span class="n">attack</span><span class="o">.</span><span class="n">attack</span><span class="p">(</span><span class="n">yelp_data</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,456 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>attacks.genetic_algorithm &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>attacks.genetic_algorithm</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for attacks.genetic_algorithm</h1><div class="highlight"><pre>
<span></span><span class="sd">&#39;&#39;&#39;</span>
<span class="sd">Algorithm from Generating Natural Language Adversarial Examples by Alzantot et. al</span>
<span class="sd">`&lt;arxiv.org/abs/1804.07998&gt;`_</span>
<span class="sd">`&lt;github.com/nesl/nlp_adversarial_examples&gt;`_</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">textattack.attacks</span> <span class="k">import</span> <span class="n">Attack</span><span class="p">,</span> <span class="n">AttackResult</span>
<span class="kn">from</span> <span class="nn">textattack.transformations</span> <span class="k">import</span> <span class="n">WordSwap</span>
<div class="viewcode-block" id="GeneticAlgorithm"><a class="viewcode-back" href="../../attacks/genetic_algorithm.html#attacks.genetic_algorithm.GeneticAlgorithm">[docs]</a><span class="k">class</span> <span class="nc">GeneticAlgorithm</span><span class="p">(</span><span class="n">Attack</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Attacks a model using a genetic algorithm. </span>
<span class="sd"> Args:</span>
<span class="sd"> model: A PyTorch or TensorFlow model to attack.</span>
<span class="sd"> transformation: The type of transformation to use. Should be a subclass of WordSwap. </span>
<span class="sd"> pop_size (:obj:`int`, optional): The population size. Defauls to 20. </span>
<span class="sd"> max_iters (:obj:`int`, optional): The maximum number of iterations to use. Defaults to 100. </span>
<span class="sd"> n1 (:obj:`int`, optinal): The number of similar words. Defaults to 20. </span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If the transformation is not a subclass of WordSwap. </span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">transformation</span><span class="p">,</span> <span class="n">pop_size</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">max_iters</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">n1</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">transformation</span><span class="p">,</span> <span class="n">WordSwap</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;Transformation is of type {type(transformation)}, should be a subclass of WordSwap&#39;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transformation</span> <span class="o">=</span> <span class="n">transformation</span>
<span class="c1"># self.batch_model = batch_model</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_iters</span> <span class="o">=</span> <span class="n">max_iters</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span> <span class="o">=</span> <span class="n">pop_size</span>
<span class="bp">self</span><span class="o">.</span><span class="n">top_n</span> <span class="o">=</span> <span class="n">n1</span> <span class="c1"># similar words</span>
<span class="bp">self</span><span class="o">.</span><span class="n">temp</span> <span class="o">=</span> <span class="mf">0.3</span>
<div class="viewcode-block" id="GeneticAlgorithm.select_best_replacement"><a class="viewcode-back" href="../../attacks/genetic_algorithm.html#attacks.genetic_algorithm.GeneticAlgorithm.select_best_replacement">[docs]</a> <span class="k">def</span> <span class="nf">select_best_replacement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">x_cur</span><span class="p">,</span> <span class="n">x_orig</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">replace_list</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Select the most effective replacement for word at position (pos)</span>
<span class="sd"> in (x_cur) between the words in replace_list.</span>
<span class="sd"> Args:</span>
<span class="sd"> pos:</span>
<span class="sd"> x_cur:</span>
<span class="sd"> x_orig:</span>
<span class="sd"> target:</span>
<span class="sd"> replace_list:</span>
<span class="sd"> Returns:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">orig_words</span> <span class="o">=</span> <span class="n">x_orig</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="n">new_x_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x_cur</span><span class="o">.</span><span class="n">replace_word_at_index</span><span class="p">(</span>
<span class="n">pos</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span> <span class="k">if</span> <span class="n">orig_words</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">!=</span> <span class="n">w</span> <span class="ow">and</span> <span class="n">w</span> <span class="o">!=</span> <span class="s1">&#39;0.0&#39;</span> <span class="k">else</span> <span class="n">x_cur</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">replace_list</span><span class="p">]</span>
<span class="n">new_x_preds</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">(</span><span class="n">new_x_list</span><span class="p">)</span>
<span class="n">new_x_scores</span> <span class="o">=</span> <span class="n">new_x_preds</span><span class="p">[:,</span> <span class="n">target</span><span class="p">]</span>
<span class="n">orig_score</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">([</span><span class="n">x_cur</span><span class="p">])[</span><span class="n">target</span><span class="p">]</span>
<span class="n">new_x_scores</span> <span class="o">=</span> <span class="n">new_x_scores</span> <span class="o">-</span> <span class="n">orig_score</span>
<span class="c1"># Eliminate words that are not that close</span>
<span class="n">new_x_scores</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">top_n</span><span class="p">:]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">10000000</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> if self.use_lm:</span>
<span class="sd"> prefix = &quot;&quot;</span>
<span class="sd"> suffix = None</span>
<span class="sd"> if pos &gt; 0:</span>
<span class="sd"> prefix = self.dataset.inv_dict[x_cur[pos-1]]</span>
<span class="sd"> #</span>
<span class="sd"> orig_word = self.dataset.inv_dict[x_orig[pos]]</span>
<span class="sd"> if self.use_suffix and pos &lt; x_cur.shape[0]-1:</span>
<span class="sd"> if (x_cur[pos+1] != 0):</span>
<span class="sd"> suffix = self.dataset.inv_dict[x_cur[pos+1]]</span>
<span class="sd"> # print(&#39;** &#39;, orig_word)</span>
<span class="sd"> replace_words_and_orig = [</span>
<span class="sd"> self.dataset.inv_dict[w] if w in self.dataset.inv_dict else &#39;UNK&#39; for w in replace_list[:self.top_n]] + [orig_word]</span>
<span class="sd"> # print(replace_words_and_orig)</span>
<span class="sd"> replace_words_lm_scores = self.lm.get_words_probs(</span>
<span class="sd"> prefix, replace_words_and_orig, suffix)</span>
<span class="sd"> # print(replace_words_lm_scores)</span>
<span class="sd"> # for i in range(len(replace_words_and_orig)):</span>
<span class="sd"> # print(replace_words_and_orig[i], &#39; -- &#39;, replace_words_lm_scores[i])</span>
<span class="sd"> # select words</span>
<span class="sd"> new_words_lm_scores = np.array(replace_words_lm_scores[:-1])</span>
<span class="sd"> # abs_diff_lm_scores = np.abs(new_words_lm_scores - replace_words_lm_scores[-1])</span>
<span class="sd"> # rank_replaces_by_lm = np.argsort(abs_diff_lm_scores)</span>
<span class="sd"> rank_replaces_by_lm = np.argsort(-new_words_lm_scores)</span>
<span class="sd"> filtered_words_idx = rank_replaces_by_lm[self.top_n2:]</span>
<span class="sd"> # print(filtered_words_idx)</span>
<span class="sd"> new_x_scores[filtered_words_idx] = -10000000</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">new_x_scores</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">):</span>
<span class="k">return</span> <span class="n">new_x_list</span><span class="p">[</span><span class="n">new_x_scores</span><span class="o">.</span><span class="n">argmax</span><span class="p">()]</span>
<span class="k">return</span> <span class="n">x_cur</span></div>
<div class="viewcode-block" id="GeneticAlgorithm.perturb"><a class="viewcode-back" href="../../attacks/genetic_algorithm.html#attacks.genetic_algorithm.GeneticAlgorithm.perturb">[docs]</a> <span class="k">def</span> <span class="nf">perturb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_cur</span><span class="p">,</span> <span class="n">x_orig</span><span class="p">,</span> <span class="n">neighbors</span><span class="p">,</span> <span class="n">w_select_probs</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
<span class="c1"># Pick a word that is not modified and is not UNK</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Replaces a word that has not been modifired. </span>
<span class="sd"> Args:</span>
<span class="sd"> x_cur:</span>
<span class="sd"> x_orig:</span>
<span class="sd"> neighbors:</span>
<span class="sd"> w_select_probs:</span>
<span class="sd"> target:</span>
<span class="sd"> Returns:</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">x_len</span> <span class="o">=</span> <span class="n">w_select_probs</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">rand_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">x_len</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">w_select_probs</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">diff_set</span> <span class="o">=</span> <span class="n">x_cur</span><span class="o">.</span><span class="n">all_words_diff</span><span class="p">(</span><span class="n">x_orig</span><span class="p">)</span>
<span class="n">num_replaceable_words</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">w_select_probs</span><span class="p">))</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">diff_set</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">num_replaceable_words</span> <span class="ow">and</span> <span class="n">x_cur</span><span class="o">.</span><span class="n">ith_word_diff</span><span class="p">(</span><span class="n">x_orig</span><span class="p">,</span> <span class="n">rand_idx</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39; The condition above has a quick hack to prevent getting stuck in infinite loop while processing too short examples and all words (excluding articles) have been already replaced and still no successful attack is found. A more elegant way to handle this could be implemented in Attack to abort early based on the status of all population members or to improve select_best_replacement by making it stochastic.</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">rand_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">x_len</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">w_select_probs</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">replace_list</span> <span class="o">=</span> <span class="n">neighbors</span><span class="p">[</span><span class="n">rand_idx</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">replace_list</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">top_n</span><span class="p">:</span>
<span class="n">replace_list</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(</span>
<span class="p">(</span><span class="n">replace_list</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">top_n</span> <span class="o">-</span> <span class="n">replace_list</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">select_best_replacement</span><span class="p">(</span><span class="n">rand_idx</span><span class="p">,</span> <span class="n">x_cur</span><span class="p">,</span> <span class="n">x_orig</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">replace_list</span><span class="p">)</span></div>
<div class="viewcode-block" id="GeneticAlgorithm.generate_population"><a class="viewcode-back" href="../../attacks/genetic_algorithm.html#attacks.genetic_algorithm.GeneticAlgorithm.generate_population">[docs]</a> <span class="k">def</span> <span class="nf">generate_population</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x_orig</span><span class="p">,</span> <span class="n">neigbhors_list</span><span class="p">,</span> <span class="n">w_select_probs</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">pop_size</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Generates the population of replacement words. </span>
<span class="sd"> Args:</span>
<span class="sd"> x_orig:</span>
<span class="sd"> neigbhors_list:</span>
<span class="sd"> w_select_probs:</span>
<span class="sd"> target:</span>
<span class="sd"> pop_size:</span>
<span class="sd"> Returns:</span>
<span class="sd"> The population</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">return</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">perturb</span><span class="p">(</span><span class="n">x_orig</span><span class="p">,</span> <span class="n">x_orig</span><span class="p">,</span> <span class="n">neigbhors_list</span><span class="p">,</span> <span class="n">w_select_probs</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">pop_size</span><span class="p">)]</span></div>
<div class="viewcode-block" id="GeneticAlgorithm.crossover"><a class="viewcode-back" href="../../attacks/genetic_algorithm.html#attacks.genetic_algorithm.GeneticAlgorithm.crossover">[docs]</a> <span class="k">def</span> <span class="nf">crossover</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Args:</span>
<span class="sd"> x1:</span>
<span class="sd"> x2:</span>
<span class="sd"> Returns:</span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">indices_to_replace</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">words_to_replace</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">x2_words</span> <span class="o">=</span> <span class="n">x2</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x1</span><span class="o">.</span><span class="n">words</span><span class="p">())):</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mf">0.5</span><span class="p">:</span>
<span class="n">indices_to_replace</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">words_to_replace</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x2_words</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<span class="k">return</span> <span class="n">x1</span><span class="o">.</span><span class="n">replace_words_at_indices</span><span class="p">(</span><span class="n">indices_to_replace</span><span class="p">,</span> <span class="n">words_to_replace</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_get_neighbors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">,</span> <span class="n">original_tokenized_text</span><span class="p">):</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">tokenized_text</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="n">neighbors_list</span> <span class="o">=</span> <span class="p">[[]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">))]</span>
<span class="n">transformations</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_transformations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">transformation</span><span class="p">,</span>
<span class="n">tokenized_text</span><span class="p">,</span>
<span class="n">original_text</span><span class="o">=</span><span class="n">original_tokenized_text</span><span class="p">)</span>
<span class="k">for</span> <span class="n">transformed_text</span> <span class="ow">in</span> <span class="n">transformations</span><span class="p">:</span>
<span class="n">diff_idx</span> <span class="o">=</span> <span class="n">tokenized_text</span><span class="o">.</span><span class="n">first_word_diff_index</span><span class="p">(</span><span class="n">transformed_text</span><span class="p">)</span>
<span class="n">neighbors_list</span><span class="p">[</span><span class="n">diff_idx</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">transformed_text</span><span class="o">.</span><span class="n">words</span><span class="p">()[</span><span class="n">diff_idx</span><span class="p">])</span>
<span class="n">neighbors_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">neighbors_list</span><span class="p">]</span>
<span class="n">neighbors_len</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">neighbors_list</span><span class="p">]</span>
<span class="n">w_select_probs</span> <span class="o">=</span> <span class="n">neighbors_len</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">neighbors_len</span><span class="p">)</span>
<span class="k">return</span> <span class="n">neighbors_list</span><span class="p">,</span> <span class="n">w_select_probs</span>
<span class="k">def</span> <span class="nf">_attack_one</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original_label</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">):</span>
<span class="n">target</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">original_label</span>
<span class="n">original_tokenized_text</span> <span class="o">=</span> <span class="n">tokenized_text</span>
<span class="n">neighbors_list</span><span class="p">,</span> <span class="n">w_select_probs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_neighbors</span><span class="p">(</span>
<span class="n">tokenized_text</span><span class="p">,</span> <span class="n">original_tokenized_text</span><span class="p">)</span>
<span class="n">pop</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_population</span><span class="p">(</span>
<span class="n">original_tokenized_text</span><span class="p">,</span> <span class="n">neighbors_list</span><span class="p">,</span> <span class="n">w_select_probs</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_iters</span><span class="p">):</span>
<span class="n">pop_preds</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">(</span><span class="n">pop</span><span class="p">)</span>
<span class="n">pop_scores</span> <span class="o">=</span> <span class="n">pop_preds</span><span class="p">[:,</span> <span class="n">target</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\t\t</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="s1">&#39; -- &#39;</span><span class="p">,</span> <span class="n">pop_scores</span><span class="o">.</span><span class="n">max</span><span class="p">())</span>
<span class="n">top_attack</span> <span class="o">=</span> <span class="n">pop_scores</span><span class="o">.</span><span class="n">argmax</span><span class="p">()</span>
<span class="n">logits</span> <span class="o">=</span> <span class="p">(</span><span class="n">pop_scores</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">temp</span><span class="p">)</span><span class="o">.</span><span class="n">exp</span><span class="p">()</span>
<span class="n">select_probs</span> <span class="o">=</span> <span class="p">(</span><span class="n">logits</span> <span class="o">/</span> <span class="n">logits</span><span class="o">.</span><span class="n">sum</span><span class="p">())</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span><span class="o">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="n">top_attack_probs</span> <span class="o">=</span> <span class="n">pop_preds</span><span class="p">[</span><span class="n">top_attack</span><span class="p">,</span> <span class="p">:]</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span>
<span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">top_attack_probs</span><span class="p">)</span> <span class="o">==</span> <span class="n">target</span><span class="p">:</span>
<span class="k">return</span> <span class="n">AttackResult</span><span class="p">(</span>
<span class="n">original_tokenized_text</span><span class="p">,</span>
<span class="n">pop</span><span class="p">[</span><span class="n">top_attack</span><span class="p">],</span>
<span class="n">original_label</span><span class="p">,</span>
<span class="n">target</span>
<span class="p">)</span>
<span class="n">elite</span> <span class="o">=</span> <span class="p">[</span><span class="n">pop</span><span class="p">[</span><span class="n">top_attack</span><span class="p">]]</span> <span class="c1"># elite</span>
<span class="c1"># print(select_probs.shape)</span>
<span class="n">parent1_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">select_probs</span><span class="p">)</span>
<span class="n">parent2_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">select_probs</span><span class="p">)</span>
<span class="n">initial_children</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">crossover</span><span class="p">(</span><span class="n">pop</span><span class="p">[</span><span class="n">parent1_idx</span><span class="p">[</span><span class="n">i</span><span class="p">]],</span>
<span class="n">pop</span><span class="p">[</span><span class="n">parent2_idx</span><span class="p">[</span><span class="n">i</span><span class="p">]])</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pop_size</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span>
<span class="n">children</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">initial_children</span><span class="p">:</span>
<span class="n">neighbors_list</span><span class="p">,</span> <span class="n">w_select_probs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_neighbors</span><span class="p">(</span>
<span class="n">child</span><span class="p">,</span> <span class="n">original_tokenized_text</span><span class="p">)</span>
<span class="n">children</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">perturb</span><span class="p">(</span>
<span class="n">child</span><span class="p">,</span> <span class="n">original_tokenized_text</span><span class="p">,</span> <span class="n">neighbors_list</span><span class="p">,</span> <span class="n">w_select_probs</span><span class="p">,</span> <span class="n">target</span><span class="p">))</span>
<span class="n">pop</span> <span class="o">=</span> <span class="n">elite</span> <span class="o">+</span> <span class="n">children</span>
<span class="k">return</span> <span class="n">AttackResult</span><span class="p">(</span>
<span class="n">original_tokenized_text</span><span class="p">,</span>
<span class="n">pop</span><span class="p">[</span><span class="n">top_attack</span><span class="p">],</span>
<span class="n">original_label</span><span class="p">,</span>
<span class="n">target</span>
<span class="p">)</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,270 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>attacks.greedy_word_swap &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>attacks.greedy_word_swap</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for attacks.greedy_word_swap</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">textattack.attacks</span> <span class="k">import</span> <span class="n">Attack</span><span class="p">,</span> <span class="n">AttackResult</span>
<div class="viewcode-block" id="GreedyWordSwap"><a class="viewcode-back" href="../../attacks/greedy_word_swap.html#attacks.greedy_word_swap.GreedyWordSwap">[docs]</a><span class="k">class</span> <span class="nc">GreedyWordSwap</span><span class="p">(</span><span class="n">Attack</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> An attack that greedily chooses from a list of possible </span>
<span class="sd"> perturbations.</span>
<span class="sd"> Args:</span>
<span class="sd"> model: The PyTorch NLP model to attack.</span>
<span class="sd"> transformation: The type of transformation.</span>
<span class="sd"> max_depth (:obj:`int`, optional): The maximum number of words to change. Defaults to 32. </span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">transformation</span><span class="p">,</span> <span class="n">max_depth</span><span class="o">=</span><span class="mi">32</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transformation</span> <span class="o">=</span> <span class="n">transformation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_depth</span> <span class="o">=</span> <span class="n">max_depth</span>
<span class="k">def</span> <span class="nf">_attack_one</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original_label</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">):</span>
<span class="n">original_tokenized_text</span> <span class="o">=</span> <span class="n">tokenized_text</span>
<span class="n">num_words_changed</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">unswapped_word_indices</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">tokenized_text</span><span class="o">.</span><span class="n">words</span><span class="p">())))</span>
<span class="n">new_tokenized_text</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">new_text_label</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">while</span> <span class="n">num_words_changed</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_depth</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">unswapped_word_indices</span><span class="p">):</span>
<span class="n">num_words_changed</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">transformed_text_candidates</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_transformations</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transformation</span><span class="p">,</span>
<span class="n">tokenized_text</span><span class="p">,</span>
<span class="n">indices_to_replace</span><span class="o">=</span><span class="n">unswapped_word_indices</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">transformed_text_candidates</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="c1"># If we did not find any possible perturbations, give up.</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">scores</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">(</span><span class="n">transformed_text_candidates</span><span class="p">)</span>
<span class="c1"># The best choice is the one that minimizes the original class label.</span>
<span class="n">best_index</span> <span class="o">=</span> <span class="n">scores</span><span class="p">[:,</span> <span class="n">original_label</span><span class="p">]</span><span class="o">.</span><span class="n">argmin</span><span class="p">()</span>
<span class="n">new_tokenized_text</span> <span class="o">=</span> <span class="n">transformed_text_candidates</span><span class="p">[</span><span class="n">best_index</span><span class="p">]</span>
<span class="c1"># If we changed the label, break.</span>
<span class="n">new_text_label</span> <span class="o">=</span> <span class="n">scores</span><span class="p">[</span><span class="n">best_index</span><span class="p">]</span><span class="o">.</span><span class="n">argmax</span><span class="p">()</span><span class="o">.</span><span class="n">item</span><span class="p">()</span>
<span class="k">if</span> <span class="n">new_text_label</span> <span class="o">!=</span> <span class="n">original_label</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1"># Otherwise, remove this word from list of words to change and</span>
<span class="c1"># iterate.</span>
<span class="n">word_swap_loc</span> <span class="o">=</span> <span class="n">tokenized_text</span><span class="o">.</span><span class="n">first_word_diff_index</span><span class="p">(</span><span class="n">new_tokenized_text</span><span class="p">)</span>
<span class="n">tokenized_text</span> <span class="o">=</span> <span class="n">new_tokenized_text</span>
<span class="n">unswapped_word_indices</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">word_swap_loc</span><span class="p">)</span>
<span class="k">return</span> <span class="n">AttackResult</span><span class="p">(</span>
<span class="n">original_tokenized_text</span><span class="p">,</span>
<span class="n">new_tokenized_text</span><span class="p">,</span>
<span class="n">original_label</span><span class="p">,</span>
<span class="n">new_text_label</span>
<span class="p">)</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,288 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>attacks.greedy_word_swap_wir &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>attacks.greedy_word_swap_wir</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for attacks.greedy_word_swap_wir</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">textattack.attacks</span> <span class="k">import</span> <span class="n">Attack</span><span class="p">,</span> <span class="n">AttackResult</span>
<span class="kn">import</span> <span class="nn">torch</span>
<div class="viewcode-block" id="GreedyWordSwapWIR"><a class="viewcode-back" href="../../attacks/greedy_word_swap.html#attacks.greedy_word_swap_wir.GreedyWordSwapWIR">[docs]</a><span class="k">class</span> <span class="nc">GreedyWordSwapWIR</span><span class="p">(</span><span class="n">Attack</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An attack that greedily chooses from a list of possible </span>
<span class="sd"> perturbations for each index, after ranking indices by importance.</span>
<span class="sd"> Reimplementation of paper:</span>
<span class="sd"> Is BERT Really Robust? A Strong Baseline for Natural Language Attack on </span>
<span class="sd"> Text Classification and Entailment by Jin et. al, 2019</span>
<span class="sd"> https://github.com/jind11/TextFooler </span>
<span class="sd"> Args:</span>
<span class="sd"> model: The PyTorch NLP model to attack.</span>
<span class="sd"> transformation: The type of transformation.</span>
<span class="sd"> max_depth (:obj:`int`, optional): The maximum number of words to change. Defaults to 32. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">transformation</span><span class="p">,</span> <span class="n">max_depth</span><span class="o">=</span><span class="mi">32</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transformation</span> <span class="o">=</span> <span class="n">transformation</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_depth</span> <span class="o">=</span> <span class="n">max_depth</span>
<span class="k">def</span> <span class="nf">_attack_one</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original_label</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">):</span>
<span class="n">original_tokenized_text</span> <span class="o">=</span> <span class="n">tokenized_text</span>
<span class="n">num_words_changed</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># Sort words by order of importance</span>
<span class="n">orig_probs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">([</span><span class="n">tokenized_text</span><span class="p">])</span>
<span class="n">orig_prob</span> <span class="o">=</span> <span class="n">orig_probs</span><span class="o">.</span><span class="n">max</span><span class="p">()</span>
<span class="n">len_text</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">tokenized_text</span><span class="o">.</span><span class="n">words</span><span class="p">())</span>
<span class="n">leave_one_texts</span> <span class="o">=</span> \
<span class="p">[</span><span class="n">tokenized_text</span><span class="o">.</span><span class="n">replace_word_at_index</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="s1">&#39;[UNKNOWN]&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">len_text</span><span class="p">)]</span>
<span class="n">leave_one_probs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">(</span><span class="n">leave_one_texts</span><span class="p">)</span>
<span class="n">leave_one_probs_argmax</span> <span class="o">=</span> <span class="n">leave_one_probs</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">dim</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">importance_scores</span> <span class="o">=</span> <span class="p">(</span><span class="n">orig_prob</span> <span class="o">-</span> <span class="n">leave_one_probs</span><span class="p">[:,</span> <span class="n">original_label</span><span class="p">]</span>
<span class="o">+</span> <span class="p">(</span><span class="n">leave_one_probs_argmax</span> <span class="o">!=</span> <span class="n">original_label</span><span class="p">)</span><span class="o">.</span><span class="n">float</span><span class="p">()</span> <span class="o">*</span>
<span class="p">(</span><span class="n">leave_one_probs</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">dim</span><span class="o">=-</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="o">-</span> <span class="n">torch</span><span class="o">.</span><span class="n">index_select</span><span class="p">(</span><span class="n">orig_probs</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">leave_one_probs_argmax</span><span class="p">)))</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span><span class="o">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="n">index_order</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">importance_scores</span><span class="p">)</span><span class="o">.</span><span class="n">argsort</span><span class="p">()</span>
<span class="n">new_tokenized_text</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">new_text_label</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">num_words_changed</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_depth</span> <span class="ow">and</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">index_order</span><span class="p">):</span>
<span class="n">transformed_text_candidates</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_transformations</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">transformation</span><span class="p">,</span>
<span class="n">tokenized_text</span><span class="p">,</span>
<span class="n">original_tokenized_text</span><span class="p">,</span>
<span class="n">indices_to_replace</span><span class="o">=</span><span class="p">[</span><span class="n">index_order</span><span class="p">[</span><span class="n">i</span><span class="p">]])</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">transformed_text_candidates</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">num_words_changed</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">scores</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_model</span><span class="p">(</span><span class="n">transformed_text_candidates</span><span class="p">)</span>
<span class="c1"># The best choice is the one that minimizes the original class label.</span>
<span class="n">best_index</span> <span class="o">=</span> <span class="n">scores</span><span class="p">[:,</span> <span class="n">original_label</span><span class="p">]</span><span class="o">.</span><span class="n">argmin</span><span class="p">()</span>
<span class="n">new_tokenized_text</span> <span class="o">=</span> <span class="n">transformed_text_candidates</span><span class="p">[</span><span class="n">best_index</span><span class="p">]</span>
<span class="c1"># If we changed the label, break.</span>
<span class="n">new_text_label</span> <span class="o">=</span> <span class="n">scores</span><span class="p">[</span><span class="n">best_index</span><span class="p">]</span><span class="o">.</span><span class="n">argmax</span><span class="p">()</span><span class="o">.</span><span class="n">item</span><span class="p">()</span>
<span class="k">if</span> <span class="n">new_text_label</span> <span class="o">!=</span> <span class="n">original_label</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">tokenized_text</span> <span class="o">=</span> <span class="n">new_tokenized_text</span>
<span class="k">return</span> <span class="n">AttackResult</span><span class="p">(</span>
<span class="n">original_tokenized_text</span><span class="p">,</span>
<span class="n">new_tokenized_text</span><span class="p">,</span>
<span class="n">original_label</span><span class="p">,</span>
<span class="n">new_text_label</span>
<span class="p">)</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,243 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>constraints.constraint &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>constraints.constraint</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for constraints.constraint</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot; Abstract classes represent constraints on text adversarial examples. </span>
<span class="sd">&quot;&quot;&quot;</span>
<div class="viewcode-block" id="Constraint"><a class="viewcode-back" href="../../constraints/constraint.html#constraints.constraint.Constraint">[docs]</a><span class="k">class</span> <span class="nc">Constraint</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> An abstract class that represents constraints on adversial text examples. </span>
<span class="sd"> A constraint evaluates if (x,x_adv) meets a certain constraint. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="Constraint.call_many"><a class="viewcode-back" href="../../constraints/constraint.html#constraints.constraint.Constraint.call_many">[docs]</a> <span class="k">def</span> <span class="nf">call_many</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">,</span> <span class="n">original_text</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Filters x_adv_list to x_adv where C(x,x_adv) is true.</span>
<span class="sd"> Args:</span>
<span class="sd"> x:</span>
<span class="sd"> x_adv_list:</span>
<span class="sd"> original_text(:obj:`type`, optional): Defaults to None. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Returns True if C(x,x_adv) is true. &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,327 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>constraints.semantics.google_language_model.alzantot_goog_lm &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../../_static/language_data.js"></script>
<script type="text/javascript" src="../../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../../index.html">Module code</a> &raquo;</li>
<li>constraints.semantics.google_language_model.alzantot_goog_lm</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for constraints.semantics.google_language_model.alzantot_goog_lm</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Author: Moustafa Alzantot (malzantot@ucla.edu)</span>
<span class="sd"> All rights reserved.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">tensorflow</span> <span class="k">as</span> <span class="nn">tf</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">google.protobuf</span> <span class="k">import</span> <span class="n">text_format</span>
<span class="kn">import</span> <span class="nn">textattack.constraints.semantics.google_language_model.lm_utils</span> <span class="k">as</span> <span class="nn">lm_utils</span>
<span class="kn">import</span> <span class="nn">textattack.constraints.semantics.google_language_model.lm_data_utils</span> <span class="k">as</span> <span class="nn">lm_data_utils</span>
<span class="n">tf</span><span class="o">.</span><span class="n">get_logger</span><span class="p">()</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="s1">&#39;INFO&#39;</span><span class="p">)</span>
<span class="c1"># @TODO automatically choose between GPU and CPU.</span>
<span class="n">ROOT_FOLDER</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research_OLD/nlp_adversarial_examples_new/goog_lm&#39;</span>
<div class="viewcode-block" id="GoogLMHelper"><a class="viewcode-back" href="../../../../constraints/semantics/google_language_model.html#constraints.semantics.google_language_model.alzantot_goog_lm.GoogLMHelper">[docs]</a><span class="k">class</span> <span class="nc">GoogLMHelper</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> An implementation of `&lt;https://arxiv.org/abs/1804.07998&gt;`_</span>
<span class="sd"> adapted from `&lt;https://github.com/nesl/nlp_adversarial_examples&gt;`_. </span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">PBTXT_PATH</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ROOT_FOLDER</span><span class="p">,</span> <span class="s1">&#39;graph-2016-09-10-gpu.pbtxt&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">CKPT_PATH</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ROOT_FOLDER</span><span class="p">,</span> <span class="s1">&#39;ckpt-*&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">VOCAB_PATH</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ROOT_FOLDER</span><span class="p">,</span> <span class="s1">&#39;vocab-2016-09-10.txt&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">BATCH_SIZE</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">NUM_TIMESTEPS</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">MAX_WORD_LEN</span> <span class="o">=</span> <span class="mi">50</span>
<span class="bp">self</span><span class="o">.</span><span class="n">vocab</span> <span class="o">=</span> <span class="n">lm_data_utils</span><span class="o">.</span><span class="n">CharsVocabulary</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">VOCAB_PATH</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">MAX_WORD_LEN</span><span class="p">)</span>
<span class="k">with</span> <span class="n">tf</span><span class="o">.</span><span class="n">device</span><span class="p">(</span><span class="s2">&quot;/gpu:1&quot;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">graph</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">Graph</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sess</span> <span class="o">=</span> <span class="n">tf</span><span class="o">.</span><span class="n">compat</span><span class="o">.</span><span class="n">v1</span><span class="o">.</span><span class="n">Session</span><span class="p">(</span><span class="n">graph</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">graph</span><span class="p">)</span>
<span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">graph</span><span class="o">.</span><span class="n">as_default</span><span class="p">():</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">lm_utils</span><span class="o">.</span><span class="n">LoadModel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sess</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">graph</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">PBTXT_PATH</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">CKPT_PATH</span><span class="p">)</span>
<div class="viewcode-block" id="GoogLMHelper.get_words_probs"><a class="viewcode-back" href="../../../../constraints/semantics/google_language_model.html#constraints.semantics.google_language_model.alzantot_goog_lm.GoogLMHelper.get_words_probs">[docs]</a> <span class="k">def</span> <span class="nf">get_words_probs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prefix_words</span><span class="p">,</span> <span class="n">list_words</span><span class="p">,</span> <span class="n">suffix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&#39;&#39;&#39;</span>
<span class="sd"> Retrieves the probability of words.</span>
<span class="sd"> Args:</span>
<span class="sd"> prefix_words:</span>
<span class="sd"> list_words:</span>
<span class="sd"> suffix (:obj:`type`, optional): Defaults to None. </span>
<span class="sd"> &#39;&#39;&#39;</span>
<span class="n">targets</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">NUM_TIMESTEPS</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
<span class="n">weights</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">NUM_TIMESTEPS</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prefix_words</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;&lt;S&gt;&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">prefix_words</span> <span class="o">=</span> <span class="s1">&#39;&lt;S&gt; &#39;</span> <span class="o">+</span> <span class="n">prefix_words</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">word_to_id</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">prefix_words</span><span class="o">.</span><span class="n">split</span><span class="p">()]</span>
<span class="n">prefix_char_ids</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">word_to_char_ids</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">prefix_words</span><span class="o">.</span><span class="n">split</span><span class="p">()]</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">NUM_TIMESTEPS</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
<span class="n">char_ids_inputs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">NUM_TIMESTEPS</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">max_word_length</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
<span class="n">samples</span> <span class="o">=</span> <span class="n">prefix</span><span class="p">[:]</span>
<span class="n">char_ids_samples</span> <span class="o">=</span> <span class="n">prefix_char_ids</span><span class="p">[:]</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[</span> <span class="p">[</span><span class="n">samples</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]]</span>
<span class="n">char_ids_inputs</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">char_ids_samples</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">softmax</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;softmax_out&#39;</span><span class="p">],</span>
<span class="n">feed_dict</span><span class="o">=</span><span class="p">{</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;char_inputs_in&#39;</span><span class="p">]:</span> <span class="n">char_ids_inputs</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;inputs_in&#39;</span><span class="p">]:</span> <span class="n">inputs</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;targets_in&#39;</span><span class="p">]:</span> <span class="n">targets</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;target_weights_in&#39;</span><span class="p">]:</span> <span class="n">weights</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">words_ids</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">word_to_id</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">list_words</span><span class="p">]</span>
<span class="n">word_probs</span> <span class="o">=</span><span class="p">[</span><span class="n">softmax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">w_id</span><span class="p">]</span> <span class="k">for</span> <span class="n">w_id</span> <span class="ow">in</span> <span class="n">words_ids</span><span class="p">]</span>
<span class="n">word_probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">word_probs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">suffix</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">suffix_probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="n">word_probs</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">suffix_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">word_to_id</span><span class="p">(</span><span class="n">suffix</span><span class="p">)</span>
<span class="n">suffix_probs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">w_id</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">words_ids</span><span class="p">):</span>
<span class="n">inputs</span> <span class="o">=</span> <span class="p">[[</span><span class="n">w_id</span><span class="p">]]</span>
<span class="n">w_char_ids</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vocab</span><span class="o">.</span><span class="n">word_to_char_ids</span><span class="p">(</span><span class="n">list_words</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span>
<span class="n">char_ids_inputs</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">w_char_ids</span>
<span class="n">softmax</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;softmax_out&#39;</span><span class="p">],</span>
<span class="n">feed_dict</span><span class="o">=</span><span class="p">{</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;char_inputs_in&#39;</span><span class="p">]:</span> <span class="n">char_ids_inputs</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;inputs_in&#39;</span><span class="p">]:</span> <span class="n">inputs</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;targets_in&#39;</span><span class="p">]:</span> <span class="n">targets</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="p">[</span><span class="s1">&#39;target_weights_in&#39;</span><span class="p">]:</span> <span class="n">weights</span>
<span class="p">})</span>
<span class="n">suffix_probs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">softmax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">suffix_id</span><span class="p">])</span>
<span class="n">suffix_probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">suffix_probs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">suffix_probs</span> <span class="o">*</span> <span class="n">word_probs</span></div></div>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
<span class="n">my_lm</span> <span class="o">=</span> <span class="n">LM</span><span class="p">()</span>
<span class="n">list_words</span> <span class="o">=</span> <span class="s1">&#39;play will playing played afternoon&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="s1">&#39;i&#39;</span>
<span class="n">suffix</span> <span class="o">=</span> <span class="s1">&#39;yesterday&#39;</span>
<span class="n">probs</span> <span class="o">=</span> <span class="p">(</span><span class="n">my_lm</span><span class="o">.</span><span class="n">get_words_probs</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">list_words</span><span class="p">,</span> <span class="n">suffix</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">w</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">list_words</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="s1">&#39; - &#39;</span><span class="p">,</span> <span class="n">probs</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,320 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>constraints.semantics.google_language_model.google_language_model &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../../" src="../../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../../_static/language_data.js"></script>
<script type="text/javascript" src="../../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../../genindex.html" />
<link rel="search" title="Search" href="../../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../../index.html">Module code</a> &raquo;</li>
<li>constraints.semantics.google_language_model.google_language_model</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for constraints.semantics.google_language_model.google_language_model</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">defaultdict</span>
<span class="kn">from</span> <span class="nn">textattack.constraints</span> <span class="k">import</span> <span class="n">Constraint</span>
<span class="kn">from</span> <span class="nn">.alzantot_goog_lm</span> <span class="k">import</span> <span class="n">GoogLMHelper</span>
<div class="viewcode-block" id="GoogleLanguageModel"><a class="viewcode-back" href="../../../../constraints/semantics/google_language_model.html#constraints.semantics.google_language_model.google_language_model.GoogleLanguageModel">[docs]</a><span class="k">class</span> <span class="nc">GoogleLanguageModel</span><span class="p">(</span><span class="n">Constraint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Constraint that uses the Google 1 Billion Words Language Model to </span>
<span class="sd"> determine the difference in perplexity between x and x_adv. </span>
<span class="sd"> Args:</span>
<span class="sd"> top_n (int):</span>
<span class="sd"> top_n_per_index (int):</span>
<span class="sd"> print_step (:obj:`bool`, optional): Whether to print each step. Defaults to False. </span>
<span class="sd"> </span>
<span class="sd"> Returns:</span>
<span class="sd"> The :obj:`top_n` sentences.</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If :obj:`top_n` or :obj:`top_n_per_index` are not provided. </span>
<span class="sd"> </span>
<span class="sd"> @TODO allow user to set perplexity threshold; implement __call__.</span>
<span class="sd"> </span>
<span class="sd"> @TODO this use of the language model only really makes sense for </span>
<span class="sd"> adversarial examples based on word swaps</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">top_n</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">top_n_per_index</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">print_step</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">top_n</span> <span class="ow">or</span> <span class="n">top_n_per_index</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Cannot instantiate GoogleLanguageModel without top_n or top_n_per_index&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lm</span> <span class="o">=</span> <span class="n">GoogLMHelper</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">top_n</span> <span class="o">=</span> <span class="n">top_n</span>
<span class="bp">self</span><span class="o">.</span><span class="n">top_n_per_index</span> <span class="o">=</span> <span class="n">top_n_per_index</span>
<span class="bp">self</span><span class="o">.</span><span class="n">print_step</span> <span class="o">=</span> <span class="n">print_step</span>
<div class="viewcode-block" id="GoogleLanguageModel.call_many"><a class="viewcode-back" href="../../../../constraints/semantics/google_language_model.html#constraints.semantics.google_language_model.google_language_model.GoogleLanguageModel.call_many">[docs]</a> <span class="k">def</span> <span class="nf">call_many</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">,</span> <span class="n">original_text</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the `top_n` of x_adv_list, as evaluated by the language </span>
<span class="sd"> model. </span>
<span class="sd"> Args:</span>
<span class="sd"> x:</span>
<span class="sd"> X_adv_list:</span>
<span class="sd"> original_text (:obj:`type`, optional): Defaults to None. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">x_adv_list</span><span class="p">):</span> <span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">get_probs</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">):</span>
<span class="n">word_swap_index</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">first_word_diff_index</span><span class="p">(</span><span class="n">x_adv_list</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">text_until_word_index</span><span class="p">(</span><span class="n">word_swap_index</span><span class="p">)</span>
<span class="n">swapped_words</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">t</span><span class="o">.</span><span class="n">words</span><span class="p">()[</span><span class="n">word_swap_index</span><span class="p">]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">x_adv_list</span><span class="p">])</span>
<span class="n">suffix</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">text_after_word_index</span><span class="p">(</span><span class="n">word_swap_index</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">print_step</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">swapped_words</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
<span class="n">probs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">lm</span><span class="o">.</span><span class="n">get_words_probs</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">swapped_words</span><span class="p">,</span> <span class="n">suffix</span><span class="p">)</span>
<span class="k">return</span> <span class="n">probs</span>
<span class="c1"># This creates a dictionary where each new key is initialized to [].</span>
<span class="n">word_swap_index_map</span> <span class="o">=</span> <span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
<span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">x_adv</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">x_adv_list</span><span class="p">):</span>
<span class="n">word_swap_index</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">first_word_diff_index</span><span class="p">(</span><span class="n">x_adv</span><span class="p">)</span>
<span class="n">word_swap_index_map</span><span class="p">[</span><span class="n">word_swap_index</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">idx</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">))</span>
<span class="n">probs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">word_swap_index</span><span class="p">,</span> <span class="n">item_list</span> <span class="ow">in</span> <span class="n">word_swap_index_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="c1"># zip(*some_list) is the inverse operator of zip!</span>
<span class="n">item_indices</span><span class="p">,</span> <span class="n">this_x_adv_list</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">item_list</span><span class="p">)</span>
<span class="n">t1</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">probs_of_swaps_at_index</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">item_indices</span><span class="p">,</span> <span class="n">get_probs</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">this_x_adv_list</span><span class="p">)))</span>
<span class="c1"># Sort by probability in descending order and take the top n for this index.</span>
<span class="n">probs_of_swaps_at_index</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="o">-</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">top_n_per_index</span><span class="p">:</span>
<span class="n">probs_of_swaps_at_index</span> <span class="o">=</span> <span class="n">probs_of_swaps_at_index</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">top_n_per_index</span><span class="p">]</span>
<span class="n">probs</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">probs_of_swaps_at_index</span><span class="p">)</span>
<span class="n">t2</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">print_step</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;LM {len(item_list)} items in {t2-t1}s&#39;</span><span class="p">)</span>
<span class="c1"># Probs is a list of (index, prob) where index is the corresponding </span>
<span class="c1"># position in x_adv_list.</span>
<span class="n">probs</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># Now that they&#39;re in order, reduce to just a list of probabilities.</span>
<span class="n">probs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">probs</span><span class="p">)))</span>
<span class="c1"># Get the indices of the maximum elements.</span>
<span class="n">max_el_indices</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="o">-</span><span class="n">probs</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">top_n</span><span class="p">:</span>
<span class="n">max_el_indices</span> <span class="o">=</span> <span class="n">max_el_indices</span><span class="p">[:</span><span class="bp">self</span><span class="o">.</span><span class="n">top_n</span><span class="p">]</span>
<span class="c1"># Put indices in order, now, so that the examples are returned in the</span>
<span class="c1"># same order they were passed in.</span>
<span class="n">max_el_indices</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x_adv_list</span><span class="p">)[</span><span class="n">max_el_indices</span><span class="p">]</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,350 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>constraints.semantics.universal_sentence_encoder &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">Module code</a> &raquo;</li>
<li>constraints.semantics.universal_sentence_encoder</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for constraints.semantics.universal_sentence_encoder</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">from</span> <span class="nn">textattack.constraints</span> <span class="k">import</span> <span class="n">Constraint</span>
<span class="kn">from</span> <span class="nn">textattack.models</span> <span class="k">import</span> <span class="n">InferSent</span>
<span class="kn">from</span> <span class="nn">textattack.utils</span> <span class="k">import</span> <span class="n">download_if_needed</span><span class="p">,</span> <span class="n">get_device</span>
<div class="viewcode-block" id="UniversalSentenceEncoder"><a class="viewcode-back" href="../../../constraints/semantics/semantics.html#constraints.semantics.universal_sentence_encoder.UniversalSentenceEncoder">[docs]</a><span class="k">class</span> <span class="nc">UniversalSentenceEncoder</span><span class="p">(</span><span class="n">Constraint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Constraint using cosine similarity between Universal Sentence Encodings</span>
<span class="sd"> of x and x_adv where the text embeddings are created using InferSent.</span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> threshold (:obj:`float`, optional): The threshold for the constraint to bet met.</span>
<span class="sd"> Defaults to 0.8</span>
<span class="sd"> metric (:obj:`str`, optional): The metric function to use. Must be one of TODO. </span>
<span class="sd"> Defaults to cosine. </span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If :obj:`metric` is not supported</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">MODEL_PATH</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research/text_attacks/RobustNLP/AttackGeneration/infersent-encoder&#39;</span>
<span class="n">WORD_EMBEDDING_PATH</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research/text_attacks/RobustNLP/AttackGeneration/word_embeddings&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mf">0.8</span><span class="p">,</span> <span class="n">metric</span><span class="o">=</span><span class="s1">&#39;cosine&#39;</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">threshold</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_infersent_model</span><span class="p">()</span>
<span class="k">if</span> <span class="n">metric</span><span class="o">==</span><span class="s1">&#39;cosine&#39;</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dist</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">CosineSimilarity</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;Unsupported metric </span><span class="si">{metric}</span><span class="s1">.&#39;</span><span class="p">)</span>
<div class="viewcode-block" id="UniversalSentenceEncoder.get_infersent_model"><a class="viewcode-back" href="../../../constraints/semantics/semantics.html#constraints.semantics.universal_sentence_encoder.UniversalSentenceEncoder.get_infersent_model">[docs]</a> <span class="k">def</span> <span class="nf">get_infersent_model</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieves the InferSent model. </span>
<span class="sd"> Returns:</span>
<span class="sd"> The pretrained InferSent model. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">infersent_version</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">model_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">UniversalSentenceEncoder</span><span class="o">.</span><span class="n">MODEL_PATH</span><span class="p">,</span> <span class="n">f</span><span class="s1">&#39;infersent</span><span class="si">{infersent_version}</span><span class="s1">.pkl&#39;</span><span class="p">)</span>
<span class="n">download_if_needed</span><span class="p">(</span><span class="n">model_path</span><span class="p">)</span>
<span class="n">params_model</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;bsize&#39;</span><span class="p">:</span> <span class="mi">64</span><span class="p">,</span> <span class="s1">&#39;word_emb_dim&#39;</span><span class="p">:</span> <span class="mi">300</span><span class="p">,</span> <span class="s1">&#39;enc_lstm_dim&#39;</span><span class="p">:</span> <span class="mi">2048</span><span class="p">,</span>
<span class="s1">&#39;pool_type&#39;</span><span class="p">:</span> <span class="s1">&#39;max&#39;</span><span class="p">,</span> <span class="s1">&#39;dpout_model&#39;</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="s1">&#39;version&#39;</span><span class="p">:</span> <span class="n">infersent_version</span><span class="p">}</span>
<span class="n">infersent</span> <span class="o">=</span> <span class="n">InferSent</span><span class="p">(</span><span class="n">params_model</span><span class="p">)</span>
<span class="n">infersent</span><span class="o">.</span><span class="n">load_state_dict</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">model_path</span><span class="p">))</span>
<span class="n">W2V_PATH</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">UniversalSentenceEncoder</span><span class="o">.</span><span class="n">WORD_EMBEDDING_PATH</span><span class="p">,</span>
<span class="s1">&#39;fastText&#39;</span><span class="p">,</span> <span class="s1">&#39;crawl-300d-2M.vec&#39;</span><span class="p">)</span>
<span class="n">download_if_needed</span><span class="p">(</span><span class="n">W2V_PATH</span><span class="p">)</span>
<span class="n">infersent</span><span class="o">.</span><span class="n">set_w2v_path</span><span class="p">(</span><span class="n">W2V_PATH</span><span class="p">)</span>
<span class="n">infersent</span><span class="o">.</span><span class="n">build_vocab_k_words</span><span class="p">(</span><span class="n">K</span><span class="o">=</span><span class="mi">100000</span><span class="p">)</span>
<span class="k">return</span> <span class="n">infersent</span></div>
<div class="viewcode-block" id="UniversalSentenceEncoder.score"><a class="viewcode-back" href="../../../constraints/semantics/semantics.html#constraints.semantics.universal_sentence_encoder.UniversalSentenceEncoder.score">[docs]</a> <span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Returns the metric similarity between embeddings of the text and </span>
<span class="sd"> the perturbed text. </span>
<span class="sd"> Args:</span>
<span class="sd"> x (str): The original text</span>
<span class="sd"> x_adv (str): The perturbed text</span>
<span class="sd"> Returns:</span>
<span class="sd"> The similarity between the original and perturbed text using the metric. </span>
<span class="sd"> @TODO should this support multiple sentences for x_adv?</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">original_embedding</span><span class="p">,</span> <span class="n">perturbed_embedding</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">encode</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">],</span> <span class="n">tokenize</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">original_embedding</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">(</span><span class="n">original_embedding</span><span class="p">)</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">get_device</span><span class="p">())</span>
<span class="n">perturbed_embedding</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">(</span><span class="n">perturbed_embedding</span><span class="p">)</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">get_device</span><span class="p">())</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dist</span><span class="p">(</span><span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)(</span><span class="n">original_embedding</span><span class="p">,</span> <span class="n">perturbed_embedding</span><span class="p">)</span></div>
<div class="viewcode-block" id="UniversalSentenceEncoder.score_list"><a class="viewcode-back" href="../../../constraints/semantics/semantics.html#constraints.semantics.universal_sentence_encoder.UniversalSentenceEncoder.score_list">[docs]</a> <span class="k">def</span> <span class="nf">score_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns the metric similarity between the embedding of the text and a list</span>
<span class="sd"> of perturbed text. </span>
<span class="sd"> Args:</span>
<span class="sd"> x (str): The original text</span>
<span class="sd"> x_adv_list (list(str)): A list of perturbed texts</span>
<span class="sd"> Returns:</span>
<span class="sd"> A list with the similarity between the original text and each perturbed text in :obj:`x_adv_list`. </span>
<span class="sd"> If x_adv_list is empty, an empty tensor is returned</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Return an empty tensor if x_adv_list is empty.</span>
<span class="c1"># This prevents us from calling .repeat(x, 0), which throws an</span>
<span class="c1"># error on machines with multiple GPUs (pytorch 1.2).</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x_adv_list</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">([])</span>
<span class="n">x_text</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">text</span>
<span class="n">x_adv_list_text</span> <span class="o">=</span> <span class="p">[</span><span class="n">x_adv</span><span class="o">.</span><span class="n">text</span> <span class="k">for</span> <span class="n">x_adv</span> <span class="ow">in</span> <span class="n">x_adv_list</span><span class="p">]</span>
<span class="n">embeddings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">encode</span><span class="p">([</span><span class="n">x_text</span><span class="p">]</span> <span class="o">+</span> <span class="n">x_adv_list_text</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">original_embedding</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">(</span><span class="n">embeddings</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">get_device</span><span class="p">())</span>
<span class="n">perturbed_embedding</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">tensor</span><span class="p">(</span><span class="n">embeddings</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">get_device</span><span class="p">())</span>
<span class="c1"># Repeat original embedding to size of perturbed embedding.</span>
<span class="n">original_embedding</span> <span class="o">=</span> <span class="n">original_embedding</span><span class="o">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">perturbed_embedding</span><span class="p">),</span><span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dist</span><span class="p">(</span><span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)(</span><span class="n">original_embedding</span><span class="p">,</span> <span class="n">perturbed_embedding</span><span class="p">)</span></div>
<div class="viewcode-block" id="UniversalSentenceEncoder.call_many"><a class="viewcode-back" href="../../../constraints/semantics/semantics.html#constraints.semantics.universal_sentence_encoder.UniversalSentenceEncoder.call_many">[docs]</a> <span class="k">def</span> <span class="nf">call_many</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">,</span> <span class="n">original_text</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Filters the list of perturbed texts so that the similarity between the original text</span>
<span class="sd"> and the perturbed text is greater than the :obj:`threshold`. </span>
<span class="sd"> Args:</span>
<span class="sd"> x (str): The original text</span>
<span class="sd"> x_adv_list (list(str)): A list of perturbed texts</span>
<span class="sd"> original_text(:obj:`type`, optional): Defaults to None. </span>
<span class="sd"> Returns:</span>
<span class="sd"> A filtered list of perturbed texts where each perturbed text meets the similarity threshold. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># @TODO can we rename this function `filter`? (It&#39;s a reserved keyword in python)</span>
<span class="n">scores</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">score_list</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x_adv_list</span><span class="p">)</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">scores</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span><span class="o">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="k">return</span> <span class="n">x_adv_list</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">x_adv</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">score</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">text</span><span class="p">,</span> <span class="n">x_adv</span><span class="o">.</span><span class="n">text</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> </div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,256 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>datasets.dataset &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>datasets.dataset</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for datasets.dataset</h1><div class="highlight"><pre>
<div class="viewcode-block" id="TextAttackDataset"><a class="viewcode-back" href="../../datasets/user_defined_datasets.html#datasets.dataset.TextAttackDataset">[docs]</a><span></span><span class="k">class</span> <span class="nc">TextAttackDataset</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A dataset for text attacks.</span>
<span class="sd"> </span>
<span class="sd"> Any iterable of (label, text_input) pairs qualifies as </span>
<span class="sd"> a TextAttackDataset.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Loads a full dataset from disk. Typically stores tuples in</span>
<span class="sd"> `self.examples`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">examples</span><span class="o">.</span><span class="fm">__iter__</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__next__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">examples</span><span class="o">.</span><span class="fm">__next__</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_load_text_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text_file_name</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Loads (label, text) pairs from a text file. </span>
<span class="sd"> </span>
<span class="sd"> Format must look like:</span>
<span class="sd"> </span>
<span class="sd"> 1 this is a great little ...</span>
<span class="sd"> 0 &quot;i love hot n juicy . ...</span>
<span class="sd"> 0 &quot;\&quot;&quot;this world needs a ...</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">examples</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">raw_line</span> <span class="ow">in</span> <span class="nb">open</span><span class="p">(</span><span class="n">text_file_name</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>
<span class="n">tokens</span> <span class="o">=</span> <span class="n">raw_line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">label</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">text</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="n">examples</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">label</span><span class="p">,</span> <span class="n">text</span><span class="p">))</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="p">:</span> <span class="k">break</span>
<span class="k">return</span> <span class="n">examples</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,234 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>datasets.yelp_sentiment &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>datasets.yelp_sentiment</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for datasets.yelp_sentiment</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">textattack</span> <span class="k">import</span> <span class="n">utils</span> <span class="k">as</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">.dataset</span> <span class="k">import</span> <span class="n">TextAttackDataset</span>
<div class="viewcode-block" id="YelpSentiment"><a class="viewcode-back" href="../../datasets/built-in_datasets.html#datasets.yelp_sentiment.YelpSentiment">[docs]</a><span class="k">class</span> <span class="nc">YelpSentiment</span><span class="p">(</span><span class="n">TextAttackDataset</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Loads the Yelp Sentiment dataset</span>
<span class="sd"> Args:</span>
<span class="sd"> n (int): The number of examples to load</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">DATA_PATH</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research_OLD/TextFooler/data/yelp&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Loads a full dataset from disk. &quot;&quot;&quot;</span>
<span class="n">utils</span><span class="o">.</span><span class="n">download_if_needed</span><span class="p">(</span><span class="n">YelpSentiment</span><span class="o">.</span><span class="n">DATA_PATH</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">examples</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_text_file</span><span class="p">(</span><span class="n">YelpSentiment</span><span class="o">.</span><span class="n">DATA_PATH</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;YelpSentiment loaded&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">examples</span><span class="p">),</span> <span class="s1">&#39;examples...&#39;</span><span class="p">)</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,230 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Overview: module code &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/language_data.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> &raquo;</li>
<li>Overview: module code</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>All modules for which code is available</h1>
<ul><li><a href="attacks/attack.html">attacks.attack</a></li>
<li><a href="attacks/genetic_algorithm.html">attacks.genetic_algorithm</a></li>
<li><a href="attacks/greedy_word_swap.html">attacks.greedy_word_swap</a></li>
<li><a href="attacks/greedy_word_swap_wir.html">attacks.greedy_word_swap_wir</a></li>
<li><a href="constraints/constraint.html">constraints.constraint</a></li>
<li><a href="constraints/semantics/google_language_model/alzantot_goog_lm.html">constraints.semantics.google_language_model.alzantot_goog_lm</a></li>
<li><a href="constraints/semantics/google_language_model/google_language_model.html">constraints.semantics.google_language_model.google_language_model</a></li>
<li><a href="constraints/semantics/universal_sentence_encoder.html">constraints.semantics.universal_sentence_encoder</a></li>
<li><a href="datasets/dataset.html">datasets.dataset</a></li>
<li><a href="datasets/yelp_sentiment.html">datasets.yelp_sentiment</a></li>
<li><a href="models/bert_for_sentiment_classification.html">models.bert_for_sentiment_classification</a></li>
<li><a href="models/infer_sent.html">models.infer_sent</a></li>
<li><a href="transformations/transformation.html">transformations.transformation</a></li>
<li><a href="transformations/word_swap.html">transformations.word_swap</a></li>
<li><a href="transformations/word_swap_counterfit.html">transformations.word_swap_counterfit</a></li>
</ul>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,273 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>models.bert_for_sentiment_classification &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>models.bert_for_sentiment_classification</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for models.bert_for_sentiment_classification</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">transformers.modeling_bert</span> <span class="k">import</span> <span class="n">BertForSequenceClassification</span>
<span class="kn">from</span> <span class="nn">transformers.tokenization_bert</span> <span class="k">import</span> <span class="n">BertTokenizer</span>
<span class="kn">import</span> <span class="nn">textattack.utils</span> <span class="k">as</span> <span class="nn">utils</span>
<span class="kn">import</span> <span class="nn">torch</span>
<div class="viewcode-block" id="BertForSentimentClassification"><a class="viewcode-back" href="../../models/bert.html#models.bert_for_sentiment_classification.BertForSentimentClassification">[docs]</a><span class="k">class</span> <span class="nc">BertForSentimentClassification</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> BERT fine-tuned on the Yelp Sentiment dataset for sentiment classification. </span>
<span class="sd"> Args:</span>
<span class="sd"> max_seq_length(:obj:`int`, optional): Maximum length of a sequence after tokenizing.</span>
<span class="sd"> Defaults to 32.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">MODEL_PATH</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research/text_attacks/RobustNLP/AttackGeneration/models/bert/models/bert-vanilla&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_seq_length</span><span class="o">=</span><span class="mi">32</span><span class="p">):</span>
<span class="n">utils</span><span class="o">.</span><span class="n">download_if_needed</span><span class="p">(</span><span class="n">BertForSentimentClassification</span><span class="o">.</span><span class="n">MODEL_PATH</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">BertForSequenceClassification</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
<span class="n">BertForSentimentClassification</span><span class="o">.</span><span class="n">MODEL_PATH</span><span class="p">,</span>
<span class="n">num_labels</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tokenizer</span> <span class="o">=</span> <span class="n">BertTokenizer</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
<span class="n">BertForSentimentClassification</span><span class="o">.</span><span class="n">MODEL_PATH</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">utils</span><span class="o">.</span><span class="n">get_device</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">eval</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_seq_length</span> <span class="o">=</span> <span class="n">max_seq_length</span>
<div class="viewcode-block" id="BertForSentimentClassification.convert_text_to_ids"><a class="viewcode-back" href="../../models/bert.html#models.bert_for_sentiment_classification.BertForSentimentClassification.convert_text_to_ids">[docs]</a> <span class="k">def</span> <span class="nf">convert_text_to_ids</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_text</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Takes a string input, tokenizes, formats,</span>
<span class="sd"> and returns a tensor with text IDs. </span>
<span class="sd"> </span>
<span class="sd"> Args:</span>
<span class="sd"> input_text (str): The text to tokenize</span>
<span class="sd"> Returns:</span>
<span class="sd"> The ID of the tokenized text</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">tokens</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tokenizer</span><span class="o">.</span><span class="n">tokenize</span><span class="p">(</span><span class="n">input_text</span><span class="p">)</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_seq_length</span><span class="p">:</span>
<span class="n">tokens</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">tokens</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;[CLS]&quot;</span><span class="p">]</span> <span class="o">+</span> <span class="n">tokens</span> <span class="o">+</span> <span class="p">[</span><span class="s2">&quot;[SEP]&quot;</span><span class="p">]</span>
<span class="n">ids</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tokenizer</span><span class="o">.</span><span class="n">convert_tokens_to_ids</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_seq_length</span> <span class="o">+</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">ids</span> <span class="o">=</span> <span class="n">ids</span> <span class="o">+</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># @TODO Is it correct to just pad with zeros?</span>
<span class="k">return</span> <span class="n">ids</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text_ids</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text_ids</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">Tensor</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;Object of type {type(text_ids)} must be of type torch.tensor&#39;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">torch</span><span class="o">.</span><span class="n">no_grad</span><span class="p">():</span>
<span class="n">pred</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">(</span><span class="n">text_ids</span><span class="p">)</span>
<span class="k">return</span> <span class="n">pred</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,481 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>models.infer_sent &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>models.infer_sent</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for models.infer_sent</h1><div class="highlight"><pre>
<span></span><span class="c1"># Copyright (c) 2017-present, Facebook, Inc.</span>
<span class="c1"># All rights reserved.</span>
<span class="c1">#</span>
<span class="c1"># This source code is licensed under the license found in the</span>
<span class="c1"># LICENSE file in the root directory of this source tree.</span>
<span class="c1">#</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">This file contains the definition of encoders used in https://arxiv.org/pdf/1705.02364.pdf</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">import</span> <span class="nn">torch.nn</span> <span class="k">as</span> <span class="nn">nn</span>
<div class="viewcode-block" id="InferSent"><a class="viewcode-back" href="../../models/infer_sent.html#models.infer_sent.InferSent">[docs]</a><span class="k">class</span> <span class="nc">InferSent</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">config</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">InferSent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bsize</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;bsize&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_emb_dim</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;word_emb_dim&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm_dim</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;enc_lstm_dim&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pool_type</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;pool_type&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dpout_model</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;dpout_model&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="s1">&#39;version&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">config</span> <span class="k">else</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;version&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">LSTM</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">word_emb_dim</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm_dim</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">bidirectional</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">dropout</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">dpout_model</span><span class="p">)</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bos</span> <span class="o">=</span> <span class="s1">&#39;&lt;s&gt;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eos</span> <span class="o">=</span> <span class="s1">&#39;&lt;/s&gt;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_pad</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moses_tok</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bos</span> <span class="o">=</span> <span class="s1">&#39;&lt;p&gt;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">eos</span> <span class="o">=</span> <span class="s1">&#39;&lt;/p&gt;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_pad</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">moses_tok</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">is_cuda</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># either all weights are on cpu or they are on gpu</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm</span><span class="o">.</span><span class="n">bias_hh_l0</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">is_cuda</span>
<div class="viewcode-block" id="InferSent.forward"><a class="viewcode-back" href="../../models/infer_sent.html#models.infer_sent.InferSent.forward">[docs]</a> <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sent_tuple</span><span class="p">):</span>
<span class="c1"># sent_len: [max_len, ..., min_len] (bsize)</span>
<span class="c1"># sent: (seqlen x bsize x worddim)</span>
<span class="n">sent</span><span class="p">,</span> <span class="n">sent_len</span> <span class="o">=</span> <span class="n">sent_tuple</span>
<span class="c1"># Sort by length (keep idx)</span>
<span class="n">sent_len_sorted</span><span class="p">,</span> <span class="n">idx_sort</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">sent_len</span><span class="p">)[::</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="o">-</span><span class="n">sent_len</span><span class="p">)</span>
<span class="n">sent_len_sorted</span> <span class="o">=</span> <span class="n">sent_len_sorted</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">idx_unsort</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">idx_sort</span><span class="p">)</span>
<span class="n">idx_sort</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">from_numpy</span><span class="p">(</span><span class="n">idx_sort</span><span class="p">)</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cuda</span><span class="p">()</span> \
<span class="k">else</span> <span class="n">torch</span><span class="o">.</span><span class="n">from_numpy</span><span class="p">(</span><span class="n">idx_sort</span><span class="p">)</span>
<span class="n">sent</span> <span class="o">=</span> <span class="n">sent</span><span class="o">.</span><span class="n">index_select</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">idx_sort</span><span class="p">)</span>
<span class="c1"># Handling padding in Recurrent Networks</span>
<span class="n">sent_packed</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">rnn</span><span class="o">.</span><span class="n">pack_padded_sequence</span><span class="p">(</span><span class="n">sent</span><span class="p">,</span> <span class="n">sent_len_sorted</span><span class="p">)</span>
<span class="n">sent_output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm</span><span class="p">(</span><span class="n">sent_packed</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># seqlen x batch x 2*nhid</span>
<span class="n">sent_output</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">rnn</span><span class="o">.</span><span class="n">pad_packed_sequence</span><span class="p">(</span><span class="n">sent_output</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># Un-sort by length</span>
<span class="n">idx_unsort</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">from_numpy</span><span class="p">(</span><span class="n">idx_unsort</span><span class="p">)</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cuda</span><span class="p">()</span> \
<span class="k">else</span> <span class="n">torch</span><span class="o">.</span><span class="n">from_numpy</span><span class="p">(</span><span class="n">idx_unsort</span><span class="p">)</span>
<span class="n">sent_output</span> <span class="o">=</span> <span class="n">sent_output</span><span class="o">.</span><span class="n">index_select</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">idx_unsort</span><span class="p">)</span>
<span class="c1"># Pooling</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool_type</span> <span class="o">==</span> <span class="s2">&quot;mean&quot;</span><span class="p">:</span>
<span class="n">sent_len</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">FloatTensor</span><span class="p">(</span><span class="n">sent_len</span><span class="o">.</span><span class="n">copy</span><span class="p">())</span><span class="o">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span>
<span class="n">emb</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">sent_output</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">emb</span> <span class="o">=</span> <span class="n">emb</span> <span class="o">/</span> <span class="n">sent_len</span><span class="o">.</span><span class="n">expand_as</span><span class="p">(</span><span class="n">emb</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool_type</span> <span class="o">==</span> <span class="s2">&quot;max&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_pad</span><span class="p">:</span>
<span class="n">sent_output</span><span class="p">[</span><span class="n">sent_output</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1e9</span>
<span class="n">emb</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">sent_output</span><span class="p">,</span> <span class="mi">0</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">emb</span><span class="o">.</span><span class="n">ndimension</span><span class="p">()</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">emb</span> <span class="o">=</span> <span class="n">emb</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">emb</span><span class="o">.</span><span class="n">ndimension</span><span class="p">()</span> <span class="o">==</span> <span class="mi">2</span>
<span class="k">return</span> <span class="n">emb</span></div>
<span class="k">def</span> <span class="nf">set_w2v_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">w2v_path</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">w2v_path</span> <span class="o">=</span> <span class="n">w2v_path</span>
<span class="k">def</span> <span class="nf">get_word_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="c1"># create vocab of words</span>
<span class="n">word_dict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">sentences</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">tokenize</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">tokenize</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">]</span>
<span class="k">for</span> <span class="n">sent</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">:</span>
<span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">sent</span><span class="p">:</span>
<span class="k">if</span> <span class="n">word</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">word_dict</span><span class="p">:</span>
<span class="n">word_dict</span><span class="p">[</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="n">word_dict</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="n">word_dict</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">return</span> <span class="n">word_dict</span>
<span class="k">def</span> <span class="nf">get_w2v</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">word_dict</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;w2v_path&#39;</span><span class="p">),</span> <span class="s1">&#39;w2v path not set&#39;</span>
<span class="c1"># create word_vec with w2v vectors</span>
<span class="n">word_vec</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w2v_path</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
<span class="n">word</span><span class="p">,</span> <span class="n">vec</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">word_dict</span><span class="p">:</span>
<span class="n">word_vec</span><span class="p">[</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">vec</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Found </span><span class="si">%s</span><span class="s1">(/</span><span class="si">%s</span><span class="s1">) words with w2v vectors&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">word_vec</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">word_dict</span><span class="p">)))</span>
<span class="k">return</span> <span class="n">word_vec</span>
<span class="k">def</span> <span class="nf">get_w2v_k</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">K</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;w2v_path&#39;</span><span class="p">),</span> <span class="s1">&#39;w2v path not set&#39;</span>
<span class="c1"># create word_vec with k first w2v vectors</span>
<span class="n">k</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">word_vec</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">w2v_path</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="p">:</span>
<span class="n">word</span><span class="p">,</span> <span class="n">vec</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">k</span> <span class="o">&lt;=</span> <span class="n">K</span><span class="p">:</span>
<span class="n">word_vec</span><span class="p">[</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">vec</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">k</span> <span class="o">&gt;</span> <span class="n">K</span><span class="p">:</span>
<span class="k">if</span> <span class="n">word</span> <span class="ow">in</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]:</span>
<span class="n">word_vec</span><span class="p">[</span><span class="n">word</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fromstring</span><span class="p">(</span><span class="n">vec</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">k</span> <span class="o">&gt;</span> <span class="n">K</span> <span class="ow">and</span> <span class="nb">all</span><span class="p">([</span><span class="n">w</span> <span class="ow">in</span> <span class="n">word_vec</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]]):</span>
<span class="k">break</span>
<span class="k">return</span> <span class="n">word_vec</span>
<span class="k">def</span> <span class="nf">build_vocab</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;w2v_path&#39;</span><span class="p">),</span> <span class="s1">&#39;w2v path not set&#39;</span>
<span class="n">word_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_word_dict</span><span class="p">(</span><span class="n">sentences</span><span class="p">,</span> <span class="n">tokenize</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_w2v</span><span class="p">(</span><span class="n">word_dict</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Vocab size : </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">)))</span>
<span class="c1"># build w2v vocab with k most frequent words</span>
<span class="k">def</span> <span class="nf">build_vocab_k_words</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">K</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;w2v_path&#39;</span><span class="p">),</span> <span class="s1">&#39;w2v path not set&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_w2v_k</span><span class="p">(</span><span class="n">K</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Vocab size : </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">K</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">update_vocab</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;w2v_path&#39;</span><span class="p">),</span> <span class="s1">&#39;warning : w2v path not set&#39;</span>
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;word_vec&#39;</span><span class="p">),</span> <span class="s1">&#39;build_vocab before updating it&#39;</span>
<span class="n">word_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_word_dict</span><span class="p">(</span><span class="n">sentences</span><span class="p">,</span> <span class="n">tokenize</span><span class="p">)</span>
<span class="c1"># keep only new words</span>
<span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">:</span>
<span class="k">if</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">word_dict</span><span class="p">:</span>
<span class="k">del</span> <span class="n">word_dict</span><span class="p">[</span><span class="n">word</span><span class="p">]</span>
<span class="c1"># udpate vocabulary</span>
<span class="k">if</span> <span class="n">word_dict</span><span class="p">:</span>
<span class="n">new_word_vec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_w2v</span><span class="p">(</span><span class="n">word_dict</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_word_vec</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_word_vec</span> <span class="o">=</span> <span class="p">[]</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;New vocab size : </span><span class="si">%s</span><span class="s1"> (added </span><span class="si">%s</span><span class="s1"> words)&#39;</span><span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">new_word_vec</span><span class="p">)))</span>
<span class="k">def</span> <span class="nf">get_batch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">batch</span><span class="p">):</span>
<span class="c1"># sent in batch in decreasing order of lengths</span>
<span class="c1"># batch: (bsize, max_len, word_dim)</span>
<span class="n">embed</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">batch</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">len</span><span class="p">(</span><span class="n">batch</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_emb_dim</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">batch</span><span class="p">)):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">batch</span><span class="p">[</span><span class="n">i</span><span class="p">])):</span>
<span class="n">embed</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">[</span><span class="n">batch</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]]</span>
<span class="k">return</span> <span class="n">torch</span><span class="o">.</span><span class="n">FloatTensor</span><span class="p">(</span><span class="n">embed</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">tokenize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
<span class="kn">from</span> <span class="nn">nltk.tokenize</span> <span class="k">import</span> <span class="n">word_tokenize</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">moses_tok</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">word_tokenize</span><span class="p">(</span><span class="n">s</span><span class="p">))</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot; n&#39;t &quot;</span><span class="p">,</span> <span class="s2">&quot;n &#39;t &quot;</span><span class="p">)</span> <span class="c1"># HACK to get ~MOSES tokenization</span>
<span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">word_tokenize</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">prepare_samples</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">bsize</span><span class="p">,</span> <span class="n">tokenize</span><span class="p">,</span> <span class="n">verbose</span><span class="p">):</span>
<span class="n">sentences</span> <span class="o">=</span> <span class="p">[[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">]</span> <span class="o">+</span> <span class="n">s</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="o">+</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">tokenize</span> <span class="k">else</span>
<span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">]</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">tokenize</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">+</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">]</span>
<span class="n">n_w</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">])</span>
<span class="c1"># filters words without w2v vectors</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">sentences</span><span class="p">)):</span>
<span class="n">s_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">word</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">if</span> <span class="n">word</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">s_f</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">&#39;No words in &quot;</span><span class="si">%s</span><span class="s1">&quot; (idx=</span><span class="si">%s</span><span class="s1">) have w2v vectors. </span><span class="se">\</span>
<span class="s1"> Replacing by &quot;&lt;/s&gt;&quot;..&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sentences</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">i</span><span class="p">))</span>
<span class="n">s_f</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]</span>
<span class="n">sentences</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">s_f</span>
<span class="n">lengths</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">sentences</span><span class="p">])</span>
<span class="n">n_wk</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">lengths</span><span class="p">)</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Nb words kept : </span><span class="si">%s</span><span class="s1">/</span><span class="si">%s</span><span class="s1"> (</span><span class="si">%.1f%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">n_wk</span><span class="p">,</span> <span class="n">n_w</span><span class="p">,</span> <span class="mf">100.0</span> <span class="o">*</span> <span class="n">n_wk</span> <span class="o">/</span> <span class="n">n_w</span><span class="p">,</span> <span class="s1">&#39;%&#39;</span><span class="p">))</span>
<span class="c1"># sort by decreasing length</span>
<span class="n">lengths</span><span class="p">,</span> <span class="n">idx_sort</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">lengths</span><span class="p">)[::</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="o">-</span><span class="n">lengths</span><span class="p">)</span>
<span class="n">sentences</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">sentences</span><span class="p">)[</span><span class="n">idx_sort</span><span class="p">]</span>
<span class="k">return</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">lengths</span><span class="p">,</span> <span class="n">idx_sort</span>
<span class="k">def</span> <span class="nf">encode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sentences</span><span class="p">,</span> <span class="n">bsize</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">tic</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">sentences</span><span class="p">,</span> <span class="n">lengths</span><span class="p">,</span> <span class="n">idx_sort</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prepare_samples</span><span class="p">(</span>
<span class="n">sentences</span><span class="p">,</span> <span class="n">bsize</span><span class="p">,</span> <span class="n">tokenize</span><span class="p">,</span> <span class="n">verbose</span><span class="p">)</span>
<span class="n">embeddings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">stidx</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">sentences</span><span class="p">),</span> <span class="n">bsize</span><span class="p">):</span>
<span class="n">batch</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_batch</span><span class="p">(</span><span class="n">sentences</span><span class="p">[</span><span class="n">stidx</span><span class="p">:</span><span class="n">stidx</span> <span class="o">+</span> <span class="n">bsize</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cuda</span><span class="p">():</span>
<span class="n">batch</span> <span class="o">=</span> <span class="n">batch</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span>
<span class="k">with</span> <span class="n">torch</span><span class="o">.</span><span class="n">no_grad</span><span class="p">():</span>
<span class="n">batch</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">forward</span><span class="p">((</span><span class="n">batch</span><span class="p">,</span> <span class="n">lengths</span><span class="p">[</span><span class="n">stidx</span><span class="p">:</span><span class="n">stidx</span> <span class="o">+</span> <span class="n">bsize</span><span class="p">]))</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span><span class="o">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="n">embeddings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">batch</span><span class="p">)</span>
<span class="n">embeddings</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">embeddings</span><span class="p">)</span>
<span class="c1"># unsort</span>
<span class="n">idx_unsort</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">idx_sort</span><span class="p">)</span>
<span class="n">embeddings</span> <span class="o">=</span> <span class="n">embeddings</span><span class="p">[</span><span class="n">idx_unsort</span><span class="p">]</span>
<span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Speed : </span><span class="si">%.1f</span><span class="s1"> sentences/s (</span><span class="si">%s</span><span class="s1"> mode, bsize=</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
<span class="nb">len</span><span class="p">(</span><span class="n">embeddings</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">tic</span><span class="p">),</span>
<span class="s1">&#39;gpu&#39;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cuda</span><span class="p">()</span> <span class="k">else</span> <span class="s1">&#39;cpu&#39;</span><span class="p">,</span> <span class="n">bsize</span><span class="p">))</span>
<span class="k">return</span> <span class="n">embeddings</span>
<span class="k">def</span> <span class="nf">visualize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sent</span><span class="p">,</span> <span class="n">tokenize</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">sent</span> <span class="o">=</span> <span class="n">sent</span><span class="o">.</span><span class="n">split</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">tokenize</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">tokenize</span><span class="p">(</span><span class="n">sent</span><span class="p">)</span>
<span class="n">sent</span> <span class="o">=</span> <span class="p">[[</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">word</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">sent</span> <span class="k">if</span> <span class="n">word</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_vec</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">]]</span>
<span class="k">if</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sent</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">&#39;No words in &quot;</span><span class="si">%s</span><span class="s1">&quot; have w2v vectors. Replacing </span><span class="se">\</span>
<span class="s1"> by &quot;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&quot;..&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">sent</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">bos</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">eos</span><span class="p">))</span>
<span class="n">batch</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_batch</span><span class="p">(</span><span class="n">sent</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cuda</span><span class="p">():</span>
<span class="n">batch</span> <span class="o">=</span> <span class="n">batch</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span>
<span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">enc_lstm</span><span class="p">(</span><span class="n">batch</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">output</span><span class="p">,</span> <span class="n">idxs</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="c1"># output, idxs = output.squeeze(), idxs.squeeze()</span>
<span class="n">idxs</span> <span class="o">=</span> <span class="n">idxs</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">cpu</span><span class="p">()</span><span class="o">.</span><span class="n">numpy</span><span class="p">()</span>
<span class="n">argmaxs</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">((</span><span class="n">idxs</span> <span class="o">==</span> <span class="n">k</span><span class="p">))</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">sent</span><span class="p">[</span><span class="mi">0</span><span class="p">]))]</span>
<span class="c1"># visualize model</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="n">x</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">sent</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="n">y</span> <span class="o">=</span> <span class="p">[</span><span class="mf">100.0</span> <span class="o">*</span> <span class="n">n</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">argmaxs</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">argmaxs</span><span class="p">]</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">sent</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">bar</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;%&#39;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">&#39;Visualisation of words importance&#39;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">return</span> <span class="n">output</span><span class="p">,</span> <span class="n">idxs</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,227 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transformations.transformation &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>transformations.transformation</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for transformations.transformation</h1><div class="highlight"><pre>
<div class="viewcode-block" id="Transformation"><a class="viewcode-back" href="../../transformations/transformation.html#transformations.transformation.Transformation">[docs]</a><span></span><span class="k">class</span> <span class="nc">Transformation</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An abstract class for transofrming a string of text to produce</span>
<span class="sd"> a potential adversarial example. </span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Returns a list of all possible transformations for `text`.&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,267 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transformations.word_swap &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>transformations.word_swap</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for transformations.word_swap</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">.transformation</span> <span class="k">import</span> <span class="n">Transformation</span>
<span class="kn">from</span> <span class="nn">nltk.corpus</span> <span class="k">import</span> <span class="n">stopwords</span>
<div class="viewcode-block" id="WordSwap"><a class="viewcode-back" href="../../transformations/word_swap.html#transformations.word_swap.WordSwap">[docs]</a><span class="k">class</span> <span class="nc">WordSwap</span><span class="p">(</span><span class="n">Transformation</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An abstract class that takes a sentence and transforms it by replacing</span>
<span class="sd"> some of its words.</span>
<span class="sd"> Other classes can achieve this by inheriting from WordSwap and </span>
<span class="sd"> overriding self._get_replacement_words.</span>
<span class="sd"> Args:</span>
<span class="sd"> replace_stopwords(:obj:`bool`, optional): Whether to replace stopwords. Defaults to False. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">replace_stopwords</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">replace_stopwords</span> <span class="o">=</span> <span class="n">replace_stopwords</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stopwords</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">stopwords</span><span class="o">.</span><span class="n">words</span><span class="p">(</span><span class="s1">&#39;english&#39;</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_get_replacement_words</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">word</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tokenized_text</span><span class="p">,</span> <span class="n">indices_to_replace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a list of all possible transformations for `text`.</span>
<span class="sd"> </span>
<span class="sd"> If indices_to_replace is set, only replaces words at those indices.</span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">words</span> <span class="o">=</span> <span class="n">tokenized_text</span><span class="o">.</span><span class="n">words</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">indices_to_replace</span><span class="p">:</span>
<span class="n">indices_to_replace</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">words</span><span class="p">)))</span>
<span class="n">transformations</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">word_swaps</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">indices_to_replace</span><span class="p">:</span>
<span class="n">word_to_replace</span> <span class="o">=</span> <span class="n">words</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">replace_stopwords</span> <span class="ow">and</span> <span class="n">word_to_replace</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">stopwords</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">replacement_words</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_replacement_words</span><span class="p">(</span><span class="n">word_to_replace</span><span class="p">)</span>
<span class="n">new_tokenized_texts</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">replacement_words</span><span class="p">:</span>
<span class="n">new_tokenized_texts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tokenized_text</span><span class="o">.</span><span class="n">replace_word_at_index</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">r</span><span class="p">))</span>
<span class="n">transformations</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">new_tokenized_texts</span><span class="p">)</span>
<span class="k">return</span> <span class="n">transformations</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,288 +0,0 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>transformations.word_swap_counterfit &mdash; TextAttack 0.0.1 documentation</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> TextAttack
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">User Documentation</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../users/introduction.html">What is TextAttack?</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../users/examples.html">Examples</a></li>
</ul>
<p class="caption"><span class="caption-text">Attack Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/attack.html">Attack Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/greedy_word_swap.html">Greedy Word Swap</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../attacks/genetic_algorithm.html">Genetic Algorithm</a></li>
</ul>
<p class="caption"><span class="caption-text">Models Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../models/bert.html">BERT</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../models/infer_sent.html">InferSent</a></li>
</ul>
<p class="caption"><span class="caption-text">Transformations Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/transformation.html">Transformation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../transformations/word_swap.html">Word Swap</a></li>
</ul>
<p class="caption"><span class="caption-text">Constraints Documentation:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/constraint.html">Constraints</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/semantics.html">Semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../constraints/semantics/google_language_model.html">Google Language Model</a></li>
</ul>
<p class="caption"><span class="caption-text">Datasets:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/built-in_datasets.html">Built-in Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets/user_defined_datasets.html">User-Defined Datasets</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">TextAttack</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</li>
<li>transformations.word_swap_counterfit</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for transformations.word_swap_counterfit</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">textattack</span> <span class="k">import</span> <span class="n">utils</span> <span class="k">as</span> <span class="n">utils</span>
<span class="kn">from</span> <span class="nn">.word_swap</span> <span class="k">import</span> <span class="n">WordSwap</span>
<div class="viewcode-block" id="WordSwapCounterfit"><a class="viewcode-back" href="../../transformations/word_swap.html#transformations.word_swap_counterfit.WordSwapCounterfit">[docs]</a><span class="k">class</span> <span class="nc">WordSwapCounterfit</span><span class="p">(</span><span class="n">WordSwap</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Transforms an input by replacing its words with synonyms in the counter-fitted</span>
<span class="sd"> embedding space. </span>
<span class="sd"> Args:</span>
<span class="sd"> replace_stopwords (:obj:`bool`, optional): Whether to replace the stopwords in the text. Defaults to False. </span>
<span class="sd"> max_candidates (:obj:`int`, optional): The default number of words to replace. Defaults to None. </span>
<span class="sd"> word_embedding_folder (:obj:`str`, optional): The path to the word_embedding folder. Defaults to paragram_300_sl999</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: If the word_embedding_folder is not found. </span>
<span class="sd"> </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">PATH</span> <span class="o">=</span> <span class="s1">&#39;/p/qdata/jm8wx/research/text_attacks/RobustNLP/AttackGeneration/word_embeddings/&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">replace_stopwords</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">max_candidates</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">word_embedding_folder</span><span class="o">=</span><span class="s1">&#39;paragram_300_sl999&#39;</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">replace_stopwords</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_candidates</span> <span class="o">=</span> <span class="n">max_candidates</span>
<span class="k">if</span> <span class="n">word_embedding_folder</span> <span class="o">==</span> <span class="s1">&#39;paragram_300_sl999&#39;</span><span class="p">:</span>
<span class="n">word_embeddings_file</span> <span class="o">=</span> <span class="s1">&#39;paragram_300_sl999.npy&#39;</span>
<span class="n">word_list_file</span> <span class="o">=</span> <span class="s1">&#39;wordlist.pickle&#39;</span>
<span class="n">word_embedding_matrix_file</span> <span class="o">=</span> <span class="s1">&#39;paragramnn.py&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;Could not find word embedding </span><span class="si">{word_embedding}</span><span class="s1">&#39;</span><span class="p">)</span><span class="c1"># Concatenate folder names to create full path.</span>
<span class="n">utils</span><span class="o">.</span><span class="n">download_if_needed</span><span class="p">(</span><span class="n">WordSwapCounterfit</span><span class="o">.</span><span class="n">PATH</span><span class="p">)</span>
<span class="n">word_embeddings_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">WordSwapCounterfit</span><span class="o">.</span><span class="n">PATH</span><span class="p">,</span> <span class="n">word_embedding_folder</span><span class="p">,</span> <span class="n">word_embeddings_file</span><span class="p">)</span>
<span class="n">word_list_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">WordSwapCounterfit</span><span class="o">.</span><span class="n">PATH</span><span class="p">,</span> <span class="n">word_embedding_folder</span><span class="p">,</span> <span class="n">word_list_file</span><span class="p">)</span>
<span class="n">word_embedding_matrix_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">WordSwapCounterfit</span><span class="o">.</span><span class="n">PATH</span><span class="p">,</span> <span class="n">word_embedding_folder</span><span class="p">,</span> <span class="n">word_embedding_matrix_file</span><span class="p">)</span>
<span class="c1"># Actually load the files from disk.</span>
<span class="n">word_embeddings</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">word_embeddings_file</span><span class="p">)</span>
<span class="n">word_embedding_word2index</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">word_list_file</span><span class="p">,</span> <span class="n">allow_pickle</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">word_embedding_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">word_embedding_matrix_file</span><span class="p">)</span>
<span class="c1"># Build glove dict and index.</span>
<span class="n">word_embedding_index2word</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">word</span><span class="p">,</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">word_embedding_word2index</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">word_embedding_index2word</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">word</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_embeddings</span> <span class="o">=</span> <span class="n">word_embeddings</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nn</span> <span class="o">=</span> <span class="n">word_embedding_matrix</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_embedding_index2word</span> <span class="o">=</span> <span class="n">word_embedding_index2word</span>
<span class="bp">self</span><span class="o">.</span><span class="n">word_embedding_word2index</span> <span class="o">=</span> <span class="n">word_embedding_word2index</span>
<span class="k">def</span> <span class="nf">_get_replacement_words</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">word</span><span class="p">,</span> <span class="n">max_candidates</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd"> Returns a list of possible &#39;candidate words&#39; to replace a word in a sentence </span>
<span class="sd"> or phrase. </span>
<span class="sd"> </span>
<span class="sd"> Based on nearest neighbors selected word embeddings.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_candidates</span><span class="p">:</span>
<span class="n">max_candidates</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">max_candidates</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_candidates</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">word_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">word_embedding_word2index</span><span class="p">[</span><span class="n">word</span><span class="p">]</span>
<span class="n">nnids</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nn</span><span class="p">[</span><span class="n">word_id</span><span class="p">][</span><span class="mi">1</span><span class="p">:</span><span class="n">max_candidates</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
<span class="n">candidate_words</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">wi</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">nnids</span><span class="p">):</span>
<span class="n">candidate_words</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">word_embedding_index2word</span><span class="p">[</span><span class="n">wi</span><span class="p">])</span>
<span class="k">return</span> <span class="n">candidate_words</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="c1"># This word is not in our word embedding database, so return an empty list.</span>
<span class="k">return</span> <span class="p">[]</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, UVA QData Lab
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

View File

@@ -1,6 +0,0 @@
=====================
Attack Documentation
=====================
.. automodule:: attacks.attack
:members:

View File

@@ -1,6 +0,0 @@
===================
Genetic Algorithm
===================
.. automodule:: attacks.genetic_algorithm
:members:

View File

@@ -1,9 +0,0 @@
===================
Greedy Word Swap
===================
.. automodule:: attacks.greedy_word_swap
:members:
.. automodule:: attacks.greedy_word_swap_wir
:members:

View File

@@ -1,6 +0,0 @@
============
Constraints
============
.. automodule:: constraints.constraint
:members:

View File

@@ -1,9 +0,0 @@
=========================
Google Language Model
=========================
.. automodule:: constraints.semantics.google_language_model.google_language_model
:members:
.. automodule:: constraints.semantics.google_language_model.alzantot_goog_lm
:members:

View File

@@ -1,11 +0,0 @@
===========
Semantics
===========
Semantic constraints.
Universal Sentence Encoder
##########################
.. automodule:: constraints.semantics.universal_sentence_encoder
:members:

View File

@@ -1,9 +0,0 @@
===================
Built-in Datasets
===================
Yelp Sentiment
###############
.. automodule:: datasets.yelp_sentiment
:members:

View File

@@ -1,6 +0,0 @@
======================
User-Defined Datasets
======================
.. automodule:: datasets.dataset
:members:

View File

@@ -1,61 +0,0 @@
.. TextAttack documentation master file, created by
sphinx-quickstart on Sat Oct 19 20:54:30 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to TextAttack's documentation!
======================================
.. toctree::
:maxdepth: 2
:caption: User Documentation
users/introduction
users/installation
users/examples
.. toctree::
:maxdepth: 2
:caption: Attack Documentation:
attacks/attack
attacks/greedy_word_swap
attacks/genetic_algorithm
.. toctree::
:maxdepth: 2
:caption: Models Documentation:
models/bert.rst
models/infer_sent.rst
.. toctree::
:maxdepth: 2
:caption: Transformations Documentation:
transformations/transformation
transformations/word_swap
.. toctree::
:maxdepth: 2
:caption: Constraints Documentation:
constraints/constraint
constraints/semantics/semantics
constraints/semantics/google_language_model
.. toctree::
:maxdepth: 2
:caption: Datasets:
datasets/built-in_datasets
datasets/user_defined_datasets
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@@ -1,7 +0,0 @@
=====
BERT
=====
.. automodule:: models.bert_for_sentiment_classification
:members:

View File

@@ -1,8 +0,0 @@
=========
InferSent
=========
Adapted from Facebook Research (https://arxiv.org/abs/1705.02364.)
.. automodule:: models.infer_sent
:members:

View File

@@ -1,6 +0,0 @@
================
Transformation
================
.. automodule:: transformations.transformation
:members:

View File

@@ -1,10 +0,0 @@
==========
Word Swap
==========
.. automodule:: transformations.word_swap
:members:
.. automodule:: transformations.word_swap_counterfit
:members:

View File

@@ -1,26 +0,0 @@
=========
Examples
=========
BERT Example
############
.. parsed-literal::
model = BertForSentimentClassification()
transformation = WordSwapCounterfit()
attack = attacks.GreedyWordSwap(model, transformation)
attack.add_constraints(
(
constraints.semantics.UniversalSentenceEncoder(0.9, metric='cosine'),
)
)
yelp_data = YelpSentiment(n=2)
attack.add_output_file(open('outputs/test.txt', 'w'))
attack.attack(yelp_data, shuffle=False)

View File

@@ -1,5 +0,0 @@
==============
Installation
==============
TextAttack must use Python >=3.6

View File

@@ -1,5 +0,0 @@
=====================
What is TextAttack?
=====================
TextAttack is a Python package...

View File

@@ -1,764 +0,0 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > p:first-child,
td > p:first-child {
margin-top: 0px;
}
th > p:last-child,
td > p:last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist td {
vertical-align: top;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
li > p:first-child {
margin-top: 0px;
}
li > p:last-child {
margin-bottom: 0px;
}
dl.footnote > dt,
dl.citation > dt {
float: left;
}
dl.footnote > dd,
dl.citation > dd {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > p:first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
div.code-block-caption {
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
div.code-block-caption + div > div.highlight > pre {
margin-top: 0;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
padding: 1em 1em 0;
}
div.literal-block-wrapper div.highlight {
margin: 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: relative;
left: 0px;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

View File

@@ -1 +0,0 @@
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

File diff suppressed because one or more lines are too long

View File

@@ -1,314 +0,0 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
this.initOnKeyListeners();
}
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined')
return string;
return (typeof translated === 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keyup(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box or textarea
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
}
}
});
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

View File

@@ -1,10 +0,0 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '0.0.1',
LANGUAGE: 'None',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 434 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +0,0 @@
/* sphinx_rtd_theme version 0.4.3 | MIT license */
/* Built 20190212 16:02 */
require=function r(s,a,l){function c(e,n){if(!a[e]){if(!s[e]){var i="function"==typeof require&&require;if(!n&&i)return i(e,!0);if(u)return u(e,!0);var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}var o=a[e]={exports:{}};s[e][0].call(o.exports,function(n){return c(s[e][1][n]||n)},o,o.exports,r,s,a,l)}return a[e].exports}for(var u="function"==typeof require&&require,n=0;n<l.length;n++)c(l[n]);return c}({"sphinx-rtd-theme":[function(n,e,i){var jQuery="undefined"!=typeof window?window.jQuery:n("jquery");e.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(e){var i=this;void 0===e&&(e=!0),i.isRunning||(i.isRunning=!0,jQuery(function(n){i.init(n),i.reset(),i.win.on("hashchange",i.reset),e&&i.win.on("scroll",function(){i.linkScroll||i.winScroll||(i.winScroll=!0,requestAnimationFrame(function(){i.onScroll()}))}),i.win.on("resize",function(){i.winResize||(i.winResize=!0,requestAnimationFrame(function(){i.onResize()}))}),i.onResize()}))},enableSticky:function(){this.enable(!0)},init:function(i){i(document);var t=this;this.navBar=i("div.wy-side-scroll:first"),this.win=i(window),i(document).on("click","[data-toggle='wy-nav-top']",function(){i("[data-toggle='wy-nav-shift']").toggleClass("shift"),i("[data-toggle='rst-versions']").toggleClass("shift")}).on("click",".wy-menu-vertical .current ul li a",function(){var n=i(this);i("[data-toggle='wy-nav-shift']").removeClass("shift"),i("[data-toggle='rst-versions']").toggleClass("shift"),t.toggleCurrent(n),t.hashChange()}).on("click","[data-toggle='rst-current-version']",function(){i("[data-toggle='rst-versions']").toggleClass("shift-up")}),i("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),i("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),i("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),i(".wy-menu-vertical ul").not(".simple").siblings("a").each(function(){var e=i(this);expand=i('<span class="toctree-expand"></span>'),expand.on("click",function(n){return t.toggleCurrent(e),n.stopPropagation(),!1}),e.prepend(expand)})},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),i=e.find('[href="'+n+'"]');if(0===i.length){var t=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(i=e.find('[href="#'+t.attr("id")+'"]')).length&&(i=e.find('[href="#"]'))}0<i.length&&($(".wy-menu-vertical .current").removeClass("current"),i.addClass("current"),i.closest("li.toctree-l1").addClass("current"),i.closest("li.toctree-l1").parent().addClass("current"),i.closest("li.toctree-l1").addClass("current"),i.closest("li.toctree-l2").addClass("current"),i.closest("li.toctree-l3").addClass("current"),i.closest("li.toctree-l4").addClass("current"),i[0].scrollIntoView())}catch(o){console.log("Error expanding nav for anchor",o)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,i=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(i),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",function(){this.linkScroll=!1})},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:e.exports.ThemeNav,StickyNav:e.exports.ThemeNav}),function(){for(var r=0,n=["ms","moz","webkit","o"],e=0;e<n.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[n[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[n[e]+"CancelAnimationFrame"]||window[n[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(n,e){var i=(new Date).getTime(),t=Math.max(0,16-(i-r)),o=window.setTimeout(function(){n(i+t)},t);return r=i+t,o}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()},{jquery:"jquery"}]},{},["sphinx-rtd-theme"]);

View File

@@ -1,297 +0,0 @@
/*
* language_data.js
* ~~~~~~~~~~~~~~~~
*
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
* :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
/* Non-minified version JS is _stemmer.js if file is provided */
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

View File

@@ -1,69 +0,0 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #408080; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */
.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #7D9029 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #A0A000 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

Some files were not shown because too many files have changed in this diff Show More