如何通过是否包含来自另一个列表的字符串来过滤一个列表

How to filter one list by whether or not it contains a string from another

我有一个短语列表,以及在这些短语中找到的最常用术语的列表。我想过滤原始列表,只保留包含我的第二个列表中的一个术语的字符串。

这是我目前的情况:

#Set data source, format for use, check consistency
MyData <-  c('Create company email', 'email for business', 'free trial', 'corporate pricing', 'email cost')

#Create corpus from csv
corpus <- Corpus(VectorSource(MyData$Keyword))

#Clean corpus
cleanset1 <- tm_map(corpus, tolower)
cleanset2 <- tm_map(cleanset1, removeNumbers)
cleanset3 <- tm_map(cleanset2, removeWords, stopwords('english'))
cleanset4 <- tm_map(cleanset3, removePunctuation)

#Convert to Term Document Matrix
tdm <- TermDocumentMatrix(cleanset4)

#Find Freq
freqterms<-as.list(findFreqTerms(tdm,20))

此时我有一个最常用术语列表(使用 tm 包)和我的原始列表。从原始列表中删除不包含 freqterms 列表中任一术语的任何值的最佳方法是什么?

会不会像

filtered <-MyData[!(MyData %in% freqterms)]

工作?

如果我对您的数据结构的理解正确,那么 freqterms 是一个列表,其中每个元素只是一个术语。如果是这样,将频率项转换为向量可能会更容易。

freqterms <- unlist(freqterms)

您可能需要使用 grep 来查找数据中的常用词,因为 %in% 只有在两个元素相同时才有效。

您首先需要将频率术语格式化为正确的正则表达式。

freqterms.regex <- paste0("(", paste0(freqterms, collapse="|"), ")")

这会将您的常用字词设置为 "(term1|term2|term3|...)" 的格式。然后,您可以将其与 grepl 一起用作模式,以仅保留 MyData 中具有匹配项的条目。

matches <- MyData[grepl(MyData, pattern=freqterms.regex)]

根据您的 MyData 和 freqterms 的外观,您可能需要使正则表达式更加严格。