The Grammar of "A Thing": Using R to Study Digital Corpora

One of the things I love most about my field (Communication) is its unique passion for building corpora. While there is an obvious value to studying a large, well-studied, pre-structured corpora like LOB or COCA (e.g., multiple scholars working on one dataset increases knowledge about that dataset, reproducibility, etc.), some research questions require more specialized text data.

This is often the situation that I find myself in. If I want to study a linguistic phenomenon in a specific register—like the use of “a thing” in English tweets—I usually have to build my own corpus. So how does one do that?

I’ll break my process down into four broad steps: (1) armchair linguistic-ing, (2) creating the corpus, (3) finding your linguistic phenomenon, (4) corpus analysis.

01. Armchair Linguistic-ing

I became primarily interested in this construction because of its frequency in language use. In spoken English, sentences like, “oh yeah, that’s a thing” are commonplace, even in formal-ish settings, like classrooms (I’m in a J-School, so it’s not unusual to hear someone say, “Yeah, AP style is a thing”).

I’ve always liked this construction, because “a” and “thing” are particularly vague English words. The determiner “a” (as in “I gave her a book”) is indefinite, meaning it refers to something non-specific (contrast this to “I gave her the book”). And “thing” is so broad, it could refer to any tangible, inanimate object. A watch, a book, a stroller, a ticket to Disney—all of these things are things. But when we put “a thing” together, it can suddenly take on a whole new meaning. When someone says, “AP style is a thing”, they mean “people know about AP style” or “AP style is popular”. In this context, the “a thing” is more than an indefinite determiner and a vague noun. Rather, it signifies some degree of importance.

But is this always the case? I wasn’t sure. So, I turned to my corpus building skills to find out.

I figured there could be four general places that “a thing” could be situated in. The first is the subject, like in the sentences below:

  1. A thing needs to be done.

  2. A thing just arrived.

The second possibility is in the object position, such as in the examples below:

  1. I know a thing or two about school.

  2. I made a thing.

It is also possible that “a thing” is used as a predicate noun/nominative. It is also a subject complement, because it completes a linking verb (in English, “to be”). This is the structure I was most interested in.

  1. This is a thing.

  2. That has been a thing for a long time.

And finally, we’ll look into object complements, such as in the examples below:

  1. He considered the party a thing.

  2. He cooked his friends a thing.

Now that I knew what I was looking for, it was time to build and parse my corpus.

02. Building Your Corpus

The first thing you’ll need to think about is where you want to get the data from. Do you want to look at journal articles? Fiction novels? Text messages between friends?

I settled on Twitter for a few reasons, the most important of which was “it is an informal register that is easy to get.” I figured the feature I was looking for would likely not be in a formal register, like news stories or presidential speeches. However, Twitter (and social media language as a whole) is simultaneously beautiful and frustrating in its kind-of-formal, kind-of-informal language norms (beautiful in that language evolves so quickly, frustrating in that there are way too many people who use prescriptivism to put down other people’s tweets).

If you are trying to access the Twitter RestAPI through R, I strongly advocate using rtweet, by Mike Kearney. It’s a really cool package, and a great way to build interesting Twitter corpora at your leisure.

rstats_tweets <- search_tweets(q = '"a thing"',
                               n = 1000000, 
                               retryonratelimit = TRUE) #max 18,000 every 15 minutes

head(rstats_tweets, n = 5) #looks at the top 2 tweets

This search yielded about 500,000 tweets (510,574, to be exact). To identify whether the bigram “a thing” would be used as a subject, object, predicate, or object complement, I would need to annotate this bad boy.

Right now, I’m using the R clearNLP package, with back ends to spaCy and CoreNLP. I tend to use the latter more (coreNLP) because I’ve gotten better results. But spaCy is much faster and has additional support. I strongly encourage it for those who are both R and Python-proficient (it can also support word vectors and has a great displaCy visualizer).


In order to use cleanNLP, you’ll need to interface with the back end (either coreNLP or spaCy).

#cnlp_init_tokenizers() #initializes tokenizer backend
cnlp_init_corenlp("en", anno_level = 2)
# cnlp_init_spacy

Once you have done this, you are ready to parse your corpus! For the purposes of this exercise, I’m going to use some toy data (parsing the full corpus took about 2 days—I had about 20 million dependencies total).

Toy Data

If you notice, 8 of the 9 sentences are the ones in my previous examples.

toy_data <- data.frame(id = c("s1", "s2", "o1", "o2", "sp1", "sp2", "sp3", "dc1", "dc2"),
                       sentence = c("A thing needs to be done.", "A thing just arrived.", 
                                    "I know a thing or two about school.",
                                    "I made a thing.", 
                                    "This is a thing.", 
                                    "Is summer camp a thing?",
                                    "That has been a thing for so long.", 
                                    "He considered the party a thing.", 
                                    "He made his friends a thing."))
starttime <- Sys.time()
full_corpus_dep <- toy_data$sentence %>% as.character() %>%
  cnlp_annotate(as_strings = TRUE, doc_ids = toy_data$id) %>%
  cnlp_get_dependency(get_token = TRUE)
endtime <- Sys.time()

You want to make sure that you indicate the doc_ids of the data, as that is what you will use to re-align the dependency information to the original tweet or sentence.

Once you do this, you should get a data frame that looks something like this:

Let’s break what cnlp_get_dependency produces. Each row represents one dependency relationship. Each column represents some information about that dependency (e.g., what document or sentence the dependency is in, what words the dependency relationship is linking, etc.)

A brief interlude to help us understand dependency grammar… Dependency grammar interprets two words as having a dependency (relationship) between them. This differs from constituency grammar, which breaks down word relationship into phrases, not dependencies. An important skillset in this work is being able to read the results of one and interpret it as the other (e.g., see dependency relations and conceptualize them as phrases, or see phrases and construct the dependencies).

Because dependencies focus on relationship between two words, we can conceive of a dependency relationship as having a “word”, a “wordtarget”, and a “relation”. Consider the very simple example of “I run.” In this sentence, we have a subject and a verb. In dependency grammar, the verb is the “root” or the center of the sentence. Therefore, each of your sentences will usually have a root. Arrows lead out from the root to other words (these are the “word targets”). Thus, if “run” is the root verb, then the word target “I” is the subject to that verb.

Let’s now look at each column in more detail. The <id> is pretty obvious: it’s the document id, or <doc_ids>, you indicated previously. The <sid> is the sentence number. For most tweets and sentences, the <sid> number will be a 1. However, blog posts, news articles, products reviews, and other longer documents are all likely to have multiple sentences. The <tid> refers to the token number of the word. There is also a <tid_target>, which is the token number of the word target.

The six other columns are: <relation>, <relation_full>, <word>, <lemma>, <word_target>, and <lemma_target>. The <lemma> and <lemma_target> are the lemmatized forms of the word and word_target (for example, the words “thinking”, “thought”, and “thinks” can be represented by the lemma /think/. Using the lemmatized form meant I largely did not have to worry about tense issues.

The <relation>, <word>, and <word_target> are the meat of the dependency analysis. The first “dependency” of a sentence is usually the ROOT verb. Let’s return to our “I run.” Example below.

As you can see, the “run” verb is identified as the root. This is not really a dependency, but more an identification of what the root verb is (hence why there is no actual <word>, and why the <tid> is 0). The second row identifies a <nsubj> dependency “relation”, with the root verb “run” as the <word>, and the noun subject “I” as the <word_target>.

There are many (many) possible dependency relations. You can find a list of them here.

There is some older documentation that can also be potentially useful here (this version of the dependencies is no longer maintained).

Let’s now apply this knowledge to our toy data.

03. Finding your Linguistic Phenomenon

Recall that our goal is to identify whether the bigram “a thing” appears as a subject, object, predicate, or object complement.

Let’s do so by identifying all the dependencies for which “thing” is a <word> or <word_target> (the “a” in “a thing” will be identified as a determiner <word_target> to the “thing”).

thing_word <- subset(full_corpus_dep, word == "thing")
thing_target <- subset(full_corpus_dep, word_target == "thing")

Notice that the “a thing” dependency shows up in the <thing_word> subsetted data. But the more useful dataset for us is the <thing_target> data.

Notice that, if in the subject position, the “thing” <word_target> has a <nsubj> (noun subject) <relation> to a verb. In the object position, the “thing” <word_target> has a <dobj> (direct object) <relation>. In the predicate position, the “thing” <word_target> is the ROOT (if you check the <word> data, you will also note a <cop>, or copula, <relation> from the verb “to be” to the “thing” <word>). In the object complement position, the “thing” <word_target> has an <xcomp>, or an “open clausal complement” <relation>.

Below is an image of all the dependency relationships I was interested in, as related to the “a thing” bigram.

Side note: While the toy data plays nicely, real data isn’t always perfectly parsed. For example, I had about 2,000 tweets where a copula-predicate relationship was identified as a subject-verb(“to be”)-object relationship (these had a “nsubj” + “det” + “dobj” relationship, but the root lemma was “be”—this meant they were initially coded as “objects” but, upon further examination, I subset them to the predicate list).

04. Corpus Analysis

Now that we know what the relationships are, we can re-aggregate to the tweet level. My corpus had a few instances (<10) where “a thing” was used twice. In all these instances, however, the “a thing” bigrams were in the same position.

subject <- subset(thing_target, relation == "nsubj", select=id) %>% mutate(subject = 1)
object <- subset(thing_target, relation == "dobj", select=id) %>% mutate(object = 1)
predicate <- subset(thing_target, relation == "root", select=id) %>% mutate(predicate = 1)
complement <- subset(thing_target, relation == "xcomp", select=id)  %>% mutate(complement = 1)

toy_data2 <- merge(toy_data, subject, by = "id", all.x = T) %>% 
  merge(object, by = "id", all.x = T) %>%
  merge(predicate, by = "id", all.x = T) %>%
  merge(complement, by = "id", all.x = T)
toy_data2[] <- 0

Let us now turn to the results of the full data.



As we can see, the bigram “a thing” is most likely to appear in the object position (“I made a thing”) or predicate position (“This is a thing“).Rarely is “a thing” used in the subject position (e.g., “Love the phrase ‘a meteoric rise’, a thing a meteor has never done”). Fewer than 250 tweets had “a thing” in the object complement position.

“A thing” in the Predicate position

As I expected, tweets that used “a thing” in the predicate noun position discussed a subject as popular, socially important, or at least well-known. These tweets usually followed a similar structure: the word “thing” is the root. The word_target “a” is a determiner to “thing”, and the lemma “to be” (representing “is”, “are”, “was”, and “were”) is a copula to “thing”. Finally, the “nsubj” relationship would link the noun word_target to the “thing” word (this is why we need the thing_word subsetted data).

So what are nouns are described as “a thing”?


The figure above shows that, when "a thing" is a predicate, it often link to demonstrative determiners (this, that) or the pronoun "it". We also see some more specific nouns, such as ‘church”, “abortion”, and “harassment”.

Many of these tweets were exclamations (e.g., “I didn’t know this was a thing!” or “OMG this is a thing?!” or “Had no idea this was a thing!!”). Some were questions, about whether something was “still a thing”: “I grew up being told about thick and thin. Is that still a thing[?]”

“Church” appeared often in tweets like, “Is church still a thing?” and “How is church and religion still a thing?” In at least one instance, a tweet was incorrectly parsed: “separation of church and state is a thing, you know that right little @mike_pense?” (the parser coded this as ([NP] separation ([PP]of ([N] church)) ([CONJ] and) ([N] state), rather than treating “church and state” as a conjunction within the preposition phrase).

Many people also described abortions as a thing (or not a thing). A few tweets noted “Abortions are a thing” to note the frequency with which they occur. One tweet said “Late term abortions should not be a thing”, focusing on a specific type of abortions. Another said, “Post-term abortion is not a thing”, referring specifically to President Trump’s coinage.

“A thing” in the object position

Let us now turn to the use of “a thing” in the object position. In these cases, “a thing” is still relatively vague. If you “make a thing”, you’re not necessarily saying the thing you made is popular or well-known—you may simply be happy that you did it (e.g., “I did a thing!”).We can explore this structure more by looking at the verbs associated with the “a thing” bigram in the object position. The dependency relationship would be a dobj from the word_target “a thing” to a verb.

The figure below displays the verbs that appeared at least 5000+ tweets, for which “a thing” was a direct object.


Keep in mind that these verbs are lemmatized (therefore the lemma “know” represents “know” and “knew”). By far, the most common verbs used were “to do” and “to make” (as in “I did a thing” and “I made a thing”). This is followed by “to have”, “to know”, “to miss”, and “to learn”.

For example, one tweet said “I made a thing for Pokemon fans and Kingdom Hearts fans [Image]”. Note that the author provided additional info (a prepositional phrase and an image) to describe the “thing”. Another user tweeted, “It looks bad but i did a thing [image].” Many of these tweets expressed some pride over doing, making, creating, having, buying, or owning “a thing”. This was almost always accompanied by pictures of what the “thing” was.

Some tweets also referenced love, as in “love don’t mean a thing” or “love don’t cost a thing”. About 6000 tweets used the verb “change”, and were often about commenting on other people’s worth (e.g., “don’t change a thing!”)

Overall, I really enjoyed doing this analysis. It’s been more difficult to do this analysis with my Ph.D work picking up, but I’m glad I can still find the time every now and again.

Attending the R Forwards Women's Package Workshop (Hosted by R-Ladies Chicago)

This weekend, I had the pleasure of attending an R Forwards Women's Package Workshop. It was hosted and run by members of R-Ladies Chicago: Angela Li and Stephanie Kirmer.

Though I have attended and run many one or two hour workshops, this was my first long-day, single-topic workshop (9:30 to 4:00 pm) and I thoroughly enjoyed the experience! It’s definitely a format that would be useful to teach more complex topics, like software development and package building. There was a lot of info-in-brain-cramming, but I also felt like I learned a ton in a very short time span.

Attendees of the 2019 R Forward Package Workshop, taught by Angela and Stephanie of R Ladies Chicago!

Attendees of the 2019 R Forward Package Workshop, taught by Angela and Stephanie of R Ladies Chicago!

The session was broken down into a couple broad topics: package development, git+r, unit testing, documentation, and package sharing (e.g., licences, indicating dependencies, CRAN). This made the material useful for both specific-use packages (e.g., building a data wrangling package for my specific research group) and for more public-facing packages (e.g., a package that one would want to upload to CRAN).

Top 5 Things I Learned:

  1. The usethis package is so convenient and important for package development. For example, the function


    will create the skeleton of the package files for you, including folders for R-code, the “man” folder (“man” stands for manual), and description/namespace files. This makes package building so much earlier! You can learn more about it in Wickham’s R package book.

  2. Using the “::” operator allows you to see the exported variables or functions in a package namespace. But if you really want to see under the hood “:::” allows you to see everything (there’s some more about it on StackOverflow), including the functions that are not publicly exported.

  3. Semantic Versioning - How have I only learned about this now, despite attending several data carpentry workshops and classes?! I am such a stickler for version recording, even in my non-computational work (I have been subconsciously semantic versioning my human content analysis codebooks), and it’s so nice to finally have a specific phrase associated with this process.

  4. A quote from my favorite slide of the day: “If the first line of your #rstats script is


    I will come into your lab and SET YOUR COMPUTER ON FIRE 🔥.”

    Confession time: I do this a lot! 🙈 ::embarrassed:: In terms of workflow, I am generally quite sloppy about separating projects and keeping relative paths. I first read about projects in R for Data Science, but I never took the lesson to heart until this weekend. I know… it’s bad given how much I code. So I guess I’ll be “konmari-ing” my R code this semester(i.e., create an Rproject space for each of my projects)!

  5. A great tip from Stephanie’s top tweet (about Git): “when you screw up a git merge, you can use git reset --hard master@{"300 minutes ago"} with any time quantity you want in there to get back to where things were a period of time ago.“

Extra Bonus: Differencing vs. Logging Time Series Data

I happened to also sit next to economist Dweepobotee Brahma, which was a great coincidence since I’ve been binging time series models and papers for the past year. I happened to randomly gripe about how economic data is often processed (i.e., logged). She was kind enough to explain to me why economists did this, and why growth rates are so important to the research in economics and econometrics. Having been taught by a political scientist, whose questions are not as focused on exponential relationships, I didn’t know much about this alternative treatment/perspective on time series data, and it was really interesting!

I’m starting to wonder if this is especially important to modeling follower growth. Nearly all follower count time series I’ve analyzed have been fully integrated I(1), if not to I(2). Often I will first- or second- difference this as a way to make the series stationary. However, I’m realizing a logarithmic transformation is probably more appropriate for what we try to measure (implicitly, it’s a growth rate question).


Overall, I’m really, really glad that I was able to attend this workshop. It’s definitely up there on my “favorite R workshops ever” list. Organizationally, there were a lot of little things I wanted to take back to my workshop strategy (for example, this was the first workshop I attended where we used post it’s to indicate whether we needed help with specific tasks) and obviously it was great for advancing my R skills.

One of the most important “big picture” lessons I learned was that if I want to actually do software development in R (or any programming language), I have to be more organized about my code. I am organized when it comes to data management, but am definitely less-so with my scripts and functions. Workflow wise, I want to get on top of this by the end of the semester.

I’m also one step closer to completing a major R-new-year’s-resolution: Build an R package! I have a couple of functions that I rely on for data wrangling operationalized text data to time series data, so I’m eager to wrap them all up in a neat little package for future use.

And finally, attending the workshop was a great reminder about how amazing the R community is, both offline and online. That’s one of my favorite parts about being an R programmer—the community makes it easy to be excited about learning R.

I am so grateful to Angela and Stephanie for hosting this amazing workshop, and to R Forwards for sponsoring my attendance. If you are interested in checking out the materials from this weekend, they have made the workshop material available here.

Marrying "to get" and "to have"

Typically, “have got” is considered the informal structure of “got” (see here for an example). This presumes that the meaning is the same, but the construction has a formal/informal tone (in other words, the deep structure of the sentence is sustained).

This certainly works when the object is a noun. Let’s look at four sentences where this works:

1A           “I’ve got a present”
1B           “I have a present”
2A           “I’ve got a boyfriend”
2B           “I have a boyfriend”

 But this dynamic change when the object of the sentence is a pronoun. In fact, the two (“have got” and “have”) are no longer semantically similar when we apply it to pronouns. Consider the following three sentences:

3A           “I have you.”
3B           “I got you.”
3C           “I’ve got you.”

 In the first of these three sentences, I have you is an indication of possession, and can be somewhat creepy in the wrong context (after all, will you have me for lunch?). However, it can also be used in a relational context. For example, see the sentences below, from COCA:

             “You have me at a disadvantage” (Fiction)
5              “Will you have me back on the show and apologize in person?” (TV News)
6              “Once you have him chitchatting, he might inadvertently let something slip.” (Magazine)
7              “I can do anything if I have you with me.” (News)

Here, there is still the essence of possession, as typically the subject is in a position of authority. However, in the last example, [7], we can see the use of “have” in the relational context, which is where [3C] comes in.

The sentence “I got you” shows the complexity of the verb ‘to get’, since it holds multiple meanings. With nouns, often the “to get” is also an indication of possession (“I got coffee [for you]”). However, with pronouns, the verb “to get” is a signal of understanding (“she gets me” or “he gets her”).

The syntax of the last sentence, “I’ve got you” is a mix of both—possession and understanding. This combination is so much more meaningful than the individual terms, making the syntactic construction “have got” more complex than the simple “formal/informal” narrative we traditionally learn.

3C           “I’ve got you.”
9              “You’ve got me.”

In the four “words” above (technically three words, one of which is a conjunction), we are expressing both possession and understanding—in other words, trust. When I say “he’s got her”, I am indicating that the object (“she”) can trust the subject (“he”) because the subject is capable of taking on (possessing) some burden, and because the subject understands the weight of that burden.

The expression of trust and wanting to be trusted is especially clear in first- and second-person pronouns, such as in [3c] and [9]. It’s the kind of language—perhaps my literal love language—that exists in relationships, when we rely on one another immensely as day-to-day safety nets. But it’s also something I find myself saying to friends and close compadres. When I use [3C], I am expressing appreciation for you by indicating how much I trust you. When I use [9], I am expressing a desire to be trusted.

So much can be said in so few words.

During Award Ceremonies, Twitter Activity Revolves around Winners

For the past few days, I have been looking at tweets about the Golden Globes. I collected the tweets using the amazing rtweet package. I then used substring search functions to look for the names and handles of prominent actors and winners (Variety’s article about Golden Globe social media trends was very helpful in this regard).

To create this line graph, I constructed a dataset with counts of tweets using #goldenglobe, as well as this hashtag with the specific users/movie mentioned below (I used their first/celebrity name and their handle, to try and capture as much as possible without collecting noise). I summed the number of tweets from the second to the minute level using aggregate().

The use of #goldenglobes has a hashtag was fairly volatile over the course of the night. I suspect this is because use of the hashtag increases when a winner of an award is announced. A quick glance at the top winners of the night seem to confirm this, as tweets about Lady Gaga, Sandra Oh, and Malek Rami increased immediately after their win was announced.

Curiously, Variety did not mention Bohemian Rhapsody winning the (Drama) Best Picture award as a “top most-discussed” moment, despite producing the largest peak of the night (a more in-depth analysis of that time span suggests a compounding effect—Rami winning the “Best Actor” award coincided with Bohemian Rhapsody winning “Best Motion Picture”, so the two trend somewhat closely.

However, mentions of these major actors and media products are only a blimp of the overall Golden Globes coverage. This is an important consideration, because the “most tweeted about celebrities” were tweeted about specifically because they won awards. Otherwise, mentions of them were simply rumbles in Twitterspace (as indicated by the relatively low volume during non-winning times).

Another interesting feature of these award-celebrating tweets is the long-lag. For example, tweets about Sandra Oh and Lady Gaga continued well after their respective wins (one reason for Sandra Oh’s sustained attention may also be her role as role.

The second, smaller blip for Lady Gaga occurs when she does not win the Best Actress award for Shallow (the award went to Glen Close). This “bliping” is actually also a pattern seen among other surprising “losers” of the night (e.g., Crazy Rich Asians, Black Panther).

To advance my ggplot2 skills (“skillz!”), I decided to use reshape2’s melt() function, which helps transform wide data to long data (you can learn more about it here and here). This was a relatively new tool for me, but learning it gave me a lot more control over the multiple lines in my graph!

This was also my second time using plotly. This was my first time embedding annotations via plotly, which was a really interesting learning experience. For those who are familiar with ggplot2 and are interested in creating interactive data, I strongly encourage learning plotly! I still feel like I’m in the learning stage… but I know that the more I use it, the better I become!

Tweets about WI Gubernatorial Race Part II: Election Night

Sorry it’s been so long since I’ve posted! The last few months has been absolutely crazy, with visiting family members, paper deadlines, and end-of-semester tasks. I did hit a major milestone: I have officially completed all my coursework for my Ph.D!

Today, I want to focus on my part-2 analysis of the WI election, which I am informally calling, “If you want to know who will win gubernatorial elections first, follow local journalists.”

The figure below is a plot of tweets about Scott Walker and Tony Evers on the night of the Gubernatorial Election (12 a.m. to 2 a.m.). [For more about the data collection, please see the post below].

The Big Picture

The first vertical line represents the first tweet in my dataset that called a win for Evers. This came from Milwaukee Journal Sentinel reporter Mary Spicuzza, who tweeted out at 12:53 a.m. CST (apologies; my timestamp is not adjusted for daylights saving).


While there was an increase in the number of tweets after Spicuzza’s, it didn’t reach full attention for another hour and a half, when it was officially reported by the Associated Press at 1:25 a.m. Attention, measured by counts of tweets with the word Walker or Evers, spikes not long after this tweet.

8 ap.png

What happened in that window of time, the half hour between when it was officially reported by the Journal Sentinel, and when it was reported by the Associated Press?

A Twitter Conversation among Wisconsonites

Unsurprisingly, most of the tweets from this time appeared to come from Wisconsin residents, or people with ties to Wisconsin (as indicated by their geographic information, or by information in their profile, such as being an alum of a UW-System school. One tweet from a self-reporting Wisconsonite said, “Tony Evers (D) now up over Scott Walker (R) by just over 1,000 votes out of 2.5M votes cast. #WiGov”

There were also many references to local media outlets, as seen in the examples below (which were also retweeted by mostly Wisconsinites):

“Looks like @tmj4 just reported live from the courthouse that 38,000 votes just went to #tonyevers when @cityofmilwaukee votes we're tallied. I'm calling it. Tony Evers defeats Scott Walker as the next govenor.of #Wisconsin. Boom.!” - RyanThompson


There were also many references to local Wisconsin issues, such as Walker’s rampant Union-busting, or his gutting of education funding (this was mentioned by both people in Wisconsin and those outside of Wisconsin, though the former had an obviously greater attachment):

”Fingers crossed that my great home state of Wisconsin has finally rid themselves of the Union-busting, education-destroying, Foxconn swindling corporate shill that is Scott Walker. But I won’t believe he’s gone until every vote is counted” - @sjtruog (1:17 AM)

“Wait did Scott Walker actually lose? Bc I hate him with such a particular acid for what he did to public education in that state that I want to know if I can dance a mad tarantella on that smug prick’s career grave” - @meganskittles

Cultural References

One of the things I really enjoyed about these tweets were their continual cultural references to Wisconsin. Because tweets during this time were predominantly written by Wisconsonites or those with ties to Wisconsin, there were many tweets referencing things like Menards, as noted above, Culvers, and the Packers).

“I've been this proud to be a Wisconsinite three times: when Favre won a Super Bowl, when Aaron won a Super Bowl, and when we voted melty-faced suffering-horny human khaki Scott Walker out of office.” - @meg_luvs_pandas (1:24 AM)

“If Tony Evers beats Scott Walker that would be the most Wisconsin shit that ever happened since Culver’s showed up.” - @Joe_Bowes (12:53 AM, Milwaukee, WI)

“Can someone tell me if Scott Walker is going to have to get a job at Menard's so I can go to bed.“ - @JustinLaughs (1:07 AM, from Greendale)

Another noticeable feature of this language was the use of the pronoun “we” to refer collectively to Wisconsinites.

“are… are we finally getting rid of scott walker [?] is it happening [?]” - @AlexZiebart (12:55 AM, Milwaukee, WI)

“I’m so nervous to see who won governor in wisconsin […] we need Scott walker out of office!!!” - @taypyt (12:55 AM)

“My final political tweet for the evening: if we have really finally done it, nothing has given me more pleasure than to vote against Scott Walker in five different elections. Bye Felicia” - @alephtwo (12:58 AM, Madison, WI)

The use of this “royal” we (“state-wide” we?) instills the idea of a collective identity that is directed towards the voting out of Walker from office. It evokes a sense of solidarity, or “survival” from Walker’s terms in office.

Outsiders looking in

A few outside of the WI gate were able to tap into this information, as indicated by this tweet from VA resident: This is one of the most unbelievable finishes I have ever seen. Came down to a bunch of uncounted absentee ballots. Looks like Scott Walker is done.” - @junkiechurch, (12:57 AM)

Those in close proximity to the Wisconsin appeared to be more attentive as well:

“No more Scott Walker. Wisconsin, I tease you all the time, but you did a good job today.” - @KyleWarner3000 (1:16 AM, DeKalb, IL)

However, many (presumably) outside of Wisconsin expressed frustration about wanting to learn more:

“DAMNIT CNN SHOW ME THE SCOTT WALKER RACE“ - @Seattle_9 (1:12 AM, Seattle, WA)"

“Wait did Scott Walker actually lose? Bc I hate him with such a particular acid for what he did to public education in that state that I want to know if I can dance a mad tarantella on that smug prick’s career grave “ - @godhatesyeast (1:13 AM, USA [no state indicated])

It was about Walker losing, not Evers winning

As seen by the figure above, attention was squarely focused on Walker losing, rather than Ever winning. This suggests that Twitter communities perceived the election as a victory because Walker lost, not necessarily because Evers won. Many of the tweets were focused on insulting Walker.


“Good bye Scott Walker you trifling ham and cheese eatin' bitch“ - @jae_dubb (1:09, Chicago)

In situations where Evers was referenced, it was often because he (having been a teacher) made an ironic foil to Walker.

5 popular.png

“Scott Walker loses thanks to a Milwaukee wave. What a night. Couldn't happen to a more deserving guy.” - @Save_the_Daves (1:15 AM, Milwaukee, WI)

In the above instances, Evers is celebrated but not explicitly mentioned. Walker, by contrast, is referenced in full name. In the first tweet, by @Bro_Pair, Evers is framed as a “kindly teacher”, the kind of person who was directly impacted by Walker’s economic policy. The expression of joy (“glad I stayed up late enough…”) reflects a sense of schadenfreude—taking pleasure in watching Scott Walker lose. This sense was expressed by many others…

“It looks like Scott Walker might lose to Tony Evers. Don’t go to bed or you might miss the best schadenfreude of the midterm elections.” - @RiskyLiberal (1:23 AM)

“Seeing Kris Kobach and Scott Walker lose is pretty sweet, but my schadenfreude dream team was Ted Cruz and Steve King “ - @antitractionist (1:23 AM)

… and sometimes in bizarrely sexual references.

The Recount Topic

Tweets about a recount appeared as early as announcements about the Milwaukee absentee ballots. Many tweets were written by conservative-identifying or MAGA-identifying accounts.

(R) Scott Walker, WI gov, is requesting a recount.” - @AKLLL49 (1:20, Profile: Love our @POTUS […] PHUCK #Grammernazis #Haters of #Guns and #Freespeech. #MAGA)

“Both sides expect protracted recount in Wisconsin governor's race between Scott Walker and Tony Evers” - @jackiebullivant (1:22, Profile: Conservative, business owner & political enthusiast. We need honest, authentic gov’t FOR and BY the people b/c people matter! Free speech. #MAGA #PPC2019)

“Governor Scott Walker's campaign has announced plans to call for a recount, should Evers come out on top. Either candidate can call for a recount if the results come in within 1%.” - @KFIZ1450 (1:03 AM, Fond du Lac, WI)

One was pretty sure Walker was going to win:

“Hey look on the bright side at least we still have Scott Walker and Ted Cruz.” - @johnforchione (12:57 AM)

Liberal Rebuttal

By 1:23, there were already (mostly liberal) rebuttals to a call for a recount, with many pointing out (ironically) that Walker had pushed for the bill that now prevented him from calling a recount.

“Tony Evers defeats Scott Walker by 1.1%! Outside of the margin for a recount that Scott Walker passed  into law for a recount. Karma is a bitch!” - @Fetzer2 (1:23 AM)


What can we learn from this analysis?

1) If you want to know who wins a state-wide election, follow local reporters. They have the greatest level of access to updated voting information, and are much more knowledgeable about their geographic region than national news outlets.

2) In a media environment that focuses on one event, or what researchers would call a media storm, “liberals” and “conservatives” respond to each other very quickly, within the span of a few minutes. Given the hybrid nature of the U.S. media system, it is likely that media storm dynamics will impact social media, particularly Twitter(as a platform for professional journalism). Capturing this dynamic in media storms, therefore, requires very granular levels of data.

3) To understand the politics, one needs to understand the culture of that society. Regional cultural references were an important feature of this discourse, which was unique compared to the post-AP tweet time span. In this latter time, tweets were still focused on Walker’s loss (rather than Ever’s win). However, following Associated Press’ reporting, the tweets were predominantly by those outside of Wisconsin. The story was reaching national attention, and the discourse had lost this specific local component.

Overall, this was an interesting project for me to examine how a state-wide political event goes national on Twitter in an hour and a half.

Tweets about WI Gubernatorial Race Part I: October 28 to Nov 6

Politically, Wisconsin is quite different from my home state of New York. It’s long been considered a purple, or swing, state. For that reason, Wisconsin has often received extra national attention when it comes to local or state-wide politics.

The 2018 Midterm Elections were another example of this, with many citizens around the country tracking Governor Scott Walker’s race against Superintendent Tony Evers. Today, I explore how Twitter talked about this race in the week leading up to Election night (October 28 to Nov 7). This post will focus on the lead-up to the election. Part II will focus on the last few hours of the election (12:30 to 2:30 on November 7, 2018).

(Note: Tweets were collected using the r package rtweets. All datetimes have been converted to CST. For more information about this collection and analysis, please scroll to the bottom)

A broad temporal view: Oct 28 to Nov 6

In the week leading up to the election, there were several noteworthy spikes. We focus on two in particular: November 1 (8-9pm) and November 4 (7pm).

November 1, 2018 from 8:00-9:59 pm

This was the largest spike for Walker in this week (1568 tweets in two hours). Far and away, the most common verb used was variants of “call” (e.g., “called”/”calls”/”calling”). This is because, that day, Governor Walker said that President Obama was "the biggest liar of the world.” This language (employed by non-journalists and journalists alike) was also employed in leads of news stories in Fox News and The Hill).

November 4, 2018 from 7:00-7:59 PM

Although this peak was not as prominent as the others explored here, it is one of the few times that Evers exceeded Walker in references on Twitter.

Many of these tweets appeared to be campaign-oriented tweets about Evers’ support for Wisconsin residents. Unlike the previous spike, there did not seem to be an event aligned with this moment in time. This suggests that this spike was campaign-induced, rather than naturally generated.

A closer look at Election Day

As can be seen in the above image, attention to the Walker/Evers election peaked after 12:00 AM CST, late in the night relative to other well-watched races that day. Votes rolled in minute by minute, with many outlets (including NYT, one of my main trackers) showing a less than 1% margin for several hours.


Tweets were collected using Mike Kearney’s rtweets. I began my search at 2:40 AM CST on November 7, 2018, using the search terms “Scott Walker” OR “Tony Evers” OR “#wipolitics” OR “#wielection“. Twitter’s REST API provides an about 1% random sample of tweets. This yielded about 111,000 tweets.

Tweets were annotated for their part-of-speech and dependency using coreNLP. Within the corpus, there were over three million dependencies.

August: The Month of Travel!

It's been quite some time since I've done a lot of travel, but my August will be all about trips, trips, trips!

In the beginning of the month, I will be attending sixth AEJMC in Washington D.C. (Aug 6-9)  to present my work on news coverage with tweets written by Russian IRA accounts. I'm looking forward to presenting my work, and taking some time to visit the city!

Then, it's off to NYC for Restaurant Week and to celebrate a friend's birthday!

Back to Madison briefly, to get ready for a family trip to Europe with John! Our Europe trip includes stops in Keflevik, Iceland; Paris, France; and Amsterdam, the Netherlands. After several years of travel-less-ness, my wanderlust is really itching.

Here's to a month of good adventures, new ideas, and an ever-expanding universe! - Jo

Time Series of IRA Activity on U.S. Social Media Platforms

So I've been toying around with some of the data on other social media platforms, now that much of it has been made publicly available. I'm looking forward to doing a more systematic analysis of the content. In the meantime, however, here are some counts of IRA activities on different social media platforms from 2015 to 2017. 

I was somewhat surprised to see that the time series did not line up as neatly as I thought they would have. Perhaps these strategies are meant to complement each other? This is where a deeper dive into the content or the account would be more useful. For example, perhaps conservative-imitating IRA accounts (e.g., Twitter's @TEN_GOP) responded to different things compared to liberal imitating IRA accounts (e.g., Facebook/Twitter's @Blacktivist group). 

Given the pending lockdown of information regarding this case, it is more important than ever to share and verify this information. It's a shame researcher do not get much access to this kind of data, as scientific rigor should be the minimum standard for analyzing potential foreign influences into American elections. 

Reddit Data Source: [Link]
Facebook Data Source: [Link]

Advertisements purchased by IRA on Facebook

Submissions to Reddit by IRA-controlled accounts

Tweets written by the IRA

Regarding the separation of immigrant families in the United States:

The history of the United States is one of cruel domination and inhumanity.

Since the creation of the United States in 1776 (242 years ago), until 1865 (153 years ago), American citizens owned Black slaves. Jim Crow laws enforced racial segregation for another 100 years (until 1965).

188 years ago (in 1830, under Andrew Jackson), the United States passed the Indian Removal Act, resulting in the forced relocation of over 10,000 Native Americans (over 2,000 died).

125 years ago (in 1893), U.S. settlers overthrew the King of Hawai’i, with the intent of annexation. Under duress, then-King Kalakaua was forced to sign a new constitution that relinquished his power to white Americans who controlled the legislature. Despite opposition by then-President Grover Cleveland, Hawai’i became a state in 1958 (Eisenhower).

Following the brutal Philippine-American War 119 years ago (1899, 200,000+ deaths), the United States (represented by then-Governor of the Philippines Taft) imposed a strict rule over the island that lasted until WWII, when the U.S. left the Philippines to fend for themselves against Japan.

76 years ago (1942, FDR), the United States forced over 100,000 residents of Japanese ancestry into an internment camp. The U.S. Census Bureau only admitted their complicity in 2007. 

Knowing this history should allow us to avoid the inhumanity of our forefathers. And yet, we have failed to do this time and time again. We let paranoia and xenophobia and supersede logic, compassion, and whatever the U.S. claims to stand for. Don’t make that mistake today.

In 2018, the United States apprehended and separated between 1,000 and 2,000 children from families trying to cross the U.S.-Mexican border. Over 11,000 children are held in Office of Refugee Resettlement (ORR) sites, which have been overfilled for Do4 years (since 2014). The ORR regularly loses children (according to one NYT story, 1,475 children cannot be found). 

What can you do about this?

  1. Support the ACLU; whose chapters in California are actively litigating.
  2. Donate to Act Blue, a collective of eight groups who oppose the separation of children from parents when attempting to cross the U.S. border.
  3. Call your Senator and express your opposition. Don't worry - Senator's offices are very used to this type of call. You can check out the above link for an example script.
  4. If you are in a major city, volunteer to become a Child Advocate through the Young Center for Immigrant Children's Rights.



Understanding a little more about recent coverage of Korean-U.S. relations through adjective use

Yesterday, U.S. President Trump pulled out of a "highly-anticipated" summit meeting with North Korea's Kim-Jung Un. Given the freshness of this story, it'll take some time collect enough articles to do an anlaysis of this specific incident. But, in the meantime, some interesting results from my analysis of Korean-U.S. relations in American news below.

(Data cleaned and analyzed using R tidytext, quanteda, and OpenNLP. Graphs produced by ggplot2 or MediaCloud.)

Count of articles using the words "Trump" and "North Korea" in top American news media (digital + traditional). Results gathered using MediaCloud archive.

Count of articles using the words "Trump" and "North Korea" in top American news media (digital + traditional). Results gathered using MediaCloud archive.

As we can see above, the majority of the coverage appeared to be between May 7 (when North Korea claimed to have demolished a nuclear test site) and May 21. Using those two weeks as my window, I pulled all articles referencing "Trump" and "North Korea" from four news outlets: CNN (n =96), Fox (n = 114), the New York Times (n = 89) and the Washington Post (208), a total of 507 news stories.

I tagged all the words in the news stories for their part of speech using OpenNLP. I then pulled out all the adjectives, removed duplicates, and screened them for accuracy (OpenNLP has an above 90% accuracy, but the human eye is critical to ensuring quality results). I finally looked at the use of these adjectives in relation to specific actors/parties (mainly North Korea, South Korea, and the United States). Given the effect of political personalization, I consider both the country name and the name of the leader (e.g., "North Korea" OR "Moon Jae-In" OR "President Moon" OR "Moon Jae In") as keywords. I retained the adjective if it appeared within three words of the NK, SK, or US keywords.

Raw counts are presented below (keep in mind the corpus is not perfectly balanced... also, sorry I was too lazy to reorder the charts XD Just so tired and wanted to practice some code):

Most commonly used adjectives related to Trump/U.S.


Most commonly used adjectives related to Kim Jung-Un and North Korea


Most commonly used adjectives related to President Moon and South Korea