创建一个函数以仅删除列表中的特定单词 (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
我有一个列表,其中包含不需要的单词(西班牙语),这些单词毫无意义,但它们也存在于另一个单词中。我只想在它们是一个术语时将其删除,而不是当它们是另一个词的一部分时。
例如:"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