7.1 Similarities, Analogies and Dictionary Expansion
Word embeddings are all the rage.1 Whenever we have represented words as data in previous weeks, we have simply counted how often they occur across and within documents. We have largely viewed words as individual units: strings of text that uniquely identify a given meaning, for which we have had no natural notion of similarity for grouping similar words together.
1 A good qualitative indicator of the success of an innovation in quantitative methods is when they are discussed in some detail in the London Review of Books
By contrast, word-embedding approaches represent each unique word in a corpus as dense, real-valued vector. As we discussed in the lecture, these vectors turn out to encode a lot of information about the ways in which words are used, and this information can put to good use across a wide range of questions in the social sciences.
In the seminar today, we will familiarise ourselves with some of the pre-trained word embeddings from the GloVe project. We will use these vectors to discover similarities between words, to compute analogy-based tasks, and to supplement the dictionary-based approaches to measurement that we covered in week 2.
7.2 Packages
You will need to load the following packages before beginning the assignment
7.3 Data
Today we will be using the pre-trained GloVe embeddings, which can be downloaded from the link at the top of the seminar page. Note that the file which contains the word embeddings is very large! It may therefore take a minute or two to download, depending on your internet conection.
Despite the large size of the file, we are actually using one of the smaller versions of the GloVe embeddings, which were trained on a combination of Wikipedia and news data. The embeddings are of dimension 300 and cover some 400,000 words. Note that you could replicate any of the assignment here with larger versions of the GloVe embeddings by downloading them from the GloVe project website, but any differences for the applications here are likely to be small.
7.4 Word Similarities
- Load the glove embeddings into R using the
load()
function.
- Look at the dimensions of the
glove
embeddings object. How many rows does this object have? How many columns? What do these represent?
Reveal code
Rows represent words. Columns represet the dimensions of the embedding.
Write a function to calculate the cosine similarity between a selected word and every other word in the glove embeddings object.2 It will be useful for you to use the
sim2()
function3 from thetext2vec
package here. Your function should take two inputs:target_word
– the word for which you would like to calculate similaritiesn
– the number of nearest neighbouring words returned
2 In contrast to previous weeks, I have not given you the full solution here. Instead, I have provided some starter code below. You should be able to work out what goes in each part of this function by looking at the examples in the lecture slides. I will release the full code when I release the homework solutions at the end of the week.
3 Note that this function requires two main arguments: 1) x
– a matrix of embeddings. 2) y
– a second matrix of embeddings for which you would like to compute similarities. It is important to note that both of these inputs must be in matrix form. As the mean vector embedding that we created above is actually a numeric vector, we have to transform it to a matrix that has the same number of columns as the glove
embeddings object. To do so, use the matrix
function, setting the nrow
argument equal to 1.
Reveal code
- On the basis of the Glove word embeddings, what are the 7 most similar words to the words “quantitative”, “text”, and “analysis”?
7.5 Word Analogies
- Write a function that computes analogies of the form “a is to b as c is to ___”. For instance, if b is”king”, a is “man”, and c is “woman”, then the missing word should be “queen”.
Your function will need to take four arguments. Three arguments should correspond to the words included in the analogy. The fourth should be an argument specifying the number of nearest neighbouring words returned. Again, I have provided some starter code below, which you should be able to complete by consulting the lecture slides.
Reveal code
Use the function you created above to find the word-embedding answers to the following analogy completion tasks.
- Einstein is to scientist as Picasso is to ___?
- Arsenal is to football as Yankees is to ___?
- Actor is to theatre as doctor is to ___?
- Come up with some of your own analogies and try them here.
7.6 Dictionary Expansion
In seminar 2 we used the Moral Foundations Dictionary to score some Reddit posts in terms of their moral content. In this exercise we will expand the “care” category of the MFD using the Glove embeddings.
For this part of the assignment, you will need to have access to the files that we used in seminar 2. These were mft_dictionary.csv
and mft_texts.csv
. Go and locate them now (or redownload them if you need them).
Once you have found these files, load them into R:
- Create a vector of the MFT “Care” words.
- Extract the embeddings from the
glove
object relating to the care words.
- Calculate the mean embedding vector of the care words. To do this, use the
colMeans
function, which will calculate the mean of each column of the matrix.
- Calculate the similarity between the mean care vector and every other word in the
glove
embedding object. To do so, use thesim2()
function again.
- What are the 500 words that have highest cosine similarity with the mean care vector? How many of these words are in the original dictionary?
Reveal code
- Examine the words that are in the top 500 words that you calculated above but which are not in the original care dictionary. Do these represent the concept of care?
Reveal code
[1] "traumatized" "victimized" "cruelly" "helpless"
[5] "innocent" "unborn" "sufferings" "endure"
[9] "terrified" "frightened" "sick" "callous"
[13] "wronged" "civilians" "viciously" "senseless"
[17] "terrorizing" "frighten" "beatings" "horrific"
[21] "risking" "inhumane" "unspeakable" "confess"
[25] "humiliation" "defenseless" "loneliness" "terrorize"
[29] "grief" "bereaved" "injustice" "subjecting"
[33] "vengeful" "innocents" "misfortune" "abuse"
[37] "neglect" "plight" "treating" "traumatised"
[41] "stigmatized" "oppression" "starving" "humiliate"
[45] "oftentimes" "grievous" "unjustly" "grieving"
[49] "humiliated" "betrayed" "spared" "mutilation"
[53] "lest" "ashamed" "heinous" "enemies"
[57] "abusive" "barbaric" "elderly" "starve"
[61] "fear" "neglecting" "terrible" "deprived"
[65] "dignity" "deprive" "beings" "dying"
[69] "mercilessly" "hatred" "grievously" "oneself"
[73] "vicious" "succumb" "feelings" "schoolmates"
[77] "fearful" "horrible" "horrifying" "sparing"
[81] "hardships" "afraid" "risked" "indiscriminate"
[85] "unnecessarily" "bystanders" "heartless" "shame"
[89] "ordeal" "offends" "subjected" "enslavement"
[93] "handicapped" "disturbed" "humanity" "sacrificing"
[97] "degrading" "oppressed" "treat" "retribution"
[101] "maiming" "injure" "terrify" "terminally"
[105] "unbearable" "betray" "suicidal" "pretending"
[109] "seriously" "perpetrated" "destitute" "maimed"
[113] "perpetrator" "insult" "demeaning" "depraved"
[117] "betraying" "selfishness" "aiding" "traumas"
[121] "taunt" "brutal" "belittling" "sickening"
[125] "despair" "needless" "orphans" "repress"
[129] "terrorized" "hardship" "scared" "infirm"
[133] "husbands" "savagery" "townspeople" "mentally"
[137] "punishing" "disciplining" "sins" "savagely"
[141] "escaping" "teasing" "sickness" "distraught"
[145] "captors" "pregnant" "oppress" "spouse"
[149] "indignity" "intolerable" "intimidated" "forgiveness"
[153] "countrymen" "cursed" "conscience" "knowing"
[157] "trauma" "deserve" "punishes" "strangling"
[161] "wickedness" "sinful" "punished" "cruelties"
[165] "helplessness" "punish" "disrespect" "perceived"
[169] "appalling" "hysterical" "bystander" "disfigurement"
[173] "treachery" "homosexuals" "debilitating" "evils"
[177] "taunts" "vindictive" "betrayal" "tolerate"
[181] "provokes" "thoughtless" "avenge" "intimidate"
[185] "feel" "offend" "despicable" "needlessly"
[189] "malnourished" "sexually" "tolerating" "bodily"
[193] "terrifying" "passivity" "abduct" "betrays"
[197] "trusting" "frightening" "expose" "misguided"
[201] "barbarity" "severely" "perceive" "imprison"
[205] "horrendous" "depriving" "sadistic" "committing"
[209] "unworthy" "treated" "unjust" "slaughtering"
[213] "painful" "debilitated" "scolding" "enslave"
[217] "aftereffects" "disrespectful" "victimised" "awaken"
[221] "humankind" "resentful" "suffocate" "hypocritical"
[225] "cowardly" "fleeing" "judgmental" "ridicule"
[229] "insecurities" "complicit" "misery" "caretakers"
[233] "detriment" "physically" "tenderly" "habitually"
[237] "malnutrition" "punishment" "misbehaving" "villagers"
[241] "emotionally" "relatives" "selfish" "deserving"
[245] "destitution" "gravely" "exposing" "companionship"
[249] "squeamish" "brutally" "guilt" "imprisoning"
[253] "orphaned" "criminals" "injustices" "adolescents"
[257] "stigma" "disobedient" "sacrificed" "survivors"
[261] "remorse" "empathetic" "wanton" "insults"
[265] "unsuspecting" "enslaving" "aggression" "involuntarily"
[269] "outweighs" "ignorance" "screams" "addicted"
[273] "ostracized" "subordinates" "immoral" "caregivers"
[277] "merciless" "perpetrators" "powerlessness" "mutilating"
[281] "ills" "depredations" "stab" "affection"
[285] "ill-treatment" "ill" "blinded" "callously"
[289] "insulted" "manipulative" "verbally" "unintentionally"
[293] "distract" "illness" "ungrateful" "deprivation"
[297] "pretend" "undermines" "disfigured" "impotent"
[301] "cursing" "inconvenience" "motivates" "witnessing"
[305] "aggressors" "jealousy" "suffocating" "children"
[309] "sacrifices" "jealous" "hideous" "ostracism"
[313] "perverted" "horrified" "insensitive" "confronting"
[317] "illnesses" "befriend" "scourge" "willful"
[321] "repression" "revenge" "annoy" "scarred"
[325] "curses" "throats" "jailers" "horribly"
[329] "repressed" "bigotry" "excruciating" "befriending"
[333] "coerce" "traumatic" "ugliness" "revulsion"
[337] "exposes" "patronizing" "stepmother" "newborns"
[341] "indulging" "promiscuous" "confront" "ministering"
[345] "unconscionable" "insidious" "tenderness" "indifference"
[349] "gruesome" "trampling" "embittered" "despise"
[353] "cowardice" "hopelessness" "underlings" "horrors"
[357] "scold" "atrocious" "banish" "persecutions"
[361] "brainwashed" "indignities" "banishing" "pretended"
[365] "abhorrent" "wrongs" "genitals" "counseled"
[369] "atrocities" "susceptible" "ferocity" "indifferent"
[373] "autistic" "deprivations" "demoralizing" "unfaithful"
[377] "transgressions" "brainwashing" "ghastly" "insufferable"
[381] "taunting" "pillage" "believing" "unconscious"
[385] "afflicting" "muggers"
It is relatively uncontroversial to suggest that these words are representative of the concept of “care”.
- What does your answer to the previous question suggest about this dictionary expansion approach?
Reveal code
The idea here is that using the word-embeddings has allowed us to automatically expand the set of of words associated with a concept that we previously measured using a dictionary of terms that were manually selected. This means that we can use information about word similarity to supplement our existing measurement approaches. Whether this leads to performance improvements in terms of classification is the subject of this week’s homework.
7.7 Homework
The mft_texts
object includes a series of variables that record the human annotations of which category each text falls into. In this week’s homework, you will again use dictionary-based methods to score the texts, and compare the dictionary scores to those human codings. If you have forgotten how to apply dictionaries, go back and look at the material in seminar two.
- Create a new dictionary which includes two categories. The first should be a
care_original_words
category, which contains only the words from the original care dictionary. The second should be acare_embedding_words
which contains both the original care words and the top 500 words that you extracted in the last section.
- Use the dictionary you just constructed to score the scores in the
mft_texts
object. Create variables in that object that indicate whether a given dictionary classifies each text as a care text or not (i.e. classify a text as a care text if it contains any words from the relevant dictionary).
- Create a confusion matrix which compares the human annotations to the scores generated by the dictionary analysis. Which performs best, the original dictionary or the word-embedding approach?
You should upload a paragraph explaining the results from the final question of the homework to this Moodle page.