参数列的数量不匹配

时间:2018-06-12 15:40:40

标签: r tidyverse sentiment-analysis tidytext

我正在使用此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个文档时,两个数据帧都包含所有情绪的列。什么可能导致错误以及如何诊断错误?

2 个答案:

答案 0 :(得分:1)

dplyr的bind_rows功能比rbind更灵活,至少在缺少列时更是如此:

nrc_sentiments <- dplyr::bind_rows(nrc_sentiments, GetNrcSentiment(i))

答案 1 :(得分:1)

输入可能缺少表达式

中使用的“否定”列