# Лемматизирую данные (делаю стемминг)
russia = system2("/Users/annakostrova/Downloads/mystem", c("-l", "-d", "-e", "utf-8", "-c"), input = russia$text, stdout = TRUE)
# write_csv(russia, "/Users/annakostrova/Downloads/russia_words.csv")
# Очищаю данные
russia = as.data.frame(russia)
russia$text = russia$russia
russia = russia %>% tidytext::unnest_tokens(lemma, text)
# russia = russia %>% unnest_tokens(input = "text", token = "lemma")
# write_csv(russia, "/Users/annakostrova/Downloads/russia_unnest_tokens.csv")
russia = russia %>%
filter(!str_detect(lemma, '[[:digit:]]')) %>%
filter(!str_detect(lemma, "[^\\s]*[0-9][^\\s]*")) %>%
filter(!str_detect(lemma, '[[:punct:]]+')) %>%
filter(!str_detect(lemma, "[a-z]"))
# Удаляю стоп-слова
russtopword = data.frame(words = c(stopwords::stopwords("ru"), "это", "в", "с", "и", "который", "свой", "весь", "хотя", "вообще", "т д", "ох", "очень", "просто"),stringsAsFactors = FALSE)
russia = russia %>%
dplyr::filter(!lemma %in% russtopword$words)
# Лемматизирую данные (делаю стемминг)
france <- udpipe(france, "french-gsd")
# Очищаю данные
france = france %>%
filter(!str_detect(lemma, '[[:digit:]]')) %>%
filter(!str_detect(lemma, "[^\\s]*[0-9][^\\s]*")) %>%
filter(!str_detect(lemma, '[[:punct:]]+'))
# Удаляю стоп-слова
frstopword = data.frame(words = c(stopwords::stopwords("fr"), "être", "avoir"),stringsAsFactors = FALSE)
france = france %>%
dplyr::filter(!lemma %in% frstopword$words)
Sentiment analysis
Sentiment analysis - FRANCE
#####################################################################################################################
### Get a French sentiment dictionary lexicon with positive/negative terms, negators, amplifiers and deamplifiers ###
#####################################################################################################################
load(file("https://github.com/sborms/sentometrics/raw/master/data-raw/FEEL_fr.rda"))
polarity_terms <- rename(FEEL_fr, term = x, polarity = y)
polarity_terms$polarity = ifelse(polarity_terms$polarity > 0, "positive", "negative")
Какой процент от всего словаря был определен в твоем тексте
### Считаю сколько позитивных и негативных слов в датасете
polarity_terms = polarity_terms %>% group_by(polarity) %>% mutate(words_in_lexicon = n()) %>% mutate(words_all = nrow(polarity_terms)) %>% mutate(words_in_lexicon_per = paste0(round(words_in_lexicon/words_all,2)*100, "%")) %>% select(-words_all)
## 60% - позитивных слов, 40% - негативных слов в словаре
### Добавляю колонку с сентиментом в датасет с текстами Макрона
sentiments = france %>% inner_join(polarity_terms, by = c("lemma" = "term"))
###################################################################################
########## Какой процент от всего словаря был определен в твоем тексте ############
###################################################################################
sentiments_per = sentiments %>% count(polarity, sort = TRUE) %>% mutate(per = paste0(round(n/sum(n),2)*100,"%")) # сколько позитивных и негативных слов в ТВОЕМ корпусе нашлось и какое их соотношение
sentiments_per$words_in_lexicon = ifelse(sentiments_per$polarity == "positive", unique(sentiments$words_in_lexicon)[1], unique(sentiments$words_in_lexicon)[2]) # добавляю колонку с количеством негативных и позитивных слов в семантическом словаре
sentiments_per$words_in_lexicon_per = ifelse(sentiments_per$polarity == "positive", unique(sentiments$words_in_lexicon_per)[1], unique(sentiments$words_in_lexicon_per)[2]) # добавляю колонку с процентом негативных и позитивных слов в семантическом словаре
sentiments_per = sentiments_per %>% group_by(polarity) %>% mutate(words_in_data_per = paste0(round((n/words_in_lexicon),2)*100,"%"))
## Табличка
kable(sentiments_per) %>%
kable_styling(bootstrap_options=c("bordered", "responsive", "striped"), full_width = FALSE)
|
polarity
|
n
|
per
|
words_in_lexicon
|
words_in_lexicon_per
|
words_in_data_per
|
|
positive
|
3744
|
81%
|
8422
|
60%
|
44%
|
|
negative
|
904
|
19%
|
5704
|
40%
|
16%
|
# n - количество негативных/позитивных слов в ТВОИХ документах
# per - это соотношение нег/поз слов в ТВОИХ документах
# words_in_lexicon - всего негативных/позитивных слов в французском словаре, который я использую
# words_in_lexicon_per - процент негативных/позитивных слов в словаре лексическом
# words_in_data_per - процент слов, определенных в твоих данных (сколько слов в твоих данных совпало со словами из словаря)
# Здесь я просто добавила полученные результаты в общий датасет (для графика нужно)
sentiments$polarity = ifelse(sentiments$polarity == "positive",
paste("Positive", sentiments_per[1,3]), paste("Negative", sentiments_per[2,3]))
Sentiment analysis - RUSSIA
Какой процент от всего словаря был определен в твоем тексте
### Считаю сколько позитивных и негативных слов в датасете
russiasent = russiasent %>% group_by(tag) %>% mutate(words_in_lexicon = n()) %>% mutate(words_all = nrow(russiasent)) %>% mutate(words_in_lexicon_per = paste0(round(words_in_lexicon/words_all,2)*100, "%")) %>% select(-words_all)
## 66% - позитивных слов, 34% - негативных слов в словаре
### Добавляю колонку с сентиментом в датасет с текстами Путина
sentiments_russia = russia %>% inner_join(russiasent, by = c("lemma" = "term"))
sentiments_russia$tag = ifelse(sentiments_russia$tag == "PSTV", "positive", "negative")
###################################################################################
########## Какой процент от всего словаря был определен в твоем тексте ############
###################################################################################
sentiments_russia_per = sentiments_russia %>% count(tag, sort = TRUE) %>% mutate(per = paste0(round(n/sum(n),2)*100,"%")) # сколько позитивных и негативных слов в ТВОЕМ корпусе нашлось и какое их соотношение
sentiments_russia_per$words_in_lexicon = ifelse(sentiments_russia_per$tag == "positive", unique(sentiments_russia$words_in_lexicon)[1], unique(sentiments_russia$words_in_lexicon)[2]) # добавляю колонку с количеством негативных и позитивных слов в семантическом словаре
sentiments_russia_per$words_in_lexicon_per = ifelse(sentiments_russia_per$tag == "positive", unique(sentiments_russia$words_in_lexicon_per)[1], unique(sentiments_russia$words_in_lexicon_per)[2]) # добавляю колонку с процентом негативных и позитивных слов в семантическом словаре
sentiments_russia_per = sentiments_russia_per %>% group_by(tag) %>% mutate(words_in_data_per = paste0(round((n/words_in_lexicon),2)*100,"%"))
## Табличка
kable(sentiments_russia_per) %>%
kable_styling(bootstrap_options=c("bordered", "responsive", "striped"), full_width = FALSE)
|
tag
|
n
|
per
|
words_in_lexicon
|
words_in_lexicon_per
|
words_in_data_per
|
|
positive
|
3352
|
81%
|
6215
|
34%
|
54%
|
|
negative
|
765
|
19%
|
11863
|
66%
|
6%
|
# n - количество негативных/позитивных слов в ТВОИХ документах
# per - это соотношение нег/поз слов в ТВОИХ документах
# words_in_lexicon - всего негативных/позитивных слов в французском словаре, который я использую
# words_in_lexicon_per - процент негативных/позитивных слов в словаре лексическом
# words_in_data_per - процент слов, определенных в твоих данных (сколько слов в твоих данных совпало со словами из словаря)
# Здесь я просто добавила полученные результаты в общий датасет (для графика нужно)
sentiments_russia$tag = ifelse(sentiments_russia$tag == "positive",
paste("Positive", sentiments_russia_per[1,3]), paste("Negative", sentiments_russia_per[2,3]))
WordCloud
France
library(wordcloud)
library(reshape2)
set.seed(1234)
sentiments %>%
count(lemma, polarity, sort = TRUE) %>%
acast(lemma~polarity, value.var="n", fill=0) %>%
comparison.cloud(rot.per=.2, colors = c("tomato", "springgreen4"),
max.words=200, title.size = 2, scale=c(5,.5))

Russia
set.seed(1234)
sentiments_russia %>%
count(lemma, tag, sort = TRUE) %>%
acast(lemma~tag, value.var="n", fill=0) %>%
comparison.cloud(rot.per=.2, colors = c("tomato", "springgreen4"),
max.words=200, title.size = 2, scale=c(5,.5))

Это сравнение Путина и Макрона в целом
france$President = "Macron"
france = france %>% filter(lemma != "avoir")
russia$President = "Putin"
russia_france <- france %>% select(President, lemma) %>% rbind(russia %>% select(-russia)) %>%
count(lemma, President, sort = TRUE) %>%
acast(lemma~President, value.var="n", fill=0)
russia_france %>%
comparison.cloud(rot.per=.2, colors = c("tomato", "blue"),
max.words=200, title.size = 2, scale=c(4,.5))

Keywords
russia = russia %>%
group_by(President) %>% ### говорим, чтобы слова были слиты по айди текста
summarise(text = paste0(lemma,collapse=" "))
russia$doc_id = russia$President
russia = udpipe(russia, "russian-gsd")
## NOUNS
noun_russia <- subset(russia, upos %in% c("NOUN", "ADJ", "VERB"))
noun_russia <- txt_freq(noun_russia$token)
noun_russia$key <- factor(noun_russia$key, levels = rev(noun_russia$key))
barchart(key ~ freq, data = head(noun_russia, 30), col = "cadetblue",
main = "Frequently used nouns", xlab = "Freq")

## NOUNS
noun_france <- subset(france, upos %in% c("NOUN"))
noun_france <- txt_freq(noun_france$token)
noun_france$key <- factor(noun_france$key, levels = rev(noun_france$key))
barchart(key ~ freq, data = head(noun_france, 30), col = "cadetblue",
main = "Frequently used nouns", xlab = "Freq")

#################
## Using RAKE
stats <- keywords_rake(x = russia, term = "lemma", group = "doc_id",
relevant = russia$upos %in% c("NOUN", "NOUN"))
stats$key <- factor(stats$keyword, levels = rev(stats$keyword))
barchart(key ~ rake, data = head(subset(stats, freq > 2), 30), col = "red",
main = "Keywords identified by RAKE",
xlab = "Rake")

## Using RAKE
stats <- keywords_rake(x = france, term = "lemma", group = "doc_id",
relevant = france$upos %in% c("NOUN", "NOUN"))
stats$key <- factor(stats$keyword, levels = rev(stats$keyword))
barchart(key ~ rake, data = head(subset(stats, freq > 2), 30), col = "red",
main = "Keywords identified by RAKE",
xlab = "Rake")
