The 15 Shades of Grey…

… oder die Suche nach dem Sex.

 

Die Lektüre des Buches 50 Shades of Grey kann quälend sein. Vor allem dann, wenn man an der eigentlichen Liebesgeschichte nur mäßig interessiert ist und das Buch sowieso nur wegen der expliziteren Passagen lesen möchte. Doch wie findet man diese Passagen, ohne beim Durchblättern des Buches permanent von Anastasia Steels Gefühlsausbrüchen, Ängsten und Zweifeln belästigt zu werden? Die Lösung heißt Topic Modelling, ein Verfahren, welches mittels Algorithmus den Wortschatz eines Textes auf eine festgelegte Anzahl von Topics verteilt, wobei diese so generierten Topics bzw. deren Vorkommen und Verlauf im Text etwa in Form einer Heatmap visualisiert werden können.
Für die Suche nach den Sexszenen in 50 Shades of Grey wurde ein solches Verfahren angewendet. Um die entsprechenden Passagen erstmals entsprechend fassen zu können, erwies sich nach mehreren Versuchen die Modellierung von 15 Topics als ausreichend praktikabel. Um den Verlauf dieser 15 Topics über den gesamten Text möglichst präzise abbilden zu können, erwies sich eine Aufteilung des Textes in 50 Abschnitte oder chunks als hinreichend granular. Aufgrund dieser Parameter, kann folgende Visualisierung des thematischen Verlaufs der 15 Topics über die 50 chunks des Buches 50 Shades of Grey generiert werden.

 

The 15 Shades of Grey

TopicDistribution

Aber wo ist hier der Sex? Diese Frage lässt sich aus obiger Grafik alleine nur schwer beantworten, da die Benennung der Topics mit jenem Wort, welches am häufigsten in einem Thema vertreten ist, nur sehr bedingt Rückschlüsse auf das Thema zulässt. Einen besseren Einblick in die einzelnen Themen eröffnen hingegen die aus den Wörtern der jeweiligen Topics erstellbaren Wortwolken. Eine solche Wortwolke des ersten Topics „back“ zeigt nachfolgende Grafik. Darin kommen abgesehen von „back“ nämlich sowohl Wörter wie  „fingers“, „slowly“, „groan“, „kisses“, „gently“ als auch Wörter wie „panties“, „breasts“,  „naked“ und „pushing“ gehäuft vor.

Das Sex-Topic

SexTopics

 

Auf der Suche nach Sex in 50 Shades of Grey würde es sich daher wohl als äußerst vielversprechend erweisend, die eher dunklen chunks der ersten Spalte genauer zu lesen.

Und wo bleibt die Gewalt

Doch wo sind Dominanz, Gewalt und Unterwerfung? Also gerade jene Themen, für die dieses Buch so berühmt wurde und welche jetzt die Umsätze von Sexshops (und gerüchteweise auch von Baumärkten) in die Höhe treiben. Denn was die oben gezeigte Wortwolke betrifft, so lässt diese vor allem auf jene Art körperlicher Zärtlichkeiten schließen, die von Christian Grey wenig wertschätzend als „Blümchensex“  bezeichnet wurde. Als vielversprechend erweist sich hier jenes Topic, dessen häufigstes Wort „dominant“ lautet.

Das Contract-Topic

ContractTopic

Andere Begriffe dieses Topics wie vor allem „contract“, „clause“, „term“ oder „appendix“ sowie ein Blick auf die Verteilung dieses Themas im Text machen jedoch deutlich, dass das Topic „dominant“ die Verhandlungen um den zwischen Grey und Steele zu schließenden Vertrag beschreibt. Ein Vertrag, in dem die Bedingungen zwischen dem „Dom“ und der „Sub“ festgelegt werden. Sofern also kein gezieltes Interesse an der Formulierung eines solchen Kontraktes besteht, können diese Passagen auf der Suche nach Sex bzw. nach SM-Sex getrost überblättert werden. Keinesfalls überblättert werden dürfen jedoch jene Passagen, die in der Spalte mit der Überschrift „leather“ dunkel eingefärbt sind.

Keinesfalls überblättert werden dürfen jedoch jene Passagen, die in der Spalte mit der Überschrift „leather“ dunkel eingefärbt sind. Zumindest nicht von jenen Leserinnen und Lesern, die gelebten SM-Praktiken aufgeschlossen gegenüber stehen. Denn wo im Sex-Topic noch Wörter wie „gentle“, „slide“ und „slowly“ anzutreffen sind, deuten Ausdrücke wie „fucked“, „kneel“, „fastens“ und „whips“ auf härteren Geschlechtsverkehr hin. In Kombination mit weiteren im Topic dominant vertretenen Ausdrücken wie „hurt“, „command“, „chains“, „obey“, „mask“ und „flogger“ dürfte es sich hier wirklich um das SM-Topic handeln. Genauer zu untersuchen wäre jedoch die große Bedeutung von „music“ und „ipod“ in diesem Kontext. Wobei einem als Windows-User die eine oder andere spontane Assoziation von Apple und Unterdrückung und Knebelung durchaus in den Sinn kommen könnte.

Das SM-Topic

SMTopic

Doch was ist mit der Liebe?

Wer auf der Suche nach einem Algorithmus ist, der die Liebe finden kann, ist hier besser beraten. Mit Hilfe von Topic Modelling können höchstens die handfesten Auswirkungen des großen Mysteriums Liebe im täglichen Leben der Menschen im Ansatz erfasst werden. Zwei der Myriaden von Manifestationen von Liebe werden dabei vor allem in 50 Shades of Grey besonders deutlich, nämlich die Pole „himmelhoch jauchzend“ und „zu Tode betrübt“, bzw. das Fliegen im Privatjet von Christian Grey und die Tränen von Anastasia Steel.

planeTopictearsTopic

Dann vielleicht doch besser die dunklen Passage von Spalte 1 „back“ bzw. das Sex-Topic lesen… . Oder das R-Skript zur Erstellung des Topic-Models, der Heatmap und der Wortwolken. Ein Skript, dass zum größten Teil aus dem höchst empfehlenswerten Buch Text Analysis with R for Students of Literature von Matthew L. Jockers übernommen wurde.

setwd("C:/WorkingDirectory")
text.v <- scan("data/plainText/shades.txt", what="character")
text.v <- tolower(text.v)
text.v <- gsub("[.!?,]", "", text.v)
chunk.size <- 50 #hier wird die Zahl der Abschnitte festgelegt
max.length <- length(text.v)/chunk.size
x <- seq_along(text.v)
chunks.l <- split(text.v, ceiling(x/max.length))
chunks.l <- chunks.l [2:length(chunks.l)]
chunks.l <- lapply(chunks.l, paste, collapse=" ")
ids <- paste ("part", 1:length(chunks.l))
chunks.df <- do.call(rbind, chunks.l)
chunks.df <- cbind(ids,chunks.df)
colnames(chunks.df) <- c("id", "text")
documents <- as.data.frame(chunks.df, stringsAsFactors=F)
colnames(documents) <- c("id", "text")

library(mallet)
mallet.instances <- mallet.import(documents$id,
 documents$text,
 "data/stoplists/stoplist.csv",
 token.regex="[\\p{L}']+")

topic.model <- MalletLDA(num.topics=15) #hier wird die Zahl der Topics festgelegt
topic.model$loadDocuments(mallet.instances)

topic.model$setAlphaOptimization(40, 80)

topic.model$train(400)

#install.packages("wordcloud")
library(wordcloud)

topic.words.m <- mallet.topic.words(topic.model, smoothed=TRUE,normalized=TRUE)
doc.topics.m <- mallet.doc.topics(topic.model, smoothed=T, normalized=T)
dimnames(doc.topics.m) <-list(documents$id)

topic.words.m <- mallet.topic.words(topic.model, smoothed=TRUE,normalized=TRUE)

hansi <- mallet.top.words(topic.model, topic.words.m[6,], 150) #hier wird festgelegt, welches Topic als Wordcloud visualisiert wird
words <- hansi[,1]
numbers <- hansi[,2]
pal2 <- brewer.pal(1,"Dark2")
wordcloud(words, numbers,
 scale=c(8,0.5),
 max.words=100,
 random.order=FALSE,
 rot.per=0.35,
 use.r.layout=TRUE,
 #col=grey(seq(1,0,-0.01)))
 col=pal2)

#wordcloud(words, numbers, c(1,.1), rot.per=0, random.order=F)

y <- 1
first.word.m <- NULL
for(y in 1:50){
 first.word.part <- mallet.top.words(topic.model, topic.words.m[y,], 1)
 first.word.m <- rbind(first.word.m,first.word.part)
}
colnames(doc.topics.m) <- first.word.m[,1]
filenames <- documents[,1]
file.name.part <- strsplit(filenames[1], "_")

filenames.l <- NULL
i <- 1
for (i in 1:length(filenames)){
 file.name.part <- strsplit(filenames[i], "_")
 file.name.part <- unlist(file.name.part)[1]
 filenames.l <-rbind(filenames.l, file.name.part)
}
# hier wird eine eher häßliche Heatmap erzeugt
heatmap <- heatmap(doc.topics.m,
 Rowv=NA, Colv=NA,
 col = grey(0:1),
 scale="row", margins=c(8,18),
 main="50 Shades of 50 Shades",
 ylab="Dokumente", xlab="Themen")

#und hier wird eine leicht schönere Heatmap erzeugt.
library(gplots)
heatmap.2(doc.topics.m,
 Colv=FALSE,
 key = TRUE,
 dendrogram="none",
 scale="row",
 colsep=(1:50),
 rowsep=(1:69),
 sepcolor="white",
 sepwidth=c(0.001,0.001),
 cm.colors(256),
 trace="none",
 margin = c(8,18),
 density.info="none",
 col=grey(seq(1,0,-0.01)),
 main="15 Shades of Grey")

<p style=“text-align: justify;“>