Ressources numériques en sciences humaines et sociales OpenEdition Nos plateformes OpenEdition Books OpenEdition Journals Hypothèses Calenda Bibliothèques OpenEdition Freemium Suivez-nous

Errata

Last update: October 24th, 2024

Chapter 1

  • p. 2

“no corpus, however large and balanced, can ever hoped to be representative of a speaker […]” –> “can ever hope” (source : Christophe Béchet, Université de Liège, Belgium)

  • p. 4

“[…] used to compile the spoken component of the British National Corpus The British National Corpus (2007).” –> duplicate (source : C. Béchet, henceforth C.B.). This is due to how LaTeX generates the bibliographical reference.

  • p. 5

“the materiality its database, or lack thereof” –> “the materiality of its database” (C.B.)

Chapter 2

  • p. 20

“each type you type age” –> “each time you type age” (C.B.)

  • p. 38

A slash is missing in the following line of code:

df <- read.table("C:/CLSRchap2/sample.df.txt", header=TRUE, sep="\t") # Windows

It should be:

df <- read.table("C:/CLSR/chap2/sample.df.txt", header=TRUE, sep="\t") # Windows
  • p. 39

(footnote) “with regards to its mode” –> “with regard to” (C.B.)

  • p. 40

To export df.manual.2, you have two options. If you want to preserve row numbering, provide col.names=F. Row numbers have a separate column.” –> “If you want to preserve row numbering, provide col. names=NA” (source : Shengyu Liao, PhD student at the Department of Linguistics, University of Florida)

Chapter 3

  • p. 51

“until its compiler stopped adding more text materials 2015.” –> “[…] stopped adding text materials in 2015.” (C.B.)

“The Bank of English The Bank of English (1980s-present)” –> “The Bank of English (1980s-present)” (C.B.) Again, this is due to the LaTeX rendering of the bibliography.

  • p. 54

“40000 books” –> “40,000 books” (C.B.)

  • p. 55

“the default language of the system if English” –> “[…] is English” (C.B.)

  • p. 57

“Creating a plain-text, unannotated corpora” –> “Creating a plain-text, unannotated corpus” (C.B.)

  • p. 62

original code

install.packages(c("NLP", "openNLP", "stringr"))

corrected code:

install.packages("NLP", "openNLP", "stringr")

(thanks go to Christian Paga, PhD candidate at the Department of Anglophone Studies at University of Duisburg Essen, Germany, for pointing this out to me).

Also, getting openNLP to work requires rJava. Depending on your version of macOS, getting openNLP to work can be very tricky. Please take a look at this blog post.

  • p. 66

It seems that the necessary arguments for TreeTagger to understand that the text is in German are already added. (C.B.)

Chapter 5

  • p. 88

code snippets: In order to avoid encoding issues while reading in the file in R, C.B. suggests to add encoding="UTF-8" as an argument of scan.

  • p. 91

(code snippet) replacesplit withsplit.tv2 fornode, left.context, and right.context (C.B.)

Chapter 6

The frequencies in the split_unsplit.rds file are wrong. Here is the correct file.

Part II (preamble)

  • p. 138

“they will be perceived as a mathematicians” –> a mathematician (thanks go to J. Alshboul, henceforth J.A., for spotting the typo)

Chapter 7

  • p. 141

“and 3018.35 occurrences of the split infinitive” -> the unsplit infinitive (J.A.)

  • p. 143

“With respect to data$SPLIT_INFINITIVE or data$SPLIT_INFINITIVE” -> 
With respect to data$SPLIT_INFINITIVE or data$UNSPLIT_INFINITIVE (J.A.)

  • p. 146

“In practice, a boxplot provide […]” -> a boxplot provides

Chapter 8

  • p. 154

The data table /CLSR/chap8/cont.table.rds has been modified in the CLSR folder on the Nakala repository. I have removed the row totals and the column totals.

On the same page, the code chunk below is wrong:

N <- sum(cont.table[1:4, 1:3])
P_NN1 <- cont.table[2,4]/N; P_NN1
P_A1K <- cont.table[5,2]/N; P_A1K

It should be replaced by the following:

N <- sum(cont.table)
P_NN1 <- sum(cont.table[2,])/N
P_A1K <- sum(cont.table$A1K.xml)/NP_A1K
  • p. 155

Likewise, the line of code below is wrong:

P_NN1_given_A1K <- cont.table[2,2]/cont.table[5,2]; P_NN1_given_A1K

It should be:

P_NN1_given_A1K <- cont.table[2,2]/sum(cont.table$A1K)
P_NN1_given_A1K

Equation (8.2) should be:

  • p. 157

The line of code 

P_NP0 <- probs[4,4]

is wrong. It should be:

P_NP0 <- probs[4,3]
  • p. 165

“0.5 × 0.5 × 0.5 × 0.5 = 0.625” should be “0.5 × 0.5 × 0.5 × 0.5 = 0.0625” (thanks to Graham Ranger, henceforth G.R., for spotting this).

“twice as more as expected” should be “twice as much”. (G.R.)

  • p. 167

“The probability of the first row in Tab. 8.5 is obtained likewise” -> of the last row (J.A.)

  • p. 168

“vowels are represented” –> overrepresented (G.R.)

  • p. 170

 “bins” not yet defined (G.R.)

  • p. 173

There is an error in the code:

par(mfrow=c(2,4))

should be

par(mfrow=c(1,4))
  • p. 182

“They ranges from 0” => They range (J.A.)

  • p. 188

“is found is” –> is found in (G.R.)

Chapter 9

  • p. 204

“Proportions in the form of percentages […] multiplying the result by 10000” –> 

Proportions in the form of percentages or normalized frequencies (such as the number of tokens per n words) are often proposed to account for distributional differences and allow for a fair comparison. Suppose you want to compare the distribution of the word ‘banana’ in two corpus samples, CORP1 and CORP2. CORP1 consists of 7543 words and CORP2 consists of 12770 words. All other things being equal, you are very likely to find more instances of ‘banana’ in CORP2 because it is larger. Suppose you find a count of 124 in CORP1, and 210 in CORP2. The frequencies normalized to a basis per 1000 words are obtained by dividing the count of how often you found the word ‘banana’ in the sample by the total number of words in the same sample and multiplying the result by 1000.

count1 <- 124 # number of instances of the linguistic unit in corpus 1
count2 <- 210 # number of instances of the linguistic unit in corpus 2
corp1 <- 7543 # size of corpus 1
corp2 <- 12770 # size of corpus 2
basis <- 1000 # normalization basis
norm.freq1 <- (count1/corp1)basis round(norm.freq1,2) # normalized frequency norm.freq2 <- (count2/corp2)basis
norm.freq2 <- round(norm.freq2,2); norm.freq2

  • p. 222

“given facto, the probability of obtaining ipso is high, but given facto” –> given ipso … obtaining facto … (G.R.)

  • pp. 223-226

Thanks go to Brian Ortner for spotting the typo.

formula 9.13

c should be replaced by b

I was confused by a typo in a draft version of Gries (2013, p. 144). The original equation is 5b in Allan (1980, p. 148). On p. 224, this affects equation 9.15. Fortunately, given the very high value of cell d, the total is not much affected.

9.15

equation 9.15

The code should be:

m <- matrix(c(1633, 61502, 34877, 533690920), nrow=2, ncol=2, byrow=TRUE)
delta.W2.W1 <- (m[1,1]/(m[1,1]+m[1,2])) - (m[2,1]/(m[2,1]+m[2,2]))
delta.W1.W2 <- (m[1,1]/(m[1,1]+m[2,1])) - (m[1,2]/(m[1,2]+m[2,2]))
delta.W2.W1 - delta.W1.W2

The whole script is now:

rm(list=ls(all=T))
data <- readRDS("C:\\CLSR\\chap9\\computer.NP.rds") # Windows
data <- readRDS("/CLSR/chap9/computer.NP.rds") # Mac
str(data)
freq_W1 <- 63135 # frequency of computer in corpus
corp.size <- 533788932
all.delta.diff <- character()
for (i in 1:nrow(data)){ # enter the loop
a <- data$freq_W1_W2[i] # cell a
b <- freq_W1 - a # cell b
c <- data$corp_freq_W2[i] - a # cell c
d <- (corp.size - freq_W1) - c # cell d
m <- matrix(c(a, b, c, d), nrow=2, ncol=2, byrow=TRUE) # make the 2x2 matrix
current.delta.W2.W1 <- (m[1,1]/(m[1,1]+m[1,2])) - (m[2,1]/(m[2,1]+m[2,2])) # first delta
current.delta.W1.W2 <- (m[1,1]/(m[1,1]+m[2,1])) - (m[1,2]/(m[1,2]+m[2,2])) # second delta
current.delta.diff <- current.delta.W2.W1 - current.delta.W1.W2 # delta difference
current.delta.diff <- round(current.delta.diff, 4) # round
current.delta.diff <- paste(data$W2[i], current.delta.diff, sep="\t") # append word 2
all.delta.diff <- c(all.delta.diff, current.delta.diff) # collect all delta differences
} # exit the loop

When you run the script, you obtain the following output:

On p. 226, the typo affects eq. 9.19. Again, because of the high value of cell d, the result is virtually unaffected.

equation 9.19

Chapter 10

  • p. 241

“This means that you will often need more than one planes” –> “This means that you will often need more than one plane” (C.B.)

  • p. 243

“PCA it takes as input” –> “PCA takes as input” (C.B.)

  • p. 252

“In this case, plotting the graph individuals with PCA” –> “In this case, plotting the graph of individuals with PCA” (C.B.)

  • p. 259

original code

data <- readRDS("/CLSR/chap10/df_extenders.rds") # Windows

corrected code

data <- readRDS(“C:/CLSR/chap10/df_extenders.rds”) # Windows

  • p. 264

“represents” –> represent (G.R.)

  • p. 274

“catogory” –> category (G.R.)

  • p. 279

“two more function” –> two more functions (G.R.)

  • p. 282 (typo in the code chunk)

rect.hclust(clust.ana, 4) # 4 cluster classes -> rect.hclust(clusters, 4) (J.A.)

  • p. 283

“when Euler solver the Königsberg bridge problem in the eighteenth century” -> when Euler solved (J.A.)

  • p. 285

original code

v.attr.dat <- readRDS("/CLSR/chap10/v.attr.dat.rds") # Windows

corrected code

v.attr.dat <- readRDS("C:/CLSR/chap10/v.attr.dat.rds") # Windows
  • p. 286

original code

G <- graph.data.frame(e.list.dat, vertices=v.attr.dat, directed="FALSE")

corrected code

G <- graph.data.frame(e.list.dat, vertices=v.attr.dat, directed=FALSE)
  • Section 10.7 (network graphs)

Thanks go to Stefan Th. Gries for reporting a bug, which has nothing to do with my code but comes from either R or the igraph package (I haven’t figured out which one yet). For some unknown reason, if you do not switch off R between two graphs, you may end up with some strange result (see screenshot below).

this happens when you plot figs. 10.20 and 10.21 in a row and fail to restart R in between!

R keeps the following line of code in memory no matter what, including when you enter rm(list=ls(all=TRUE)!

labels <- c("node 1", "node 2", "node 3", "node 4", "node 5", "node 6", "node 7", "node 8",
"node 9", "node 10")

As a result,  the line of code overrides the label setting of the next graph: vertex.label=v.label. The bottom line is (a) run the code for each graph separately ,and (b) restart R in between.

  • p. 288

“This time, we specify directed="TRUE".” => directed=TRUE (without quotation marks) (J.A.)

  • p. 289

G <- graph.data.frame(e.list.anp, vertices=v.attr.anp, directed="TRUE")
-> G <- graph.data.frame(e.list.anp, vertices=v.attr.anp, directed=TRUE) (J.A.)

  • p. 336 (J.A.)

plot(res.pca, cex=0.9,shadow=T, autoLab="yes", choix="var", title="")
plot(res.pca, cex=0.9, shadow=T, autoLab="yes", palette=palette(c("black","blue")),habillage=1, title="")

-> 

plot(pca.object, cex=0.9,shadow=T, autoLab="yes", choix="var", title="")
plot(pca.object, cex=0.9, shadow=T, autoLab="yes", palette=palette(c("black","blue")),habillage=1, title="")

  • p. 338 (J.A.)

plot(res.pca, axes=c(3,4), cex=0.9,shadow=T, autoLab="yes", choix="var", title="")
plot(res.pca, axes=c(3,4), cex=0.9, shadow=T, autoLab="yes", palette=palette(c("black","blue")),habillage=1, title="")

-> 

plot(pca.object, axes=c(3,4), cex=0.9,shadow=T, autoLab="yes", choix="var", title="")
plot(pca.object, axes=c(3,4), cex=0.9, shadow=T, autoLab="yes", palette=palette(c("black","blue")),habillage=1, title="")

  • p. 347 (J.A.)

G <- graph.data.frame(e.list, vertices=v.attr, directed="TRUE")

-> 

G <- graph.data.frame(e.list, vertices=v.attr, directed=TRUE)