从 R 数据框列中删除停用词
Removing stopwords from R data frame column
情况是这样的,一开始解决方案似乎很简单,但事实证明比我想象的要复杂。
我有一个包含三列的 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')
事实证明,我最终解决了自己的问题。
我创建了以下函数:
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)
希望能帮到和我有同样问题的人。
您可以为此使用 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
情况是这样的,一开始解决方案似乎很简单,但事实证明比我想象的要复杂。
我有一个包含三列的 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')
事实证明,我最终解决了自己的问题。
我创建了以下函数:
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)
希望能帮到和我有同样问题的人。
您可以为此使用 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