The split infinitive: the final frontier

[This post was published previously on Rpubs on Feb. 16th, 2016. This is an updated version.]

To split or to not split

My linguistics students asked me if the split infinitive had been invented by Star Trek’s Captain Kirk. The famous line “To boldly go where no man has ever gone before” was part of the original Star Trek opening credit sequence from 1966 onwards.

Here is the full script:

Space: The final frontier
These are the voyages of the Starship, Enterprise
Its 5-year mission
To explore strange new worlds
To seek out new life and new civilizations
To boldly go where no man has gone before.

The insertion of the adverb boldly between the marker to and the verb go caused quite a stir among prescriptivists at the time (ironically, the sexism of “no man” caused no such uproar). This usage is still branded as incorrect.

‘To split’ means to divide a complex compound into separate entities (as in “the river Seine splits Paris in two” or “the scientist broke down a molecule into its atomic constituents”). Merriam-Webster’s Dictionary has an entry dedicated to the split infinitive:

4: to separate (the parts of a whole) by interposing something <split an infinitive>

Arguing against splitting an infinitive makes sense in the context of Latin languages. For instance, no one would ever think of splitting the one-word infinitive verb aller ‘go’ in French into al and ler. But in a Germanic language like English, to go is not a one-word verbal unit but the pairing of a former spatial preposition and the base form of a verb separated by a space. When there is a space there is a way, and speakers might be tempted to fill in the gap (after all, language, like nature, abhors a vacuum). In fact, no descriptive grammar of English states that the adjacency between to and the base verb is obligatory.

Modern grammar textbooks such as Huddleston and Pullum’s A Student’s Introduction to English Grammar (2005) point out that “[p]hrases like to really succeed have been in use for hundreds of years”. They also claim that “in some cases placing the adjunct between to and the verb is stylistically preferable to other orderings” (see also this blog post).

Prescriptivism is fine as long as it is based on empirical evidence. By empirical evidence I mean generalizations over how native speakers speak. This is what contemporary grammar teaching is about. Prescriptivism is a problem if it is the work of a self-appointed language authority who deliberately ignores the assets of descriptivism.

Motion charts

Kudos to my colleague Martin Hilpert for popularizing motion charts in linguistics. You will find lots of examples and references in Martin’s dedicated page.

For more details regarding the code behind each motion chart, see this Google Developers page.

Making a motion chart is easy, but coercing the data frame into a format that the gvisMotionChart() function recognizes is another story. As far as I am aware, there is no online tutorial for reshaping the data into the desired format (only demos with preformatted data sets).

Tools

Before you proceed, you should make sure that you have the following:

  • a spreadsheet sofware (MS Excel or LibreOffice Calc),
  • a text editor: e.g. Notepad++ for PC users and TextWrangler for Mac OS X users,
  • R, of course.

In this demo, I am running Excel and TextWrangler on Mac OS Sierra (10.12.6).

Getting data from the corpus

the corpus

You need diachronic data. The Corpus of Historical American English is what we need. It is developed and maintained by Mark Davies and his team at corpus.byu.edu. The COHA consists of 400 million word tokens and 115,000 texts. The corpus is balanced by genre across twenty decades from the 1810s to the 2000s. It is perfect to see how American English has changed in the past two centuries.

If you have not done it yet, visit http://corpus.byu.edu/, register (it is free), and login. Then, go to http://corpus.byu.edu/coha/old and enter the corpus. This takes you to the query interface.1

the queries

You have to run two queries. One for split infinitives and another for unsplit infinitives. To make the search easier, we shall restrict the extraction to adverbs in -ly (e.g. boldly, really, absolutely, etc.). A split infinitive will be defined as to followed by any -ly adverb, followed by the base form of any verb. An unsplit infinitive will be defined as to followed by the base form of any verb, followed by any -ly adverb. Now, we need to translate these definitions into something that the query form recognizes.

Queries made via http://corpus.byu.edu/ follow a specific syntax. Each part of speech has a code. To retrieve all kinds of adverbs, you should enter [r*]. To retrieve all adverbs that end in -ly, add *ly as a prefix (* stands for a wildcard, i.e. ‘one or more word characters’). That gives you: *ly.[r*]. To retrieve the base form of any verb, you should enter: [v?i*]. When you combine these codes, you obtain the following:

  • syntax for split infinitives: to *ly.[r*] [v?i*]
  • syntax for unsplit infinitives: to [v?i*] *ly.[r*]

Let us start with the split infinitive. The pattern to *ly.[r*] [v?i*] should be entered in the “WORD(S)” search box (in the upper-right corner of the left frame). You should also click “CLICK TO SEE OPTIONS” at the bottom left of the page and set “FREQ” to 1000 instead of 100. This allows you to get a larger number of hits. Leave the other options unchanged.

corpus query

Looking for split infinitives in COHA

After a few seconds, the results are displayed to the right.

results

The results of the corpus query

Click anywhere in the right frame and press CONTROL + A (or CMD + A if you are on a Mac). Paste the selection into a spreasheet (CONTROL + V or CMD + V).

the clean-up

As you can see, the ouput of cut and paste is messy, and there is some manual clean-up to do. Note that the output depends on what browser you use.

excel_messy

What the data looks like after copying and pasting from COHA

In Excel, delete unwanted rows and columns (don’t forget to delete the row total at the bottom of the table) and shift the column header to the right so that each decade is on top of its own column. Replace each empty cell with 0. Assign the name WORD to the column that contains the matches. In this column, we only want the adverb, so we have to delete TO and the verb. This is can be done easily in a text editor that implements regular expressions.

Copy and paste the whole table into your text editor. Activate the find-and-replace function by entering CONTROL/CMD + F and make sure the grep option is active. To remove TO and the verb, replace TO (\w+LY) \w+ with \1. When you deal with the unsplit infinitive, it is TO \w+ (\w+LY) that you will have to replace with \1. To remove all remaining spaces and trailing spaces, replace |^\s with an empty character, i.e. nothing (note that there is a space before | in  |^\s).

Once you are happy with the clean-up, save the text file using an obvious filename, e.g. split_inf.txt. Repeat the above steps for the unsplit infinitive. Once you are done, you should have two distinct text files: split_inf.txt and unsplit_inf.txt.

Reshaping the tabulated data with R

There are two remaining issues:

    1. your data consists of two data frames instead of one;
    1. your two data frames do not have the format that the googleVis package requires.

In other words, you must go from two data frames in which each decade is a variable to a single data frame where decades are factors of a single variable. Let us see how we can obtain the desired data format in a few lines of code. Two R packages come to the rescue: reshape and plyr.

Install the reshape package.

install.packages("reshape")

Load the package and the data frame.

# load reshape
library(reshape)
# load the split-infinitive data frame
split <- read.delim("split_inf.txt", header=TRUE, check.names=FALSE) 
# inspect
str(split) 
## 'data.frame':    1000 obs. of  21 variables:
##  $ WORD: Factor w/ 202 levels "ABRUPTLY","ABSOLUTELY",..: 67 125 125 67 125 125 125 139 67 5 ...
##  $ 1810: int  0 0 0 1 0 0 0 0 0 0 ...
##  $ 1820: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ 1830: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ 1840: int  1 0 0 0 0 0 0 0 0 0 ...
##  $ 1850: int  1 0 0 0 0 0 0 0 1 0 ...
##  $ 1860: int  3 0 1 1 0 0 0 1 0 0 ...
##  $ 1870: int  2 0 1 1 0 0 0 1 2 0 ...
##  $ 1880: int  4 0 0 4 2 0 0 1 4 0 ...
##  $ 1890: int  4 1 4 3 0 0 0 0 1 0 ...
##  $ 1900: int  2 1 2 2 9 2 2 2 2 1 ...
##  $ 1910: int  1 1 5 2 1 0 1 0 1 0 ...
##  $ 1920: int  1 1 4 0 0 0 0 0 0 0 ...
##  $ 1930: int  1 0 3 0 0 1 0 0 1 0 ...
##  $ 1940: int  1 1 4 0 0 0 0 0 0 0 ...
##  $ 1950: int  0 3 1 0 1 2 1 1 0 0 ...
##  $ 1960: int  3 5 3 1 2 2 2 0 0 0 ...
##  $ 1970: int  0 4 1 2 0 1 1 4 0 1 ...
##  $ 1980: int  5 4 1 2 2 2 1 2 0 0 ...
##  $ 1990: int  16 3 8 3 2 6 7 5 2 7 ...
##  $ 2000: int  7 18 4 11 3 5 6 4 2 7 ...

With reshape, we “melt” the data so that each row is a unique word-decade-frequency combination.

# melt
split.melt <- melt(split, id="WORD")
# inspect
str(split.melt) 
## 'data.frame':    20000 obs. of  3 variables:
##  $ WORD    : Factor w/ 202 levels "ABRUPTLY","ABSOLUTELY",..: 67 125 125 67 125 125 125 139 67 5 ...
##  $ variable: Factor w/ 20 levels "1810","1820",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : int  0 0 0 1 0 0 0 0 0 0 ...

Let us make the names of the second and third columns more explicit.

 # change variable name colnames(split.melt)[2] <- "DECADE"
# change variable name
colnames(split.melt)[3] <- "SPLIT_INF" 
 # inspect
head(split.melt, 10)
##         WORD DECADE SPLIT_INF
## 1      FULLY   1810         0
## 2     REALLY   1810         0
## 3     REALLY   1810         0
## 4      FULLY   1810         1
## 5     REALLY   1810         0
## 6     REALLY   1810         0
## 7     REALLY   1810         0
## 8  SERIOUSLY   1810         0
## 9      FULLY   1810         0
## 10  ACTUALLY   1810         0

Now, repeat with unsplit_inf.txt.

# load the unsplit-infinitive data frame
unsplit <- read.delim("unsplit_inf.txt", header=TRUE, check.names=FALSE)
# inspect
str(unsplit) 
## 'data.frame':    1000 obs. of  21 variables:
##  $ WORD: Factor w/ 380 levels "ABSOLUTELY","ABUNDANTLY",..: 230 104 243 136 279 207 1 97 377 105 ...
##  $ 1810: int  0 6 5 2 1 0 2 0 1 3 ...
##  $ 1820: int  15 18 11 8 9 12 3 21 15 12 ...
##  $ 1830: int  21 32 20 26 2 5 11 20 17 27 ...
##  $ 1840: int  34 41 33 20 14 16 11 21 30 20 ...
##  $ 1850: int  50 35 29 17 14 12 5 29 30 22 ...
##  $ 1860: int  40 53 38 11 3 13 6 31 24 21 ...
##  $ 1870: int  40 42 48 20 15 14 22 22 23 19 ...
##  $ 1880: int  48 42 32 32 17 28 19 22 20 23 ...
##  $ 1890: int  46 43 49 25 20 22 26 16 26 17 ...
##  $ 1900: int  45 33 35 15 35 17 25 19 19 12 ...
##  $ 1910: int  48 31 34 18 24 24 35 19 21 8 ...
##  $ 1920: int  56 44 28 18 30 36 21 10 13 18 ...
##  $ 1930: int  35 27 24 13 19 21 27 11 17 14 ...
##  $ 1940: int  38 27 11 10 21 25 11 2 10 14 ...
##  $ 1950: int  47 13 26 12 14 18 19 12 9 12 ...
##  $ 1960: int  39 14 18 24 20 19 20 8 6 10 ...
##  $ 1970: int  45 9 26 20 20 13 12 8 5 8 ...
##  $ 1980: int  44 11 20 14 10 11 20 9 3 8 ...
##  $ 1990: int  18 12 19 22 23 13 13 6 3 15 ...
##  $ 2000: int  31 9 24 31 31 5 14 8 2 10 ...
# melt
unsplit.melt <- melt(unsplit, id="WORD") 
# change variable name
colnames(unsplit.melt)[2] <- "DECADE" 
# change variable name
colnames(unsplit.melt)[3] <- "UNSPLIT_INF"
# inspect
head(unsplit.melt, 10) 
##          WORD DECADE UNSPLIT_INF
## 1        ONLY   1810           0
## 2    ENTIRELY   1810           6
## 3   PERFECTLY   1810           5
## 4       FULLY   1810           2
## 5      REALLY   1810           1
## 6      MERELY   1810           0
## 7  ABSOLUTELY   1810           2
## 8      EASILY   1810           0
## 9      WHOLLY   1810           1
## 10    EQUALLY   1810           3

Merge the two data frames (split.melt and unsplit.melt) into a unique data frame (df).

 # merge
df <- merge(split.melt, unsplit.melt, by=c("DECADE","WORD"))
 # set DECADE to numeric 
df$DECADE <- as.numeric(as.character(df$DECADE))

You are almost there! Summarize the merged data frame, this time using plyr.

install.packages("plyr")
# load plyr
library(plyr) 
# summarize
 df <- ddply(df, c("WORD","DECADE"), summarize, SPLIT_INF=sum(SPLIT_INF), UNSPLIT_INF=sum(UNSPLIT_INF))
# inspect
head(df) 
##         WORD DECADE SPLIT_INF UNSPLIT_INF
## 1 ABSOLUTELY   1810         0           2
## 2 ABSOLUTELY   1820         0           3
## 3 ABSOLUTELY   1830         0          13
## 4 ABSOLUTELY   1840         0          11
## 5 ABSOLUTELY   1850         0           5
## 6 ABSOLUTELY   1860         0           6
# add a total column for combined frequencies 
df$TOTAL_FREQ <- df$SPLIT_INF + df$UNSPLIT_INF
 # inspect
head(df, 10)
##          WORD DECADE SPLIT_INF UNSPLIT_INF TOTAL_FREQ
## 1  ABSOLUTELY   1810         0           2          2
## 2  ABSOLUTELY   1820         0           3          3
## 3  ABSOLUTELY   1830         0          13         13
## 4  ABSOLUTELY   1840         0          11         11
## 5  ABSOLUTELY   1850         0           5          5
## 6  ABSOLUTELY   1860         0           6          6
## 7  ABSOLUTELY   1870         0          22         22
## 8  ABSOLUTELY   1880         3          20         23
## 9  ABSOLUTELY   1890         3          26         29
## 10 ABSOLUTELY   1900         0          26         26

That’s it.

Plotting the results with googleVis

Thanks to the googleVis package for R, plotting requires only two lines of code (ok, four if you count the lines used to download and load the package).

install.packages("googleVis")
library(googleVis)
M1 <- gvisMotionChart(df, idvar="WORD", timevar="DECADE")
plot(M1)


A slightly longer video is available here.

The gvisMotionChart()  function outputs code that you can copy and paste into an html page. There is a downside, though. The script relies on JavaScript and is rendered within the browser using Flash. Due to security settings, the motion chart might not display correctly on all browsers.

Interpreting the motion chart

Each bubble stands for an adverb. The size of the bubble depends on the adverb’s combined frequency in both split and unsplit infinitive constructions. The position of the adverb indicates how frequently it occurs in the split (x axis) or unsplit (y axis) infinitive. The closer an adverb gets to the diagonal from the lower-left corner to the upper-right corner of the plot, the more compatible it is with both constructions. The further right an adverb goes, the stronger its preference for the split construction. The further up an adverb goes, the stronger its preference for the unsplit construction.

Before you click on play, you may want to adjust playback speed (it’s the button right next to the play button). You may also want to change the display from raw frequencies (Lin) to log-transformed values (Log): this has the effect of spreading the data points and making tendencies easier to spot.

Unsurprisingly, the unsplit infinitive is far more frequent than its split counterpart. Nevertheless, a handful of adverbs (such as “really”, “fully”, “only”, “carefully”) make occasional inroads into split constructions (e.g. 1860s-1890s). The years around 1900 are the most conservative. The situation changes slightly after World War II. Disappointingly, the airing of Star Trek does not seem to have any visible impact around 1966. “Really” and “fully” stand out as the boldest adverbs: they lead the trend from the 1980s onwards. “Boldly”, on the other hand, does not bulge.

The toy dataset that I used has limitations (small size, only one adverb type, etc.), and the corpus is certainly biased with respect to genre. Therefore, we should be wary of making final conclusions based on this motion chart alone. Having said that, motion charts are great as a first approach.

Cite this article as: Guillaume Desagulier, "The split infinitive: the final frontier," in Around the word, 17/11/2017, https://corpling.hypotheses.org/30.
  1. This is the older interface of the corpus. Somehow, I prefer it to the newer version. []

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.