R中词的相对位置

时间:2018-02-20 06:19:37

标签: r regex grep position text-mining

我有以下术语documnet矩阵和数据框。

tdm <- c('Free', 'New', 'Limited', 'Offer')



Subject                                               Free New Limited Offer                                                    

'Free Free Free! Clear Cover with New Phone',          0   0     0      0
'Offer ! Buy New phone and get earphone at             0   0     0      0
1000. Limited Offer!'

我想将以下数据框作为输出

Subject                                              Free  New Limited Offer    
'Free Free Free! Clear Cover with New Phone',        1,2,3  8   NA     NA
Offer ! Buy New phone and get earphone at  1000.      NA    3   12      1,13
Limited Offer!'                                                                         

我尝试了下面的代码并得到了一个结果,但这只给了我沿着字符串的单词的位置。我需要单词的位置,如Hell0 - 1 new-2。

for(i in 1:length(tdm))
{    word.locations <- 
gsub(")","",gsub("c(","",unlist(paste(gregexpr(pattern 
= tdm[i], DF$Subject))), fixed = TRUE), fixed = TRUE)
  df <- cbind(DF,word.locations)
  }
  colnames(DF) <- c("text", word)

我请求别人帮忙。

1 个答案:

答案 0 :(得分:1)

考虑到输入:

tdm <- c('Free', 'New', 'Limited', 'Offer')
subject <- c("Free Free Free! Clear Cover with New Phone",
             "Offer ! Buy New phone and get earphone at 1000. Limited Offer!")

我会做类似的事情:

sapply(tolower(tdm), function(x) {
    lapply(strsplit(tolower(subject), "(\\s+)|(?!')(?=[[:punct:]])", perl = TRUE), 
      function(y) {
        y <- y[nzchar(y)]
        toString(grep(x, y))
      })
})
##      free      new limited offer  
## [1,] "1, 2, 3" "8" ""      ""     
## [2,] ""        "4" "12"    "1, 13"

发生了什么:

  • 对要匹配的字符串和匹配的字词使用tolower
  • 使用strsplit将字词和标点符号拆分为list元素中的单独项目。
  • 使用nzchar()删除所有空白的向量。
  • 使用grep()查找匹配的位置。
  • 使用toString()将位置粘贴为逗号分隔的字符串。