我正在使用此example对R中的txt文档集合进行情感分析。代码为:
library(tm)
library(tidyverse)
library(tidytext)
library(glue)
library(stringr)
library(dplyr)
library(wordcloud)
require(reshape2)
files <- list.files(inputdir,pattern="*.txt")
GetNrcSentiment <- function(file){
fileName <- glue(inputdir, file, sep = "")
fileName <- trimws(fileName)
fileText <- glue(read_file(fileName))
fileText <- gsub("\\$", "", fileText)
tokens <- data_frame(text = fileText) %>% unnest_tokens(word, text)
# get the sentiment from the first text:
sentiment <- tokens %>%
inner_join(get_sentiments("nrc")) %>% # pull out only sentiment words
count(sentiment) %>% # count the # of positive & negative words
spread(sentiment, n, fill = 0) %>% # made data wide rather than narrow
mutate(sentiment = positive - negative) %>% # positive - negative
mutate(file = file) %>% # add the name of our file
mutate(year = as.numeric(str_match(file, "\\d{4}"))) %>% # add the year
mutate(city = str_match(file, "(.*?).2")[2])
return(sentiment)
}
.txt文件存储在inputdir
中,名称为AB-City.0000
,其中AB是国家/地区的缩写,城市是城市名称,0000是年份(范围从2000年到2017年)。
该功能可以按预期使用单个文件,即GetNrcSentiment(files[1])
为我提供了适当的每个情绪计数。但是,当我尝试为整套运行时,即
nrc_sentiments <- data_frame()
for(i in files){
nrc_sentiments <- rbind(nrc_sentiments, GetNrcSentiment(i))
}
我收到以下错误消息:
Joining, by = "word"
Error in rbind(deparse.level, ...) :
numbers of columns of arguments do not match
完全相同的代码适用于较长的文档,但在处理较短的文本时会出错。似乎并非所有情绪都在小文档中找到,因此每个文档的列数会有所不同,这可能会导致此错误,但我不确定。我很感激有关如何解决问题的任何建议。如果没有找到情绪,我希望该条目等于零(如果这是我的问题的原因)。
顺便说一下,bing情绪函数会运行大约二十几个文件并给出不同的错误,这似乎指向同样的问题(没有找到负面情绪?):
GetBingSentiment <- function(file){
fileName <- glue(inputdir, file, sep = "")
fileName <- trimws(fileName)
fileText <- glue(read_file(fileName))
fileText <- gsub("\\$", "", fileText)
tokens <- data_frame(text = fileText) %>% unnest_tokens(word, text)
# get the sentiment from the first text:
sentiment <- tokens %>%
inner_join(get_sentiments("bing")) %>% # pull out only sentiment words
count(sentiment) %>% # count the # of positive & negative words
spread(sentiment, n, fill = 0) %>% # made data wide rather than narrow
mutate(sentiment = positive - negative) %>%
mutate(file = file) %>% # add the name of our file
mutate(year = as.numeric(str_match(file, "\\d{4}"))) %>% # add the year
mutate(city = str_match(file, "(.*?).2")[2])
# return our sentiment dataframe
return(sentiment)
}
Error in mutate_impl(.data, dots) :
Evaluation error: object 'negative' not found.
编辑:根据David Klotz的建议,我将代码编辑为
for(i in files){ nrc_sentiments <- dplyr::bind_rows(nrc_sentiments, GetNrcSentiment(i)) }
结果,如果没有找到来自某个情绪的单词,nrc不会抛出错误而是生成NA,但是在22次加入后我得到了不同的错误:
Error in mutate_impl(.data, dots) : Evaluation error: object 'negative' not found.
使用dplyr运行bing函数时会出现相同的错误。当函数到达第22个文档时,两个数据帧都包含所有情绪的列。什么可能导致错误以及如何诊断错误?
答案 0 :(得分:1)
dplyr的bind_rows
功能比rbind
更灵活,至少在缺少列时更是如此:
nrc_sentiments <- dplyr::bind_rows(nrc_sentiments, GetNrcSentiment(i))
答案 1 :(得分:1)
输入可能缺少表达式
中使用的“否定”列