情感分析(使用字典)基本上只是一个模式匹配任务。我认为当使用tidytext 包和reading the book about it 时这一点会变得很清楚。
所以我不会在这里为如此复杂的设置而烦恼。相反,我会将他们使用的字典(来自here)转换为data.frame,然后使用tidytext。不幸的是,字典是以 XML 格式存储的,我对此不是很熟悉,所以代码看起来有点 hacky:
library(tidyverse)
library(xml2)
library(tidytext)
sentiment_nl <- read_xml(
"https://raw.githubusercontent.com/clips/pattern/master/pattern/text/nl/nl-sentiment.xml"
) %>%
as_list() %>%
.[[1]] %>%
map_df(function(x) {
tibble::enframe(attributes(x))
}) %>%
mutate(id = cumsum(str_detect("form", name))) %>%
unnest(value) %>%
pivot_wider(id_cols = id) %>%
mutate(form = tolower(form), # lowercase all words to ignore case during matching
polarity = as.numeric(polarity),
subjectivity = as.numeric(subjectivity),
intensity = as.numeric(intensity),
confidence = as.numeric(confidence))
但是输出是正确的:
head(sentiment_nl)
#> # A tibble: 6 x 11
#> id form cornetto_id cornetto_synset… wordnet_id pos sense polarity
#> <int> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
#> 1 1 amst… r_a-16677 "" "" JJ van … 0
#> 2 2 ange… r_a-8929 "" "" JJ Enge… 0.1
#> 3 3 arab… r_a-16693 "" "" JJ van … 0
#> 4 4 arde… r_a-17252 "" "" JJ van … 0
#> 5 5 arnh… r_a-16698 "" "" JJ van … 0
#> 6 6 asse… r_a-16700 "" "" JJ van … 0
#> # … with 3 more variables: subjectivity <dbl>, intensity <dbl>,
#> # confidence <dbl>
现在我们可以使用tidytext 和更广泛的tidyverse 中的函数在字典中查找单词并将分数附加到每个单词。 summarise() 用于为每个文本获取一个值(这也是您需要 text_id 的原因)。
df <- data.frame(text = c("Het eten was heerlijk en de bediening was fantastisch",
"Verschrikkelijk. Ik had een vlieg in mijn soep",
"Het was oké. De bediening kon wat beter, maar het eten was wel lekker. Leuk sfeertje wel!",
"Ondanks dat het druk was toch op tijd ons eten gekregen. Complimenten aan de kok voor het op smaak brengen van mijn biefstuk"))
df %>%
mutate(text_id = row_number()) %>%
unnest_tokens(output = word, input = text, drop = FALSE) %>%
inner_join(sentiment_nl, by = c("word" = "form")) %>%
group_by(text_id) %>%
summarise(text = head(text, 1),
polarity = mean(polarity),
subjectivity = mean(subjectivity),
.groups = "drop")
#> # A tibble: 4 x 4
#> text_id text polarity subjectivity
#> <int> <chr> <dbl> <dbl>
#> 1 1 Het eten was heerlijk en de bediening was fanta… 0.56 0.72
#> 2 2 Verschrikkelijk. Ik had een vlieg in mijn soep -0.5 0.9
#> 3 3 Het was oké. De bediening kon wat beter, maar h… 0.6 0.98
#> 4 4 Ondanks dat het druk was toch op tijd ons eten … -0.233 0.767
正如我所说,tidytextmining.com 解释了有关此(和 NLP)的更多信息,所以如果您现在看起来很复杂,请不要担心。