2017-02-06 2 views
0

У меня есть Serveral предложение с мнением тегами, и я хочу dataframe, чтобы показать информациюСделать dataframe, которая содержит тег-информацию каждое предложение в R

test = c("I very/AD very/AD like/POS the voice/FE","I really really/AD hate/NEG you/FE","I love/POS and adore/POS him although he is rude/NEG") 

> test 
[1] "I very/AD very/AD like/POS the voice/FE"    
[2] "I really really/AD hate/NEG you/FE"     
[3] "I love/POS and adore/POS him although he is rude/NEG" 


> test = strsplit(test, ' ') 
[[1]] 
[1] "I" "very/AD" "very/AD" "like/POS" "the" "voice/FE" 

[[2]] 
[1] "I" "really" "really/AD" "hate/NEG" "you/FE" 

[[3]] 
[1] "I" "love/POS" "and" "adore/POS" "him" "although" "he" "is" "rude/NEG" 

С учетом указанными выше данными, я хочу make dataframe содержит информацию о тегах для КАЖДОГО предложения, подобного этому.

POS NEG AD FE 
1 1 0 2 voice 
2 0 1 1 you 
3 2 1 0 

Теперь все, что я могу сделать просто сделать dataframe с общей суммой вверх информации, как это.

POS NEG AD FE 
1 3 2 3 voice 
2 3 2 3 you 

я могу сделать это с помощью этих кодов ниже (я написал их только в случае, если вы могли бы использовать их, чтобы получить подсказку)

POS = grepl(pattern = "POS", unlist(test)) 
POS = length(POS[POS == T]) 
POS 

NEG = grepl(pattern = "NEG", unlist(test)) 
NEG = length(NEG[NEG == T]) 
NEG 

AD = grepl(pattern = "AD", unlist(test)) 
AD = length(AD[AD == T]) 
AD 

FE = data.frame(word=unlist(test)) 
FE$match = grepl(pattern = "FE", unlist(test)) 
FE = FE[FE$match == T,] 
FE = gsub('\\/FE','', FE$word) 

data.frame(POS,NEG,AD,FE) 

Опять же, что я стремлюсь, чтобы сделать dataframe, который содержит важную тег-информацию каждое предложение. (коды ответа могут работать независимо от количества предложений, так как тестовые данные могут иметь несколько предложений)

POS NEG AD FE 
1 1 0 2 voice 
2 0 1 1 you 
3 2 1 0 
... 

ответ

1

Мы можем попробовать

res <- t(sapply(strsplit(test, " "), function(x) { 
     i1 <- grep("[/]", x) 
     x1 <- x[i1] 
     d1 <- do.call(rbind.data.frame, strsplit(x1, "[/]"))[2:1] 
     colnames(d1) <- c("key", "val") 
     d1$key <- factor(d1$key, levels = c("POS", "NEG", "AD", "FE")) 
     t1 <- t(table(d1)) 
     colSums(t1)})) 
library(stringr) 
res[,4] <- str_extract(test, "\\w+(?=/FE)") 
+0

Что делать со списками в переменной FE? – Rcoding

+0

@Rcoding исправил эту проблему – akrun

1

Если вы хотите data.frame, вы можете использовать функцию plyr::ldply:

ldply(test, 
     function(t){ 

     FE <- strsplit(unlist(t), ' ')[[1]] 
     FE <- FE[grepl(pattern = "FE", FE)] 
     FE <- gsub('\\/FE','', FE) 

     data.frame(
      POS = sum(grepl(pattern = "POS", strsplit(t, ' '))), 
      NEG = sum(grepl(pattern = "NEG", strsplit(t, ' '))), 
      AD = sum(grepl(pattern = "AD", strsplit(t, ' '))), 
      FE = ifelse(length(FE) == 0, '', FE)) 
     }) 
0

str_count из stringr может быть путь, т.е.

library(stringr) 
sapply(c('POS', 'NEG', 'AD', 'FE'), function(i) str_count(test, i)) 
#  POS NEG AD FE 
#[1,] 1 0 2 1 
#[2,] 0 1 1 1 
#[3,] 2 1 0 0 

, чтобы получить список на FE, затем

m1[,'FE'] <- replace(m1[,'FE'], m1[,'FE'] == 1, 
      gsub('/.*', '', unlist(sapply(strsplit(test, ' '), function(i) 
                 grep('/FE', i, value = TRUE))))) 
m1 
#  POS NEG AD FE  
#[1,] "1" "0" "2" "voice" 
#[2,] "0" "1" "1" "you" 
#[3,] "2" "1" "0" "0"