Poezja miłosna - analiza

Analiza dwóch grup utwórów tworzonych przez poetów tworzących po angielsku:

Przygotowania

library(tm)
## Loading required package: NLP
library(SnowballC)

path = file.path(getwd(), "poems")
corpus1 <- Corpus(DirSource(path))
corpus1 <- tm_map(corpus1, content_transformer(tolower))
corpus1 <- tm_map(corpus1, stripWhitespace)
corpus1 <- tm_map(corpus1, removePunctuation)
corpus1 <- tm_map(corpus1, stemDocument)

path = file.path(getwd(), "internet")
corpus2 <- Corpus(DirSource(path))
corpus2 <- tm_map(corpus2, content_transformer(tolower))
corpus2 <- tm_map(corpus2, stripWhitespace)
corpus2 <- tm_map(corpus2, removePunctuation)
corpus2 <- tm_map(corpus2, stemDocument)

tdm1<-TermDocumentMatrix(corpus1)
freq1 <- rowSums(as.matrix(tdm1))
ord1 <- order(freq1)

tdm2<-TermDocumentMatrix(corpus2)
freq2 <- rowSums(as.matrix(tdm2))
ord2 <- order(freq2)

Słowa, słowa, słowa

Prawdziwa poezja

t(as.table(freq1[tail(ord1,14)]))/67
##           this      like       for       all       her       not       but
## [1,] 0.8059701 0.9104478 0.9253731 1.0000000 1.0000000 1.0447761 1.0895522
##           with      your      that      love       you       and       the
## [1,] 1.2089552 1.2686567 1.8805970 2.0000000 2.4626866 4.7611940 7.5820896

Chmura słów (usuwam najczęstsze)

library(wordcloud)
## Loading required package: RColorBrewer
cloudFreq1 <- freq1
cloudFreq1[c("the","that","and")] <-0
wordcloud(names(cloudFreq1),cloudFreq1,min.freq=8, colors=brewer.pal(6, "Dark2"))

Grafomania

t(as.table(freq2[tail(ord2,14)]))/84
##           will       but       are      have     heart       all       for
## [1,] 0.8214286 0.8333333 1.0238095 1.0476190 1.1547619 1.1547619 1.4880952
##           with      that      your      love       and       the       you
## [1,] 1.5357143 1.6309524 2.3333333 2.4047619 3.3928571 4.0476190 5.3571429

Chmura słów (usuwam najczęstsze)

cloudFreq2 <- freq2
cloudFreq2[c("the","that","and")] <-0
wordcloud(names(cloudFreq2),cloudFreq2,min.freq=10, colors=brewer.pal(6, "Dark2"))

Wnioski

W poezji amatorskiej (grafomańskiej?) pewne najczęstsze słowa są nadużywane. Np, “you” i “your” są używane dwa razy częściej niż w utworach prawdziwych poetów, wyraz “heart” ponad 3 razy częściej a “love” o 20% częściej.

Sentimental analysis

Użyłem funkcji score.sentiment(), jej definicję, wywoływanie dla poszczególnych wierszy oraz definicję funkcji, która zwraca wektor z wynikami analizy dla wszystkich utworów zawarłem w pliku prepareSentimentalAnalysis.R

source("prepareSentimentAnalysis.R")

Wyniki dla poetów i amatorów:

sentimentResultForPoets <- resPoets()
## Loading required package: plyr
## Loading required package: stringr
meanPoems <- mean(sentimentResultForPoets)
medianPoems <- median(sentimentResultForPoets)
sentimentResultForAmateurs <- resAmateurs()
meanAmateurs <- mean(sentimentResultForAmateurs)
medianAmateurs <- median(sentimentResultForAmateurs)

Oto uśrednione wynik dla poetów i amatórów związane z nalizą “sentymentalną”.

meanPoems
## [1] 2.283582
meanAmateurs
## [1] 5.059524
medianPoems
## [1] 1
medianAmateurs
## [1] 5

Okazuje się, że wiersze pisane przez amatorów są nieco bardziej optymistyczne niż te tworzone przez poetów. Nie jest to jakaś dramatyczna różnica, niemniej istnieje, widać ją także na wykresie skrzynkowym.

Ciekawy jest przypadek outlinera w zbiorze poetów, wrócę do niego w następnym rozdziale.

And The Winner is …

Jeden z wierszy ma wynik w analizie sentymentalnej równy -27. To zdecydowanie najbardziej negatywny wynik wśród ponad 150 badanych wierszy. Jego autorem jest hrabia John Wilmot.

Krótka charakterystyka autora:

  • więziony w Tower za porwanie kobiety
  • prowadzący niezwykle hulaszczy tryb życia
  • autor wielu skandalizujących utworów, o zabarwieniu erotycznym i pornogtraficznym
  • zmarł przedwcześnie z powodu chorób wenerycznych i alkocholizmu

Czyli software poznał się na człowieku :-)

Oto próbka jego możliwości, sklasyfikowana przez algorytm jako “bardzo negatywna”

Ev’n so thy brutal valor is displayed,
Breaks every stew, does each small whore invade,
:
Worst part of me, and henceforth hated most,
Through all the town a common fucking post,
On whom each whore relieves her tingling cunt

Emocje

Postanowiłem też zbadać emocje wyrażone w wierszach. Zmieniłem w tym celu funkcję używaną do analizy sentymentalnej. Metryka tej funkcji bazuje na:

[liczba słów pozytywnych] - [liczba słów negatywnych]

Metryka funkcji którą stworzyłem do mierzenia emocjonalności wiersza bazuje na:

([liczba słów pozytywnych] + [liczba słów negatywnych]) / [liczba słów w wierszu]

Tym razem dodajemy do siebie liczbę słów pozytywnych i negatywnych, ta suma zależy od długości badanego utworu, więc dzielimy ją przez liczbę słów w wierszu.

emotionResultForPoets <- emoPoets()
meanEmoPoems <- mean(emotionResultForPoets)
medianEmoPoems <- median(emotionResultForPoets)
emotionResultForAmateurs <- emoAmateurs()
meanEmoAmateurs <- mean(emotionResultForAmateurs)
medianEmoAmateurs <- median(emotionResultForAmateurs)

Oto wyniki:

meanEmoPoems
## [1] 0.09295334
meanEmoAmateurs
## [1] 0.09626892
medianEmoPoems
## [1] 0.09195402
medianEmoAmateurs
## [1] 0.09090909

Boxplot

Nie ma żadnej znaczącej różnicy pomiędzy amatorami a poetami jeśli chodzi o liczbę emocjonalnych słów użytych w ich twórczośći. W obu przypadkach średnio 9% użytych słów było zaklasyfikowane jako “emocjonalne” (bez znaczenia czy pozytywne czy negatywne). Podobnie rozkłada się też rozrzut wartości “emocjonalności” dla obu zbiorów wierszy.

Wnioski końcowe

  • Poeci i amatorzy porównywalnie często używają w swoich wierszach słów klasyfikowanych jako emocjonalne, poeci jednak częściej używają tych o zabawrwieniu negatywnym.
  • Twórcy amatorskiej poezji nadużywaja (w porównaniu do swoich bardziej doświadczonych kolegów) niektórych najczęściej występujących słów takich jak “you”, “your”, “heart” i “love”