【问题标题】:Removing stopwords from R data frame column从 R 数据框列中删除停用词
【发布时间】:2020-12-21 23:55:55
【问题描述】:

情况就是这样,一开始的解决方案似乎很简单,但结果却比我预期的要复杂。

我有一个包含三列的 R 数据框:一个 ID、一个包含文本(评论)的列,以及一个包含我想根据文本预测的数值的列。

我已经对文本列进行了一些预处理,所以它没有标点符号,小写,并且准备好被标记化并变成一个矩阵,这样我就可以在它上面训练一个模型。问题是我不知道如何从该文本中删除停用词。

这就是我想用 text2vec 包做的事情。一开始我打算在这个块之前删除停用词。但任何地方都可以。

library(text2vec)

test_data <- data.frame(review_id=c(1,2,3),
                        review=c('is a masterpiece a work of art',
                        'sporting some of the best writing and voice work',
                        'better in every possible way when compared'),
                         score=c(90, 100, 100))

tokens <- word_tokenizer(test_data$review)
document_term_matrix <- create_dtm(itoken(tokens), hash_vectorizer())
model_tfidf <- TfIdf$new()
document_term_matrix <- model_tfidf$fit_transform(document_term_matrix)

document_term_matrix <- as.matrix(document_term_matrix)

我希望评论栏是这样的:

review=c('masterpiec work art',
         'sporting best writing voice work',
         'better possible way compared')

【问题讨论】:

标签: r text-mining


【解决方案1】:

您可以为此使用tidytext 包:

library(tidytext)
library(dplyr)

test_data %>%
  unnest_tokens(review, review) %>%
  anti_join(stop_words, by= c("review" = "word"))

#    review_id      review score
#1.2         1 masterpiece    90
#1.6         1         art    90
#2           2    sporting   100
#2.5         2     writing   100
#2.7         2       voice   100
#3.6         3    compared   100

要将单词重新排成一行,您可以这样做:

test_data %>%
  unnest_tokens(review, review) %>%
  anti_join(stop_words, by= c("review" = "word")) %>%
  group_by(review_id, score) %>%
  summarise(review = paste0(review, collapse = ' '))

#  review_id score review                
#      <dbl> <dbl> <chr>                 
#1         1    90 masterpiece art       
#2         2   100 sporting writing voice
#3         3   100 compared              

【讨论】:

    【解决方案2】:

    事实证明,我最终解决了自己的问题。

    我创建了以下函数:

    remove_words_from_text <- function(text) {
      text <- unlist(strsplit(text, " "))
      paste(text[!text %in% words_to_remove], collapse = " ")
    }
    

    并通过 lapply 调用它。

    words_to_remove <- stop_words$word
    test_data$review <- lapply(test_data$review, remove_words_from_text)
    

    希望对遇到和我一样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2021-08-13
      • 2017-11-28
      • 2022-09-22
      • 2018-04-04
      • 2018-09-28
      相关资源
      最近更新 更多