创建一个函数以仅删除列表中的特定单词 (R)

Creating a function to remove only specific word in a list (R)

我有一个列表,其中包含不需要的单词(西班牙语),这些单词毫无意义,但它们也存在于另一个单词中。我只想在它们是一个术语时将其删除,而不是当它们是另一个词的一部分时。

例如:"la"是一篇西班牙文章,但是如果我用一个函数去掉它,也会把一个有用的词分成两个词,比如"relacion"(意思是关系)

我的第一选择是创建一个函数来删除这些条款。

bdtidy$tweet <- #here are tweets
fix.useless <- function(doc) {   
function(doc) {
doc <- gsub("la", ".", doc)
doc <- gsub("las", ".", doc)
doc <- gsub("el", ".", doc)
doc <- gsub("ellos", ".", doc)
doc <- gsub("ellas", ".", doc)
return(doc)
 }

bdtidy$tweet <- sapply(bdtidy$tweet, fix.useless)

我的第二个选择是使用列表,然后在 df

中使用过滤器
nousar <- c("rt", "pero", "para"...)
new df %>% bdtidy %>%
 filter(!tweet $in$ nousar))

但结果总是删除所有这些词并用两个词打破术语,这使我的分析毫无用处。 谢谢

从字符串中删除单个单词的一种方法是在单词的两侧添加空格,例如以下示例:

# sample input
x <- c("Get rid of la but not lala")
# pattern with spaces flanking target word
y <- gsub(" la ", " ", x)
# output
> y
[1] "Get rid of but not lala"

您可以对单词进行分词。即,提取单个单词。提取它们后,您可以检查匹配项并将其删除。 stringr 包可以在这里帮助你

#sample text
text <- "hola, me llamo struggles. El package 'stringr' puede resolver la pregunta."

#normalize text by making everything lowercase
lower_text <- stringr::str_to_lower(text)

#split text at anything that isn't a number or a letter
tokens <- stringr::str_split(lower_text, "[^[:alnum:]]+")

#create a list of stop words
stop_words <- c('la', 'las', 'el', 'ellos')

#remove words that are in the stop words vector
tokens[[1]][!tokens[[1]] %in% stop_words]

因为你可能会用很多推文来做这个,我建议你也看看 tidytext 包并通读教程 https://www.tidytextmining.com/

df <- data.frame(
  tweet = text,
  tweet_id = 1234,
  user = 'struggles',
  stringsAsFactors = F
)

twitter_tokens <- tidytext::unnest_tokens(df, word, tweet)

clean_twitter_tokens <- dplyr::filter(twitter_tokens, !word %in% stop_words)

这会给你类似的东西

  tweet_id      user      word
1     1234 struggles      hola
2     1234 struggles        me
3     1234 struggles     llamo
4     1234 struggles struggles
5     1234 struggles   package
6     1234 struggles   stringr
7     1234 struggles     puede
8     1234 struggles  resolver
9     1234 struggles  pregunta

如果您想将它放在一个句子中,那么以下内容将把它带回来:

lean_twitter_tokens %>%
  dplyr::group_by(tweet_id, user) %>%
  dplyr::summarize(tweet = stringr::str_c(word, collapse = ' '))

给你

  tweet_id user      tweet                                                          
     <dbl> <chr>     <chr>                                                          
1     1234 struggles hola me llamo struggles package stringr puede resolver pregunta