如何通过一个列表是否包含另一个列表来过滤列表

时间:2019-07-23 23:07:48

标签: r k-means string-matching

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

这是我到目前为止所拥有的:

#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)]

工作吗?

1 个答案:

答案 0 :(得分:0)

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

freqterms <- unlist(freqterms)

您可能需要使用grep在数据中查找常用术语,因为%in%仅在两个元素相同的情况下才有效。

您首先需要将freqterms格式化为正确的正则表达式。

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

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

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

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