library(tidyverse)
library(DT)
library(tidytext)        # package for text analysis
library(readxl)          # reads excel files, the format I used for the data

In this notebook, I will be analyzing the content from manifestos by six mass killers. In particular, I want to look at their vocabularies and see which words stand out as the most distinct. To accomplish this, I am using the tidytext and readxl packages in R.

  1. First, I will tell R to load the text and then “unnest” the words, which just means breaking each manifesto down into its constituent words, minus any spaces and punctuation.
manifestos <- read_excel("manifestos.xlsx")

manifestos
manifestos_words <- manifestos %>%
  unnest_tokens(word, text)

manifestos_words
  1. Now I will tell R to display a table to show the lexical diversity and density, and the word counts, of each manifesto.
manifestos_words %>% 
  group_by(author) %>% 
  summarise(num_words = n(),
            lex_diversity = n_distinct(word), 
            lex_density = n_distinct(word)/n())

As the table shows, Rodgers wrote the most words and Harper-Mercer wrote the fewest. However, Harper-Mercer also had the highest lexical density, basically meaning that the highest proportion of his words were unique rather than repeated words, as compared with all other manifestos here.

  1. Now I am going to tell R to display a table containing the average word length (number of characters per word) of each manifesto.
manifestos_words %>%
  group_by(author) %>% 
  mutate(word_length = nchar(word)) %>% 
  summarize(mean_word_length = mean(word_length)) %>% 
  arrange(-mean_word_length)

I can see that Breivik had the highest average word length, and Harper-Mercer had the lowest.

  1. Now I would like to see a “mini histogram” for each of the manifestos to show their word lengths.
manifestos_words %>%
  mutate(word_length = nchar(word)) %>% 
  ggplot(aes(word_length)) +
  geom_histogram(binwidth = 1) +
  facet_wrap(vars(author), scales = "free_y") +
  labs(title = "Word length distributions of manifestos, by author")

I can tell from looking at these histograms collectively, that Auviven used the longest word out of any of them.

  1. When looking at the most commonly used words in each manifesto, there would be a lot of words like “and, but, there, at, to” that aren’t worth analyzing because they are just common articles of English and don’t really convey any useful meaning. One term for words like this are “stop words,” and first I want to tell R to load a list of stop words, so that they can be then removed from all the other words from each manifesto. Then, we can see clearly what the interesting words are for each.
stop_words <- get_stopwords()
stop_words$word
  [1] "i"          "me"         "my"         "myself"     "we"         "our"        "ours"       "ourselves"  "you"        "your"       "yours"      "yourself"  
 [13] "yourselves" "he"         "him"        "his"        "himself"    "she"        "her"        "hers"       "herself"    "it"         "its"        "itself"    
 [25] "they"       "them"       "their"      "theirs"     "themselves" "what"       "which"      "who"        "whom"       "this"       "that"       "these"     
 [37] "those"      "am"         "is"         "are"        "was"        "were"       "be"         "been"       "being"      "have"       "has"        "had"       
 [49] "having"     "do"         "does"       "did"        "doing"      "would"      "should"     "could"      "ought"      "i'm"        "you're"     "he's"      
 [61] "she's"      "it's"       "we're"      "they're"    "i've"       "you've"     "we've"      "they've"    "i'd"        "you'd"      "he'd"       "she'd"     
 [73] "we'd"       "they'd"     "i'll"       "you'll"     "he'll"      "she'll"     "we'll"      "they'll"    "isn't"      "aren't"     "wasn't"     "weren't"   
 [85] "hasn't"     "haven't"    "hadn't"     "doesn't"    "don't"      "didn't"     "won't"      "wouldn't"   "shan't"     "shouldn't"  "can't"      "cannot"    
 [97] "couldn't"   "mustn't"    "let's"      "that's"     "who's"      "what's"     "here's"     "there's"    "when's"     "where's"    "why's"      "how's"     
[109] "a"          "an"         "the"        "and"        "but"        "if"         "or"         "because"    "as"         "until"      "while"      "of"        
[121] "at"         "by"         "for"        "with"       "about"      "against"    "between"    "into"       "through"    "during"     "before"     "after"     
[133] "above"      "below"      "to"         "from"       "up"         "down"       "in"         "out"        "on"         "off"        "over"       "under"     
[145] "again"      "further"    "then"       "once"       "here"       "there"      "when"       "where"      "why"        "how"        "all"        "any"       
[157] "both"       "each"       "few"        "more"       "most"       "other"      "some"       "such"       "no"         "nor"        "not"        "only"      
[169] "own"        "same"       "so"         "than"       "too"        "very"       "will"      

Now that the stop words are loaded (you can see them above, to know what all words will be removed from the manifestos), I want to tell R to display a grap showing the most common words in each manifesto.


manifestos_words %>%
  anti_join(stop_words) %>% 
  group_by(author) %>% 
  count(word, sort = T) %>%
  top_n(5) %>% 
  ungroup() %>% 
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = author)) +
  geom_col(show.legend = FALSE) +
  labs(x = NULL, y = "Most common words") +
  facet_wrap(vars(author), scales = "free") +
  scale_fill_viridis_d() +
  theme_minimal() +
  coord_flip()
Joining, by = "word"
Selecting by n

It is interesting to see the differences in the most common words seen in each manifesto. Apparently, the unabomber was really in the mood to talk about “society,” and Breivik liked to get “political” with his manifesto.

  1. Term frequency-Inverse Document Frequency (TF-IDF) finds the words that are unique to one document as compared to other documents. I want to use the TF-IDF to see which words were the most specific to each manifesto author. This should help give a better idea about how each manifesto differs from the others, at least in term of word choice.

So, first I want to tell R to create a table showing the TF-IDF calculations.

manifestos_word_counts <- manifestos %>%             # This counts each word per author
  unnest_tokens(word, text) %>%
  count(author, word, sort = TRUE) 

total_words <- manifestos_word_counts %>%               # This counts total words per author
  group_by(author) %>% 
  summarize(total = sum(n))

manifestos_word_counts <- left_join(manifestos_word_counts, total_words)    # Joins the two
Joining, by = "author"
manifestos_tf_idf <- manifestos_word_counts %>%             # Calculates tf-idf
  bind_tf_idf(word, author, n)

manifestos_tf_idf %>%                                   # Displays it
  arrange(-tf_idf)                          
NA

Now I want to tell R to display a graph of the words with the highest tf-idfs in each manifesto.

manifestos_tf_idf %>%
  arrange(-tf_idf) %>%
  mutate(word = factor(word, levels = rev(unique(word)))) %>% 
  group_by(author) %>% 
  top_n(5) %>% 
  ggplot(aes(word, tf_idf, fill = author)) +
  geom_col(show.legend = FALSE) +
  labs(x = NULL, y = "tf-idf") +
  facet_wrap(~author, scales = "free") +
  coord_flip() +
  theme_minimal() +
  scale_fill_viridis_d() +
  labs(title = "Most distinctive words in each manifesto")
Selecting by tf_idf

So, by looking at these graphs, I can tell that the Unabomber uniquely referred a lot to leftists and leftisms and the concept of being oversocialized. Rodger uniquely referred a lot to his father and his mother. Auvinen used the word intelligent more than the others did… Etc… There are many interesting conclusions to be drawn from these graphs when viewed collectively.

LS0tCnRpdGxlOiAiSW50cm8gdG8gVGV4dCBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KHRpZHl0ZXh0KSAgICAgICAgIyBwYWNrYWdlIGZvciB0ZXh0IGFuYWx5c2lzCmxpYnJhcnkocmVhZHhsKSAgICAgICAgICAjIHJlYWRzIGV4Y2VsIGZpbGVzLCB0aGUgZm9ybWF0IEkgdXNlZCBmb3IgdGhlIGRhdGEKCmBgYAoKSW4gdGhpcyBub3RlYm9vaywgSSB3aWxsIGJlIGFuYWx5emluZyB0aGUgY29udGVudCBmcm9tIG1hbmlmZXN0b3MgYnkgc2l4IG1hc3Mga2lsbGVycy4gSW4gcGFydGljdWxhciwgSSB3YW50IHRvIGxvb2sgYXQgdGhlaXIgdm9jYWJ1bGFyaWVzIGFuZCBzZWUgd2hpY2ggd29yZHMgc3RhbmQgb3V0IGFzIHRoZSBtb3N0IGRpc3RpbmN0LiBUbyBhY2NvbXBsaXNoIHRoaXMsIEkgYW0gdXNpbmcgdGhlIHRpZHl0ZXh0IGFuZCByZWFkeGwgcGFja2FnZXMgaW4gUi4gCgoKMS4gRmlyc3QsIEkgd2lsbCB0ZWxsIFIgdG8gbG9hZCB0aGUgdGV4dCBhbmQgdGhlbiAidW5uZXN0IiB0aGUgd29yZHMsIHdoaWNoIGp1c3QgbWVhbnMgYnJlYWtpbmcgZWFjaCBtYW5pZmVzdG8gZG93biBpbnRvIGl0cyBjb25zdGl0dWVudCB3b3JkcywgbWludXMgYW55IHNwYWNlcyBhbmQgcHVuY3R1YXRpb24uIAoKYGBge3J9Cm1hbmlmZXN0b3MgPC0gcmVhZF9leGNlbCgibWFuaWZlc3Rvcy54bHN4IikKCm1hbmlmZXN0b3MKYGBgCgpgYGB7cn0KbWFuaWZlc3Rvc193b3JkcyA8LSBtYW5pZmVzdG9zICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkKCm1hbmlmZXN0b3Nfd29yZHMKYGBgCgoKMi4gTm93IEkgd2lsbCB0ZWxsIFIgdG8gZGlzcGxheSBhIHRhYmxlIHRvIHNob3cgdGhlIGxleGljYWwgZGl2ZXJzaXR5IGFuZCBkZW5zaXR5LCBhbmQgdGhlIHdvcmQgY291bnRzLCBvZiBlYWNoIG1hbmlmZXN0by4gCgpgYGB7cn0KbWFuaWZlc3Rvc193b3JkcyAlPiUgCiAgZ3JvdXBfYnkoYXV0aG9yKSAlPiUgCiAgc3VtbWFyaXNlKG51bV93b3JkcyA9IG4oKSwKICAgICAgICAgICAgbGV4X2RpdmVyc2l0eSA9IG5fZGlzdGluY3Qod29yZCksIAogICAgICAgICAgICBsZXhfZGVuc2l0eSA9IG5fZGlzdGluY3Qod29yZCkvbigpKQpgYGAKCkFzIHRoZSB0YWJsZSBzaG93cywgUm9kZ2VycyB3cm90ZSB0aGUgbW9zdCB3b3JkcyBhbmQgSGFycGVyLU1lcmNlciB3cm90ZSB0aGUgZmV3ZXN0LiBIb3dldmVyLCBIYXJwZXItTWVyY2VyIGFsc28gaGFkIHRoZSBoaWdoZXN0IGxleGljYWwgZGVuc2l0eSwgYmFzaWNhbGx5IG1lYW5pbmcgdGhhdCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIGhpcyB3b3JkcyB3ZXJlIHVuaXF1ZSByYXRoZXIgdGhhbiByZXBlYXRlZCB3b3JkcywgYXMgY29tcGFyZWQgd2l0aCBhbGwgb3RoZXIgbWFuaWZlc3RvcyBoZXJlLiAKCgozLiBOb3cgSSBhbSBnb2luZyB0byB0ZWxsIFIgdG8gZGlzcGxheSBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGF2ZXJhZ2Ugd29yZCBsZW5ndGggKG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciB3b3JkKSBvZiBlYWNoIG1hbmlmZXN0by4gCgpgYGB7cn0KbWFuaWZlc3Rvc193b3JkcyAlPiUKICBncm91cF9ieShhdXRob3IpICU+JSAKICBtdXRhdGUod29yZF9sZW5ndGggPSBuY2hhcih3b3JkKSkgJT4lIAogIHN1bW1hcml6ZShtZWFuX3dvcmRfbGVuZ3RoID0gbWVhbih3b3JkX2xlbmd0aCkpICU+JSAKICBhcnJhbmdlKC1tZWFuX3dvcmRfbGVuZ3RoKQpgYGAKCkkgY2FuIHNlZSB0aGF0IEJyZWl2aWsgaGFkIHRoZSBoaWdoZXN0IGF2ZXJhZ2Ugd29yZCBsZW5ndGgsIGFuZCBIYXJwZXItTWVyY2VyIGhhZCB0aGUgbG93ZXN0LiAKCgo0LiBOb3cgSSB3b3VsZCBsaWtlIHRvIHNlZSBhICJtaW5pIGhpc3RvZ3JhbSIgZm9yIGVhY2ggb2YgdGhlIG1hbmlmZXN0b3MgdG8gc2hvdyB0aGVpciB3b3JkIGxlbmd0aHMuIAoKYGBge3J9Cm1hbmlmZXN0b3Nfd29yZHMgJT4lCiAgbXV0YXRlKHdvcmRfbGVuZ3RoID0gbmNoYXIod29yZCkpICU+JSAKICBnZ3Bsb3QoYWVzKHdvcmRfbGVuZ3RoKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGZhY2V0X3dyYXAodmFycyhhdXRob3IpLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGxhYnModGl0bGUgPSAiV29yZCBsZW5ndGggZGlzdHJpYnV0aW9ucyBvZiBtYW5pZmVzdG9zLCBieSBhdXRob3IiKQpgYGAKCkkgY2FuIHRlbGwgZnJvbSBsb29raW5nIGF0IHRoZXNlIGhpc3RvZ3JhbXMgY29sbGVjdGl2ZWx5LCB0aGF0IEF1dml2ZW4gdXNlZCB0aGUgbG9uZ2VzdCB3b3JkIG91dCBvZiBhbnkgb2YgdGhlbS4gCgoKNS4gV2hlbiBsb29raW5nIGF0IHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgd29yZHMgaW4gZWFjaCBtYW5pZmVzdG8sIHRoZXJlIHdvdWxkIGJlIGEgbG90IG9mIHdvcmRzIGxpa2UgImFuZCwgYnV0LCB0aGVyZSwgYXQsIHRvIiB0aGF0IGFyZW4ndCB3b3J0aCBhbmFseXppbmcgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGNvbW1vbiBhcnRpY2xlcyBvZiBFbmdsaXNoIGFuZCBkb24ndCByZWFsbHkgY29udmV5IGFueSB1c2VmdWwgbWVhbmluZy4gT25lIHRlcm0gZm9yIHdvcmRzIGxpa2UgdGhpcyBhcmUgInN0b3Agd29yZHMsIiBhbmQgZmlyc3QgSSB3YW50IHRvIHRlbGwgUiB0byBsb2FkIGEgbGlzdCBvZiBzdG9wIHdvcmRzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHRoZW4gcmVtb3ZlZCBmcm9tIGFsbCB0aGUgb3RoZXIgd29yZHMgZnJvbSBlYWNoIG1hbmlmZXN0by4gVGhlbiwgd2UgY2FuIHNlZSBjbGVhcmx5IHdoYXQgdGhlIGludGVyZXN0aW5nIHdvcmRzIGFyZSBmb3IgZWFjaC4gCgpgYGB7cn0Kc3RvcF93b3JkcyA8LSBnZXRfc3RvcHdvcmRzKCkKc3RvcF93b3JkcyR3b3JkCmBgYAoKTm93IHRoYXQgdGhlIHN0b3Agd29yZHMgYXJlIGxvYWRlZCAoeW91IGNhbiBzZWUgdGhlbSBhYm92ZSwgdG8ga25vdyB3aGF0IGFsbCB3b3JkcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3RvcyksIEkgd2FudCB0byB0ZWxsIFIgdG8gZGlzcGxheSBhIGdyYXAgc2hvd2luZyB0aGUgbW9zdCBjb21tb24gd29yZHMgaW4gZWFjaCBtYW5pZmVzdG8uIAoKYGBge3J9CgptYW5pZmVzdG9zX3dvcmRzICU+JQogIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUgCiAgZ3JvdXBfYnkoYXV0aG9yKSAlPiUgCiAgY291bnQod29yZCwgc29ydCA9IFQpICU+JQogIHRvcF9uKDUpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gYXV0aG9yKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIk1vc3QgY29tbW9uIHdvcmRzIikgKwogIGZhY2V0X3dyYXAodmFycyhhdXRob3IpLCBzY2FsZXMgPSAiZnJlZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZsaXAoKQoKYGBgCgpJdCBpcyBpbnRlcmVzdGluZyB0byBzZWUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBtb3N0IGNvbW1vbiB3b3JkcyBzZWVuIGluIGVhY2ggbWFuaWZlc3RvLiBBcHBhcmVudGx5LCB0aGUgdW5hYm9tYmVyIHdhcyByZWFsbHkgaW4gdGhlIG1vb2QgdG8gdGFsayBhYm91dCAic29jaWV0eSwiIGFuZCBCcmVpdmlrIGxpa2VkIHRvIGdldCAicG9saXRpY2FsIiB3aXRoIGhpcyBtYW5pZmVzdG8uIAoKCjYuIFRlcm0gZnJlcXVlbmN5LUludmVyc2UgRG9jdW1lbnQgRnJlcXVlbmN5IChURi1JREYpIGZpbmRzIHRoZSB3b3JkcyB0aGF0IGFyZSB1bmlxdWUgdG8gb25lIGRvY3VtZW50IGFzIGNvbXBhcmVkIHRvIG90aGVyIGRvY3VtZW50cy4gSSB3YW50IHRvIHVzZSB0aGUgVEYtSURGIHRvIHNlZSB3aGljaCB3b3JkcyB3ZXJlIHRoZSBtb3N0IHNwZWNpZmljIHRvIGVhY2ggbWFuaWZlc3RvIGF1dGhvci4gVGhpcyBzaG91bGQgaGVscCBnaXZlIGEgYmV0dGVyIGlkZWEgYWJvdXQgaG93IGVhY2ggbWFuaWZlc3RvIGRpZmZlcnMgZnJvbSB0aGUgb3RoZXJzLCBhdCBsZWFzdCBpbiB0ZXJtIG9mIHdvcmQgY2hvaWNlLiAKClNvLCBmaXJzdCBJIHdhbnQgdG8gdGVsbCBSIHRvIGNyZWF0ZSBhIHRhYmxlIHNob3dpbmcgdGhlIFRGLUlERiBjYWxjdWxhdGlvbnMuIAoKYGBge3J9Cm1hbmlmZXN0b3Nfd29yZF9jb3VudHMgPC0gbWFuaWZlc3RvcyAlPiUgICAgICAgICAgICAgIyBUaGlzIGNvdW50cyBlYWNoIHdvcmQgcGVyIGF1dGhvcgogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkgJT4lCiAgY291bnQoYXV0aG9yLCB3b3JkLCBzb3J0ID0gVFJVRSkgCgp0b3RhbF93b3JkcyA8LSBtYW5pZmVzdG9zX3dvcmRfY291bnRzICU+JSAgICAgICAgICAgICAgICMgVGhpcyBjb3VudHMgdG90YWwgd29yZHMgcGVyIGF1dGhvcgogIGdyb3VwX2J5KGF1dGhvcikgJT4lIAogIHN1bW1hcml6ZSh0b3RhbCA9IHN1bShuKSkKCm1hbmlmZXN0b3Nfd29yZF9jb3VudHMgPC0gbGVmdF9qb2luKG1hbmlmZXN0b3Nfd29yZF9jb3VudHMsIHRvdGFsX3dvcmRzKSAgICAjIEpvaW5zIHRoZSB0d28KCm1hbmlmZXN0b3NfdGZfaWRmIDwtIG1hbmlmZXN0b3Nfd29yZF9jb3VudHMgJT4lICAgICAgICAgICAgICMgQ2FsY3VsYXRlcyB0Zi1pZGYKICBiaW5kX3RmX2lkZih3b3JkLCBhdXRob3IsIG4pCgptYW5pZmVzdG9zX3RmX2lkZiAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGlzcGxheXMgaXQKICBhcnJhbmdlKC10Zl9pZGYpICAgICAgICAgICAgICAgICAgICAgICAgICAKCmBgYAoKTm93IEkgd2FudCB0byB0ZWxsIFIgdG8gZGlzcGxheSBhIGdyYXBoIG9mIHRoZSB3b3JkcyB3aXRoIHRoZSBoaWdoZXN0IHRmLWlkZnMgaW4gZWFjaCBtYW5pZmVzdG8uIAoKYGBge3J9Cm1hbmlmZXN0b3NfdGZfaWRmICU+JQogIGFycmFuZ2UoLXRmX2lkZikgJT4lCiAgbXV0YXRlKHdvcmQgPSBmYWN0b3Iod29yZCwgbGV2ZWxzID0gcmV2KHVuaXF1ZSh3b3JkKSkpKSAlPiUgCiAgZ3JvdXBfYnkoYXV0aG9yKSAlPiUgCiAgdG9wX24oNSkgJT4lIAogIGdncGxvdChhZXMod29yZCwgdGZfaWRmLCBmaWxsID0gYXV0aG9yKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gInRmLWlkZiIpICsKICBmYWNldF93cmFwKH5hdXRob3IsIHNjYWxlcyA9ICJmcmVlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICBsYWJzKHRpdGxlID0gIk1vc3QgZGlzdGluY3RpdmUgd29yZHMgaW4gZWFjaCBtYW5pZmVzdG8iKQoKYGBgCgpTbywgYnkgbG9va2luZyBhdCB0aGVzZSBncmFwaHMsIEkgY2FuIHRlbGwgdGhhdCB0aGUgVW5hYm9tYmVyIHVuaXF1ZWx5IHJlZmVycmVkIGEgbG90IHRvIGxlZnRpc3RzIGFuZCBsZWZ0aXNtcyBhbmQgdGhlIGNvbmNlcHQgb2YgYmVpbmcgb3ZlcnNvY2lhbGl6ZWQuIFJvZGdlciB1bmlxdWVseSByZWZlcnJlZCBhIGxvdCB0byBoaXMgZmF0aGVyIGFuZCBoaXMgbW90aGVyLiBBdXZpbmVuIHVzZWQgdGhlIHdvcmQgaW50ZWxsaWdlbnQgbW9yZSB0aGFuIHRoZSBvdGhlcnMgZGlkLi4uIEV0Yy4uLiBUaGVyZSBhcmUgbWFueSBpbnRlcmVzdGluZyBjb25jbHVzaW9ucyB0byBiZSBkcmF3biBmcm9tIHRoZXNlIGdyYXBocyB3aGVuIHZpZXdlZCBjb2xsZWN0aXZlbHkuIA==