r - 使用函数计算分数,然后放入带有正确变量的数据框或小标题
问题描述
我正在开发一个函数,希望对列表中 NRC 词典中的每种情绪执行情绪分析(请参阅:https ://www.tidytextmining.com/sentiment.html#sentiment-analysis-with-inner-join ) ,然后将分数本身保存为数据框或小标题中的变量。我已经完成了实际的分析部分,但将其保存在数据框或 tibble 中不起作用。
#Creating List of All Emotions To Apply This To
emotion <- c('anger', 'disgust', 'joy', 'surprise', 'anticip', 'fear', 'sadness', 'trust')
#Initialize List with Length of Emotion Vector
wcount <- vector("list", length(emotion))
#Create Tibble for me to Deposit the Result Into
nrc_tib <-tibble(id="",
anger=numeric(0),
disgust=numeric(0),
joy=numeric(0),
surprise=numeric(0),
anticip=numeric(0),
fear=numeric(0),
sadness=numeric(0),
trust=numeric(0))
#Create Row to Deposit Variable Into
nrc_tib <-add_row(nrc_tib, 'id'="transcript1.txt")
#Defining Function
sentimentanalysis_nrc <- function(emoi) {
#Getting Sentiment, Filtering by Emotion in List
nrc_list <- get_sentiments("nrc") %>%
filter(sentiment == emoi)
#Conducting Sentiment Analysis, Saving Results
wcount[[emoi]] <- wordcount %>%
inner_join(nrc_list) %>%
count(word, sort = TRUE)
#Calculating Sentiment Score for Given Emotion
score <- sum(wcount[[emoi]]$n)
#Saving Emotion in nrc_tib, which is the part that doesn't work
nrc_tib$emoi <- score
}
#Running the Function
lapply(emotion, FUN = sentimentanalysis_nrc)
我尝试了一些不同的方法,包括将 emoi 放在不起作用的行中的括号中,并且一些谷歌搜索表明这是不允许的。如果我想保存它会被允许做什么?
注意:如果这有助于上下文...此示例使用文件 transcript1.txt,但我的最终目标是在transcript2.txt-transcript45.txt 中对此进行概括,然后将所有45 个成绩单的分数绑定在一起。
编辑:我想出了一个笨重的解决方案,使用:
nrc_tib <<- replace(nrc_tib, emoi, score)
但必须有比这更好的解决方案。
解决方案
使用整洁数据原则的一大好处是这样的问题变得非常容易处理!您可以使用连接来做到这一点。
由于您没有发布示例数据,因此我将使用简奥斯汀的小说作为示例。将每本书视为您的成绩单之一。第一步是使用unnest_tokens()
.
library(tidyverse)
library(tidytext)
library(janeaustenr)
tidy_books <- austen_books() %>%
unnest_tokens(word, text)
tidy_books
#> # A tibble: 725,055 x 2
#> book word
#> <fct> <chr>
#> 1 Sense & Sensibility sense
#> 2 Sense & Sensibility and
#> 3 Sense & Sensibility sensibility
#> 4 Sense & Sensibility by
#> 5 Sense & Sensibility jane
#> 6 Sense & Sensibility austen
#> 7 Sense & Sensibility 1811
#> 8 Sense & Sensibility chapter
#> 9 Sense & Sensibility 1
#> 10 Sense & Sensibility the
#> # … with 725,045 more rows
然后,您可以使用inner_join()
. 请注意,通过此连接,您将成功地将每种情绪与每个单词匹配(在适当的情况下,单词在此数据框中不止一次)。
tidy_books %>%
inner_join(get_sentiments("nrc"))
#> Joining, by = "word"
#> # A tibble: 177,363 x 3
#> book word sentiment
#> <fct> <chr> <chr>
#> 1 Sense & Sensibility sense positive
#> 2 Sense & Sensibility sensibility positive
#> 3 Sense & Sensibility long anticipation
#> 4 Sense & Sensibility respectable positive
#> 5 Sense & Sensibility respectable trust
#> 6 Sense & Sensibility general positive
#> 7 Sense & Sensibility general trust
#> 8 Sense & Sensibility good anticipation
#> 9 Sense & Sensibility good joy
#> 10 Sense & Sensibility good positive
#> # … with 177,353 more rows
现在,您可以count()
提高每本书(在您的情况下为成绩单)和情感/情感的情感分数。
tidy_books %>%
inner_join(get_sentiments("nrc")) %>%
count(book, sentiment)
#> Joining, by = "word"
#> # A tibble: 60 x 3
#> book sentiment n
#> <fct> <chr> <int>
#> 1 Sense & Sensibility anger 1343
#> 2 Sense & Sensibility anticipation 3698
#> 3 Sense & Sensibility disgust 1172
#> 4 Sense & Sensibility fear 1861
#> 5 Sense & Sensibility joy 3364
#> 6 Sense & Sensibility negative 4005
#> 7 Sense & Sensibility positive 7429
#> 8 Sense & Sensibility sadness 2064
#> 9 Sense & Sensibility surprise 1589
#> 10 Sense & Sensibility trust 4222
#> # … with 50 more rows
您甚至可以直接通过管道制作情节!
tidy_books %>%
inner_join(get_sentiments("nrc")) %>%
count(book, sentiment) %>%
ggplot(aes(sentiment, n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~book, scales = "free_y") +
coord_flip()
#> Joining, by = "word"
由reprex 包(v0.3.0)于 2019 年 12 月 13 日创建
推荐阅读
- reactjs - 使用 mocha 测试 tsx 组件 - TypeScript、React 和 Mocha
- python - scipy 中用于计算相对熵的 3 个函数。有什么不同?
- swift - 在 swift/Xcode 中达到一定分数后尝试结束游戏
- java - 如何解析响应的 json 表示?
- excel - 将 excel 工作表导出到 csv 中,同时省略带有公式但没有数据的底部行
- assembly - 跳转到新函数后 rbp 的值发生变化
- ibm-cloud - 如何在 IBM Cloud 上通过 SSL VPN 向用户授予私有 IP 访问权限
- python - 如何让我在 Django 中的评论表单开始工作
- ios - 有人可以从主机应用程序访问 iOS SDK TextFiled 值吗
- vue.js - Vuetify Font 很棒的 SVG 集成问题