A Probe Into Major Arcana Keywords

Kendra Blalock

1/31/2021

Project Goal

I have become increasingly interested in the use of tarot as means of self-reflection. Modern tarot decks are usually composed of 78 cards split into two groups: the Major Arcana with 22 cards and the Minor Arcana with 56 cards assigned to 4 suits. Tarot cards symbolize aspects of ourselves, experiences we have, and our relationships. In pop culture, tarot readings are often shown as fortune telling. Many people use tarot to receive messages or direction from the part of existence that is larger than themselves, whether called the universe, god, or something else.

Recently I have been exploring tarot as a tool to examine one’s own mind and emotions without any implications of supernatural elements. For example, if I pull the Three of Cups card which is traditionally associated with friendship, collaboration, and celebration, I would then watch the thoughts and emotions that arise from pulling that card. Do I feel grateful for the friends I have in my life? Am I feeling sorrow for past friendships that have faded? Do I feel any disconnection?

Having absolutely no experience with tarot until a few years ago, I came to the practice with no knowledge of the cards’ visual imagery or meanings. The artwork of many of the modern decks are lovely and worth checking out even for purely asthetic purposes.

Decks usually come with guidebooks outlining the cards’ meanings. Although guides may differ slightly in their explanations, there seems to be good consistency in the meanings associated with cards. Guides will often list a set of keywords for each card to get a quick understanding.

Two questions peeked my curiosity.

  1. I noticed that card meanings tended to be more positive and that guides seemed to neutralize cards that could be perceived as negative, such as the Death card. Do the cards tend to side towards positive meanings? If so, it might be an interesting reflection of what we want from tarot and what perpetuates its use.

  2. I noticed that some keywords appeared regularly for multiple cards. What underlying themes may be running through tarot? These themes might illuminate specific reasons we are drawn to tarot.

Collected Data

I copied the short list of keywords from 10 online tarot guides for the 22 Major Arcana cards. With more time, the analysis could easily be rerun with data for all 78 cards.

Some only read tarot cards right side up; if they pull a card that is upside down, they flip it before proceeding. However, some will leave the card upside down. In these situations, the meaning of the card is reversed (generally opposite) from the card’s regular meaning. These reverse meanings become important when exploring the positive/negative characteristic of card meanings.

Upright and reverse card meaning keywords were noted. Only 4/10 sites had keywords listed for reverse card meanings.

Example of Keywords for Upright and Reversed Cards

Positive/Negative Text Sentiment Analysis

To gauge the level of positive and negative emotional affective of the card keywords, I used the sentimentr package.

The average sentiment polarity scores provide a guide of the emotional affect of a card, with the more positive card meanings having higher positive scores and more negative card meanings have lower negative scores. Cards with scores closer to 0 have a more neutral affect.

Upright cards were more positive with an average score of 0.485; however, with an average of -0.299 the reversed cards didn’t have as strong of a negative average score one would expect if the meanings were just simply flipped.

Most interesting is that the range of sentiment scores for the upright cards (-1.199 to 1.563) was much wider than the reversed cards (-0.499 to 0.163).

##  Card_Name...1       Mean_Upright     Mean_Reverse   
##  Length:22          Min.   :-1.199   Min.   :-0.499  
##  Class :character   1st Qu.: 0.259   1st Qu.:-0.360  
##  Mode  :character   Median : 0.603   Median :-0.341  
##                     Mean   : 0.485   Mean   :-0.299  
##                     3rd Qu.: 0.890   3rd Qu.:-0.263  
##                     Max.   : 1.563   Max.   : 0.163

Numbers are great, but to get a real feel for the differences in cards, I made black and white copies of the traditional Rider-Waite tarot deck and placed the cards on a positive to negative continuum.

Starting with the most positive cards, the plot moves to neutral cards and then negative cards. Upright cards are on top of the line, and reversed cards are below the line.

The high-level overview shows how the upright cards are more evenly spread, although skewed positive. The reverse cards tend to be more negative, but cluster much closer.

The following slides provide a more detailed view.

Major Arcana Themes

My second goal was to see what themes emerge from the Major Arcana by looking at keywords that are often listed for different cards.

#Prepare corpus file for upright cards
corpus1 <- Corpus(VectorSource(c(unlist(data$Short)))) 

##Text Cleaning for frequency list
#Convert text to lower case
corpus1 <- tm_map(corpus1, content_transformer(tolower))
#Remove numbers
corpus1 <- tm_map(corpus1, removeNumbers)
#Remove English common stopwords
corpus1 <- tm_map(corpus1, removeWords, stopwords("english"))
#Remove punctuations 
corpus1 <- tm_map(corpus1, removePunctuation)
#Eliminate extra white spaces
corpus1 <- tm_map(corpus1, stripWhitespace)
#Remove additional words
#corpus1 <- tm_map(corpus1, removeWords, c("addifneeded", "addifneeded"))

#Create Term Document Matrix
tdm1 <- TermDocumentMatrix(corpus1)
m1 <- as.matrix(tdm1)
v1 <- sort(rowSums(m1),decreasing = T) 
theme <- data.frame(word=names(v1), freq=v1)

rm(tdm1, m1, v1, corpus1)

#Prepare corpus file for reverse cards
corpus1 <- Corpus(VectorSource(c(unlist(data$Short_Inverse)))) 

##Text Cleaning for frequency list
#Convert text to lower case
corpus1 <- tm_map(corpus1, content_transformer(tolower))
#Remove numbers
corpus1 <- tm_map(corpus1, removeNumbers)
#Remove English common stopwords
corpus1 <- tm_map(corpus1, removeWords, stopwords("english"))
#Remove punctuations 
corpus1 <- tm_map(corpus1, removePunctuation)
#Eliminate extra white spaces
corpus1 <- tm_map(corpus1, stripWhitespace)
#Remove additional words
#corpus1 <- tm_map(corpus1, removeWords, c("addifneeded", "addifneeded"))

#Create Term Document Matrix
tdm1 <- TermDocumentMatrix(corpus1)
m1 <- as.matrix(tdm1)
v1 <- sort(rowSums(m1),decreasing = T) 
theme2 <- data.frame(word=names(v1), freq=v1)

rm(tdm1, m1, v1, corpus1)

#combine theme lists 
theme <- theme %>% 
  full_join((theme2 %>% rename(freq2 = freq)), by = "word") %>% 
  rowwise() %>% 
  mutate(freq3 = sum(freq, freq2, na.rm = TRUE)) %>% 
  arrange(desc(freq3))

rm(theme2)

theme2 <- as.data.frame(theme %>% select(word) %>% head(10))

Top 10 keywords listed across all of the cards.

##         word
## 1       lack
## 2     change
## 3        new
## 4    success
## 5      power
## 6      inner
## 7    balance
## 8    control
## 9  intuition
## 10      good

To determine which cards were associated with a keyword, I decided on a cutoff that a keyword had to be listed at least 50% of the time for the card. Upright and reversed card meanings were both included.

#add in variables noting if words are present
data <- data %>% 
  mutate(lack = case_when(str_detect(Short, "lack") ~ 1,
                            str_detect(Short, "Lack") ~ 1,
                            T ~ 0)) %>% 
  mutate(change = case_when(str_detect(Short, "change") ~ 1,
                     str_detect(Short, "Change") ~ 1,
                     T ~ 0)) %>% 
  mutate(new = case_when(str_detect(Short, "new") ~ 1,
                            str_detect(Short, "New") ~ 1,
                                          T ~ 0)) %>% 
  mutate(sucess = case_when(str_detect(Short, "success") ~ 1,
                            str_detect(Short, "Success") ~ 1,
                            T ~ 0)) %>% 
  mutate(power = case_when(str_detect(Short, "power") ~ 1,
                            str_detect(Short, "Power") ~ 1,
                            T ~ 0)) %>%    
  mutate(inner = case_when(str_detect(Short, "inner") ~ 1,
                            str_detect(Short, "Inner") ~ 1,
                            T ~ 0)) %>%  
  mutate(balance = case_when(str_detect(Short, "balance") ~ 1,
                            str_detect(Short, "Balance") ~ 1,
                            T ~ 0)) %>% 
  mutate(control = case_when(str_detect(Short, "control") ~ 1,
                             str_detect(Short, "Control") ~ 1,
                             T ~ 0)) %>% 
  mutate(intuition = case_when(str_detect(Short, "intuition") ~ 1,
                            str_detect(Short, "Intuition") ~ 1,
                            T ~ 0)) %>% 
  mutate(good = case_when(str_detect(Short, "good") ~ 1,
                            str_detect(Short, "Good") ~ 1,
                            T ~ 0)) %>% 
  mutate(lack_r = case_when(str_detect(Short_Inverse, "lack") ~ 1,
                          str_detect(Short_Inverse, "Lack") ~ 1,
                          T ~ 0)) %>% 
  mutate(change_r = case_when(str_detect(Short_Inverse, "change") ~ 1,
                            str_detect(Short_Inverse, "Change") ~ 1,
                            T ~ 0)) %>% 
  mutate(new_r = case_when(str_detect(Short_Inverse, "new") ~ 1,
                         str_detect(Short_Inverse, "New") ~ 1,
                         T ~ 0)) %>% 
  mutate(sucess_r = case_when(str_detect(Short_Inverse, "success") ~ 1,
                            str_detect(Short_Inverse, "Success") ~ 1,
                            T ~ 0)) %>% 
  mutate(power_r = case_when(str_detect(Short_Inverse, "power") ~ 1,
                           str_detect(Short_Inverse, "Power") ~ 1,
                           T ~ 0)) %>%    
  mutate(inner_r = case_when(str_detect(Short_Inverse, "inner") ~ 1,
                           str_detect(Short_Inverse, "Inner") ~ 1,
                           T ~ 0)) %>%  
  mutate(balance_r = case_when(str_detect(Short_Inverse, "balance") ~ 1,
                             str_detect(Short_Inverse, "Balance") ~ 1,
                             T ~ 0)) %>% 
  mutate(control_r = case_when(str_detect(Short_Inverse, "control") ~ 1,
                             str_detect(Short_Inverse, "Control") ~ 1,
                             T ~ 0)) %>% 
  mutate(intuition_r = case_when(str_detect(Short_Inverse, "intuition") ~ 1,
                               str_detect(Short_Inverse, "Intuition") ~ 1,
                               T ~ 0)) %>% 
  mutate(good_r = case_when(str_detect(Short_Inverse, "good") ~ 1,
                          str_detect(Short_Inverse, "Good") ~ 1,
                          T ~ 0)) 

Change

New

Success

Power

Balance

Control

Intuition

Lack

It was fun to explore these questions in a quick project. There are so many avenues to continue this investigation:

  • Gather data for all 78 tarot cards
  • Increase the sample size significantly
  • Include meanings from printed guides
  • Expand to the full text provided in guides, beyond the keywords
  • Use statistical tests to evaluate differences

All around, though, this was an enjoyable project that produced interesting insights very quickly.