<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Facial expression recognition on Methods Bites</title>
    <link>https://socialsciencedatalab.mzes.uni-mannheim.de/tags/facial-expression-recognition/</link>
    <description>Recent content in Facial expression recognition on Methods Bites</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Fri, 23 Apr 2021 01:00:00 +0100</lastBuildDate>
    
        <atom:link href="https://socialsciencedatalab.mzes.uni-mannheim.de/tags/facial-expression-recognition/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Extracting Emotions from Faces with Face&#43;&#43; (and Microsoft Azure)</title>
      <link>https://socialsciencedatalab.mzes.uni-mannheim.de/article/extracting-emotions/</link>
      <pubDate>Fri, 23 Apr 2021 01:00:00 +0100</pubDate>
      
      <guid>https://socialsciencedatalab.mzes.uni-mannheim.de/article/extracting-emotions/</guid>
      <description><![CDATA[
        </p>
<p>Images are an increasingly used data source in the social sciences. One application is to extract features from human faces using machine learning algorithms. This blog post provides a guide on using APIs for this task, specifically how to access the services offered by Face++ and the Microsoft Face API. The post walks you through (1) how to gain API access credentials, (2) how to call the Face++ API from R, and (3) how to handle the output. It is based on the talk by <a href="https://twitter.com/TKuentzler">Theresa Küntzler</a>, who introduced the participants of the <a href="https://socialsciencedatalab.mzes.uni-mannheim.de/page/events/">MZES Social Science Data Lab</a> on May 12, 2020, to Extracting Emotions (and more) from Faces with Face++ and Microsoft Azure.</p>
<!-- If applicable: Note with references on related materials -->
<p><em>Note:</em> This blog post provides a summary of Theresa Küntzlers’s workshop in the <a href="https://socialsciencedatalab.mzes.uni-mannheim.de/page/events/">MZES Social Science Data Lab</a>. The original workshop materials, including slides and scripts, are available from our <a href="https://github.com/SocialScienceDataLab/computer-vision-with-facepp-and-microsoft-azure">GitHub</a>.
A live recording of the workshop is available on our <a href="https://www.youtube.com/channel/UCnM2zpHYdOH521e1uwajKrw">YouTube Channel</a>.</p>
<!-- 
Generate an overview of the article 
Note: Section anchors are generated automatically from section headings as 
      hyphenated lower-case labels without special characters; e.g. a section
      title "Why R?" will result in the anchor "#why-r".
-->
<!-- Generate an overview of the article -->
<div id="overview" class="section level5">
<h5>Overview</h5>
<ol style="list-style-type: decimal">
<li><a href="#section1"><strong>Retrieving your API Key and Secret</strong></a>
<ol style="list-style-type: decimal">
<li><a href="#subsection1">Face++ API Key and Secret</a></li>
<li><a href="#subsection12">Azure API Key</a></li>
</ol></li>
<li><a href="#section12"><strong>R Functions</strong></a>
<ol style="list-style-type: decimal">
<li><a href="#subsection21">Function Flow in Pseudocode</a></li>
<li><a href="#subsection22">The Authentification Function</a></li>
<li><a href="#subsection23">API Call Function</a></li>
</ol></li>
<li><a href="#section3"><strong>Making the Call</strong></a></li>
<li><a href="#section4"><strong>Choosing between Face++ and Azure?</strong></a>
<ol style="list-style-type: decimal">
<li><a href="#subsection41">Ethical Considerations</a></li>
</ol></li>
<li><a href="#furtherreadings"><strong>Further readings</strong></a></li>
</ol>
<p>Emotions impact information processing <span class="citation">(e.g. Marcus, Neuman, and MacKuen <a href="#ref-marcus_etal_2000" role="doc-biblioref">2000</a>; Meffert et al. <a href="#ref-meffertetal2006" role="doc-biblioref">2006</a>; Soroka and McAdams <a href="#ref-soroka_mcadams_2015" role="doc-biblioref">2015</a>; Fraser et al. <a href="#ref-fraser_etal_2012" role="doc-biblioref">2012</a>)</span>, attitudes <span class="citation">(e.g. Brader <a href="#ref-brader_2005" role="doc-biblioref">2005</a>; Lerner and Keltner <a href="#ref-lerner_keltner_2000" role="doc-biblioref">2000</a>; Marcus <a href="#ref-marcus_2000" role="doc-biblioref">2000</a>)</span>, and decision making in general <span class="citation">(e.g. Clore, Gasper, and Garvin <a href="#ref-clore_etal_2001" role="doc-biblioref">2001</a>; Pittig et al. <a href="#ref-pittig_etal_2014" role="doc-biblioref">2014</a>; Slovic et al. <a href="#ref-slovic_etal_2007" role="doc-biblioref">2007</a>)</span>. One way of measuring the emotions of a person is by looking at their facial expressions. A new development in this area is its automation, called facial expression recognition (FER). This technique applies machine learning and deep neural networks to the classification of facial expressions in images and videos. Commercial providers give easy access to such tools. In this post, I explain step-by-step how to make use of the provider <a href="https://www.faceplusplus.com">Face++</a>. In a very similar fashion, you can also deploy the service of <a href="https://azure.microsoft.com/en-us/">Mircosoft Azure</a>.</p>
</div>
<div id="retrieving-your-api-key-and-secret" class="section level3">
<h3>Retrieving your API Key and Secret <a name="section1"></a></h3>
<p>To use the services of an API, every user needs to obtain their own access credentials. These credentials are similar to a unique username and a password. For APIs, these are called <strong>API Key</strong> and <strong>API Secret</strong>. You should keep these safely, like any other username and password.</p>
<div id="face-api-key-and-api-secret" class="section level5">
<h5>Face++ API Key and API Secret <a name="subsection11"></a></h5>
<p>To create your API Key and API Secret for <a href="https://www.faceplusplus.com">Face++</a>, you need to first <a href="https://console.faceplusplus.com/register">register with Face++</a>. After logging in with your data, go to the <em>Console</em>, choose <em>Apps</em>, and <em>API Key</em>, and select <em>Get API Key</em>. A form opens, which you need to fill out. As <em>API Key Type</em>, you can choose <em>Free</em> to use the free of cost services. After confirming the form, you should be able to see your personal API Key and API Secret.</p>
</div>
<div id="azure-api-key" class="section level5">
<h5>Azure API Key <a name="subsection12"></a></h5>
<p>The process for <a href="https://azure.microsoft.com/de-de/">Azure</a> is very similar, although you only receive an API Key. Again, first <a href="https://azure.microsoft.com/de-de/">register with Azure</a>. Detailed instructions on how to create your API Key can be found <a href="https://docs.microsoft.com/en-us/azure/search/search-security-api-keys">here</a>. Once this is done, you see your API Key under <em>Portal</em> and the <em>Key</em>-icon.</p>
</div>
</div>
<div id="r-functions" class="section level3">
<h3>R Functions <a name="section2"></a></h3>
<p>In the following, I first show the general flow of the main function with pseudo code. A pseudo code describes the steps of the algorithm in plain language. After that, the actual code is explained in the example of Face++. Accessing Azure works very similarly. The full R-Scripts for API calls to both Face++ and Azure can be retrieved via <a href="https://github.com/SocialScienceDataLab/computer-vision-with-facepp-and-microsoft-azure">GitHub</a>.</p>
<div id="function-flow-in-pseudo-code" class="section level5">
<h5>Function Flow in Pseudo Code <a name="subsection21"></a></h5>
<p>The call function takes two inputs: (1) You have to provide a vector that contains the <code>filepath</code> to the images on your computer and (2) the <code>Authentification</code> object. When calling Face++, a simple function you find below combines your personal API Key and API Secret into one object to put here. When calling Azure, you simply use your API Secret directly. With the vector of file paths a table is created with as many rows as there are files. The vector is one variable. For each variable that should be extracted from each image, an additional empty variable is created. This data table is called <code>faces</code>. Next, a <code>for</code>-loop is started that runs for every image in <code>filepath</code>: In the first step, call the API with the respective image. <code>if</code> a face is found in the image by the API, the information is written into the <code>faces</code> table to the line of the respective <code>filepath</code>. One image may contain multiple faces. <code>if</code> more than one face is found in the image, lines for the different faces are added to the <code>faces</code> table, and the information is stored. In the case of a <em>Free</em> account, the amount of calls is limited per minute. Thus, after each call, the function pauses for two seconds. Then, the call is executed for the next image. When all calls are successful, the function returns the <code>faces</code> data table, which is now filled with all information.</p>
<div class="figure" style="text-align: center"><span id="fig:unnamed-chunk-1"></span>
<img src="/../../../../../article/extracting-emotions/figure/pseudocode.PNG" alt="Pseudo code to showcase how the algorithm works"  />
<p class="caption">
Figure 1: Pseudo code to showcase how the algorithm works
</p>
</div>
</div>
<div id="the-authentification-function" class="section level5">
<h5>The Authentification Function <a name="subsection22"></a></h5>
<p>In a first step, you need to load the necessary packages:</p>
<pre class="r"><code>library(data.table) # Extension of `data.frame`
library(jsonlite)   # A Robust, High Performance JSON Parser and Generator for R
library(httr)       # Tools for Working with URLs and HTTP
library(dplyr)      # A Grammar of Data Manipulation</code></pre>
<p>When calling Face++, use this authentification function <code>authFacepp</code> to merge the API Key and API Secret into one object. The function was written by <a href="https://www.fb03.uni-frankfurt.de/96501325/Sascha_G%C3%B6bel__M_A">Sascha Göbel</a>.</p>
<pre class="r"><code>authFacepp &lt;- function(api_key, api_secret) {
  auth &lt;-
    structure(list(api_key = api_key, api_secret = api_secret), 
              class = &quot;FaceppProxy&quot;)
}
## Note: Function written by Sascha Goebel</code></pre>
</div>
<div id="api-call-function" class="section level5">
<h5>API Call Function <a name="subsection23"></a></h5>
<p>The function that makes the call is named <code>facepp</code>. In the following section, the function is explained bit by bit. The first step matches the input and line 1 in the pseudocode. The function takes the two inputs <code>fullpath</code>, the vector with the file paths, and <code>auth</code>, the authentification object. The <code>faces</code> table is generated, with empty variables for all emotions, two additional variables extracted from Face++, and the vector <code>fullpath</code>. The object <code>face</code> is initialized. This will be used to store the information of a single image before adding it to the <code>faces</code> table.</p>
<pre class="r"><code>facepp &lt;- function(fullpath, auth) {
  ## Initialize Object to store API output for single image
  face &lt;- NULL
  
  ## create empty table to fill with API output
  faces &lt;-
    data.table(
      emo_anger = as.numeric(NA),
      emo_disgust = as.numeric(NA),
      emo_fear = as.numeric(NA),
      emo_happiness = as.numeric(NA),
      emo_neutral = as.numeric(NA),
      emo_sadness = as.numeric(NA),
      emo_surprise = as.numeric(NA),
      gender = as.character(NA),
      facecount = as.numeric(NA),
      fullpath = fullpath
    )</code></pre>
<p>In the next bit of code, lines 2 and 3 of the pseudo code are implemented. A <code>for</code> loop is started, which runs over every element of <code>fullpath</code>. The <code>run</code> counts the number of images that are sent. It then prints the count to the console during the call. This information is added for the user to know the progress of the call. The <code>RETRY</code>-function executes the actual call. The <a href="https://console.faceplusplus.com/documents/5679127">Reference Manual of Face++</a> specifies the information needed to fill in the arguments. It states the “Request Method” as “Post”, thus <code>verb = "POST"</code>, it gives the “Request URL” and the “Request Parameter”, which are specified in the <code>body</code> of the function. The manual specifies required (<code>api_key</code>, <code>api_secret</code>, and <code>image_file</code>) and optional request parameters. In the <code>return_attributes</code>-element, it is specified which variables you would like to obtain from the API. Note that there is no space after the comma in the <code>return_attributes</code>. The result of the call for a single image is stored in <code>face</code>.</p>
<pre class="r"><code>  run &lt;- 0 #running counter of images sent
  for (i in 1:length(fullpath)) {
    run &lt;- run + 1
    cat(run, &quot;\n&quot;)
    while (is.null(face)) {
      try(face &lt;- as.character(
        httr::RETRY(
          verb = &quot;POST&quot;,
          url = &quot;https://api-us.faceplusplus.com/facepp/v3/detect&quot;,
          body = list(
            api_key  = auth$api_key,
            api_secret = auth$api_secret,
            image_file = upload_file(fullpath[i]),
            return_landmark = 0,
            return_attributes = &quot;emotion,gender&quot;
          ),
          times = 2,
          encode = &quot;multipart&quot;
        )
      ),
      silent = FALSE)
    }</code></pre>
<p>To better understand what the API output for a single image looks like, lets print one. The following is the output of an image of Barack Obama that can be found <a href="https://en.wikipedia.org/wiki/Barack_Obama#/media/File:President_Barack_Obama.jpg">here</a>. The output is a character vector in the JSON format. You can spot the information that is added, such as a number given to each emotion value or the predicted gender. JSON files follow specific rules, making it easy to extract the information and write it into the <code>faces</code> table. In R, this can be done with the <a href="https://cran.r-project.org/web/packages/jsonlite/vignettes/json-apis.html"><code>fromJSON</code> function</a> from the <a href="https://cran.r-project.org/web/packages/jsonlite/index.html"><code>jsonlite</code> package</a>.</p>
<pre class="r"><code>print(face)</code></pre>
<pre><code>## [1] &quot;{\&quot;request_id\&quot;:\&quot;1600002798,3c7cc10b-fe59-4fa5-9a1a-e2375a35ceee\&quot;,\&quot;time_used\&quot;:146,\&quot;faces\&quot;:[{\&quot;face_token\&quot;:\&quot;2a46a4591795444441bde5e159469b2a\&quot;,\&quot;face_rectangle\&quot;:{\&quot;top\&quot;:146,\&quot;left\&quot;:300,\&quot;width\&quot;:195,\&quot;height\&quot;:195},\&quot;attributes\&quot;:{\&quot;gender\&quot;:{\&quot;value\&quot;:\&quot;Male\&quot;},\&quot;emotion\&quot;:{\&quot;anger\&quot;:0.000,\&quot;disgust\&quot;:0.000,\&quot;fear\&quot;:0.063,\&quot;happiness\&quot;:99.937,\&quot;neutral\&quot;:0.000,\&quot;sadness\&quot;:0.000,\&quot;surprise\&quot;:0.000}}}],\&quot;image_id\&quot;:\&quot;KdgNW2IvGLbViBZ1ialuLQ==\&quot;,\&quot;face_num\&quot;:1}\n&quot;</code></pre>
<p>Before continuing, it is necessary to check whether a face was found by the API (line 4 in the pseudocode). To so, the number of <code>face_token</code>s is counted. Face++ assigns a unique identifier to each face per image, called <code>face_token</code>. <code>if</code> at least one face token is found, the information is extracted. The values for all emotion variables, for all faces identified in an image, are extracted into the <code>emotion</code> object. The same is done for the gender values into the <code>gender</code> object. Next, the information for the first face is used to fill the empty line in the <code>faces</code> table (line 5 pseudo code). <code>if</code> more than one face is found in the image, the information for all faces found is stored in a <code>data.table</code>. This newly created table is <code>union</code>ed with the <code>faces</code> table. Thereby, all lines that were not in the <code>faces</code> table before being added. The line for the first face of the image is not added since it already exists in <code>faces</code> (lines 6 and 7 in the pseudo code).</p>
<pre class="r"><code>    ## if face is found, extract information and write into data.table
    facecount &lt;- length(fromJSON(face)$faces$face_token)
    
    if (facecount != 0) {
      emotion &lt;- fromJSON(face)$faces$attributes$emotion
      gender &lt;- fromJSON(face)$faces$attributes$gender
      
      ## write info of first face to data.table
      faces[faces$fullpath == fullpath[i],][, 1:9] &lt;-
        c(emotion[1,], gender[1,], facecount)
      
      ## if more than one face found in image, make df with all info and merge
      if (facecount &gt; 1) {
        faces &lt;- dplyr::union(
          x = faces,
          y = data.table(
            emo_anger = emotion[, 1],
            emo_disgust = emotion[, 2],
            emo_fear = emotion[, 3],
            emo_happiness = emotion[, 4],
            emo_neutral = emotion[, 5],
            emo_sadness = emotion[, 6],
            emo_surprise = emotion[, 7],
            gender = gender[, 1],
            facecount = facecount,
            fullpath = fullpath[i]
          )
        )
      }</code></pre>
<p>The end of the <code>facepp</code> contains some housekeeping (lines 10 to 12 in pseudocode): The information in the <code>face</code> object is deleted to avoid overlap with the information from the next image. Whether a face was found or not in the previous image, the function pauses for two seconds. Once all images from the <code>fullpath</code> vector have been sent to the API, the function returns the <code>faces</code> table that contains all information now.</p>
<pre class="r"><code>      face &lt;- NULL
      Sys.sleep(2)
      
    } else {
      #if no face was found
      face &lt;- NULL
      Sys.sleep(2)
    }
  }
  return(faces)
}</code></pre>
<p>An earlier version of this function was written by <a href="https://www.fb03.uni-frankfurt.de/96501325/Sascha_G%C3%B6bel__M_A">Sascha Göbel</a>.</p>
</div>
</div>
<div id="making-the-call" class="section level3">
<h3>Making the Call <a name="section3"></a></h3>
<p>To finally make the call, run the two functions so that they are part of your environment. Then use your API Key and API Secret to call the functions:</p>
<pre class="r"><code>## Fill in your details
myauth &lt;-
  authFacepp(api_key = &quot;[your key]&quot;, api_secret = &quot;[your secret]&quot;)

## Create your vector with filepaths
mypaths &lt;- &quot;[your vector with filepaths to images]&quot;

## Call the function
faces &lt;- facepp(fullpath = mypaths, auth = myauth)</code></pre>
<p>The code is based on the full code that can be found <strong><a href="https://github.com/SocialScienceDataLab/computer-vision-with-facepp-and-microsoft-azure">here</a></strong>.</p>
</div>
<div id="choosing-between-face-and-azure" class="section level3">
<h3>Choosing between Face++ and Azure? <a name="section4"></a></h3>
<p>This article presents two alternative tools for the same task. Both tools have different strengths and weaknesses. In the best case, some of the specific data to be classified as ground truth, for example, from manual coding. To make an informed choice, which of the tools performs better on the specific data, my suggestion would be to try a sample with both tools and compare.
Colleagues and I test and compare Face++, Azure, FaceReader (Noldus Information Technology), and Human coding in a <a href="https://www.frontiersin.org/articles/10.3389/fpsyg.2021.627561/abstract">recently published article at <em>Frontiers in Psychology</em></a> <span class="citation">(Küntzler, Höfling, and Alpers <a href="#ref-kuentzler_2021" role="doc-biblioref">2021</a>)</span>. One of our findings is that all tools perform very well on prototypical facial expressions under good conditions (such as good lighting and frontal camera angle). Errors occur more frequently when the facial expressions are more subtle, or images taken in darker environments. In addition, while Face++ performs much better in face detection (so it is better in ‘finding’ faces in images), Azure does not recognize as many faces. However, Azure shows a better categorization of the emotions in the sample used for our analyses once a face is found.
In sum, choosing the tool that promises the most reliable outcome is an individual decision depending on the data to be classified.</p>
<div id="ethical-considerations" class="section level5">
<h5>Ethical Considerations <a name="subsection41"></a></h5>
<p>When making use of third-party services, I advise to consider additional ethical and data security issues.</p>
<p>First, one should be aware of the fact both Azure and Face++ are offered by for-profit companies, and by using them, one supports their efforts. Problems that can arise here became heavily evident when Megvii Technologies, the company that develops Face++, was associated with China’s mass surveillance system IJOP in Xinjiang. This mass surveillance specifically targets minorities such as <a href="https://www.hrw.org/report/2019/05/01/chinas-algorithms-repression/reverse-engineering-xinjiang-police-mass">Uyghurs and other Turkic Muslims</a>. Later, Human Rights Watch corrected this, stating <a href="https://www.hrw.org/corrections?utm_source=PANTHEON_STRIPPED&amp;utm_medium=PANTHEON_STRIPPED&amp;utm_campaign=PANTHEON_STRIPPED&amp;utm_term=PANTHEON_STRIPPED&amp;utm_referrer=PANTHEON_STRIPPED&amp;page=10">“Face++ seems not to have collaborated in the version of the IJOP app Human Rights Watch examined”</a>.</p>
<p>Second, I wish to highlight that the companies can use the images sent to the API according to their Terms of Service, such as further processing of the user data or potentially using the images sent to the API for internal research. Please read and understand the Terms of Service before using any such tools.</p>
<p>Third, in addition to general performance considerations, artificial intelligence products are currently developed with strong biases with respect to culture, race, gender, and more <span class="citation">(Zou and Schiebinger <a href="#ref-zou_schiebinger_2018" role="doc-biblioref">2018</a>)</span>.</p>
<!-- Add a list of further readings -->
</div>
</div>
<div id="further-reading" class="section level3">
<h3>Further reading <a name="furtherreadings"></a></h3>
<ul>
<li><a href="https://console.faceplusplus.com/documents/5679127">Face++ Reference Manual</a></li>
<li><a href="https://www.youtube.com/watch?v=vT1JzLTH4G4&amp;list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv">Stanford Youtube Class CS231n on “Convolutional Neural Networks for Visual Recognition”</a></li>
</ul>
<!-- Add something about the presenter -->
</div>
<div id="about-the-author-and-presenter" class="section level3">
<h3>About the author and presenter</h3>
<p>Theresa Küntzler <a href="mailto:theresa.kuentzler@uni-konstanz.de"><i class="fa
              fa-envelope"></i> </a>
<a href="https://twitter.com/TKuentzler"><i class="fa
              fa-twitter"></i></a> is a doctoral student at the Graduate School of Decision Sciences at the University of Konstanz. Her research interest covers political communication, political psychology and quantitative research methods.</p>
<!-- Optional: Add references (if bib-file is specified) -->
</div>
<div id="references" class="section level3 unnumbered">
<h3>References</h3>
<div id="refs" class="references">
<div id="ref-brader_2005">
<p>Brader, Ted. 2005. “Striking a Responsive Chord: How Political Ads Motivate and Persuade Voters by Appealing to Emotions.” <em>American Journal of Political Science</em> 49 (2): 388–405.</p>
</div>
<div id="ref-clore_etal_2001">
<p>Clore, Gerald L., Karen Gasper, and Erika Garvin. 2001. “Affect as Information.” In <em>Handbook of Affect and Social Cognition</em>, edited by Joseph P. Forgas, 121–44.</p>
</div>
<div id="ref-fraser_etal_2012">
<p>Fraser, Kristin, Irene Ma, Elise Teteris, Heather Baxter, Bruce Wright, and Kevin McLaughlin. 2012. “Emotion, Cognitive Load and Learning Outcomes During Simulation Training.” <em>Medical Education</em> 46: 1055–26. <a href="https://doi.org/10.1111/j.1365-2923.2012.04355.x">https://doi.org/10.1111/j.1365-2923.2012.04355.x</a>.</p>
</div>
<div id="ref-kuentzler_2021">
<p>Küntzler, Theresa, Tim T. Höfling, and Georg W. Alpers. 2021. “Automatic Facial Expression Recognition in Standardized and Non-Standardized Emotional Expressions.” <em>Frontiers in Psychology</em>. <a href="https://www.frontiersin.org/articles/10.3389/fpsyg.2021.627561/abstract">https://www.frontiersin.org/articles/10.3389/fpsyg.2021.627561/abstract</a>.</p>
</div>
<div id="ref-lerner_keltner_2000">
<p>Lerner, Jennifer S., and Dacher Keltner. 2000. “Beyond Valence: Toward a Model of Emotionspecific Influences on Judgement and Choice.” <em>Cognition &amp; Emotion</em> 14 (4): 473–93. <a href="https://doi.org/10.1080/026999300402763">https://doi.org/10.1080/026999300402763</a>.</p>
</div>
<div id="ref-marcus_2000">
<p>Marcus, George E. 2000. “Emotions in Politics.” <em>Annu. Rev. Polit. Sci.</em> 3: 221–50.</p>
</div>
<div id="ref-marcus_etal_2000">
<p>Marcus, George E., Russell W. Neuman, and Michael MacKuen. 2000. <em>Affective Intelligence and Political Judgement</em>. The University of Chicago Press.</p>
</div>
<div id="ref-meffertetal2006">
<p>Meffert, Michael F., Sungeun Chung, Amber J. Joiner, Leah Waks, and Jennifer Garst. 2006. “The Effects of Negativity and Motivated Information Processing During a Political Campaign.” <em>Journal of Communication</em> 56: 27–51.</p>
</div>
<div id="ref-pittig_etal_2014">
<p>Pittig, Andre, Alexandra R. Schulz, Michelle G. Craske, and Georg W. Alpers. 2014. “Acquisition of Behavioral Avoidance: Task-Irrelevant Conditioned Stimuli Trigger Costly Decisions.” <em>Journal of Abnormal Psychology</em> 123 (2): 314–29. <a href="https://doi.org/https://doi.org/10.1037/a0036136">https://doi.org/https://doi.org/10.1037/a0036136</a>.</p>
</div>
<div id="ref-slovic_etal_2007">
<p>Slovic, Paul, Melissa L. Finucane, Ellen Peters, and Donald G. MacGregor. 2007. “The Affect Heuristic.” <em>European Journal of Operational Research</em> 177 (3): 1333–52. <a href="https://doi.org/https://doi.org/10.1016/j.ejor.2005.04.006">https://doi.org/https://doi.org/10.1016/j.ejor.2005.04.006</a>.</p>
</div>
<div id="ref-soroka_mcadams_2015">
<p>Soroka, Stuart, and Stephen McAdams. 2015. “News, Politics and Negativity.” <em>Political Communication</em> 32 (1): 1–22. <a href="https://doi.org/10.1080/10584609.2014.881942">https://doi.org/10.1080/10584609.2014.881942</a>.</p>
</div>
<div id="ref-zou_schiebinger_2018">
<p>Zou, James, and Londa Schiebinger. 2018. “AI Can Be Sexist and Racist – It’s Time to Make It Fair.” <em>Nature (Comment)</em>. <a href="https://www.nature.com/articles/d41586-018-05707-8">https://www.nature.com/articles/d41586-018-05707-8</a>.</p>
</div>
</div>
</div>
]]>
      </description>
    </item>
    
  </channel>
</rss>