2017-05-08 1 views
0

Je suis complètement nouveau dans R, donc cette question peut sembler évidente. Cependant, je n'ai pas réussi et n'ai pas trouvé de solutioncompter les mots dans les "lignes" des jetons

Comment puis-je compter le nombre de mots dans mes jetons pendant qu'ils sont des lignes (critiques, en fait)? Donc, il y a un ensemble de données avec des critiques (reviewText) liés à ID de produits (asin)

amazonr_tidy_sent = amazonr_tidy_sent%>%unnest_tokens(word, reviewText, token = "lines") amazonr_tidy_sent = amazonr_tidy_sent %>% anti_join(stop_words)%>%ungroup()

J'ai essayé de le faire de la manière suivante

wordcounts <- amazonr_tidy_sent %>% group_by(word, asin)%>% summarize(word = n())

mais il n'a pas été approprié. Je suppose qu'il n'y a aucun moyen de compter, car la ligne comme un jeton ne peut pas être « séparé »

Merci beaucoup

+0

Qu'est-ce que 'amazonr_tidy_sent' ressemble? – Gopala

+0

Deux colonnes: "asin" (par exemple, B000M341QE, B000J3OTO6 etc.) et "mot". La colonne "word" contient des commentaires tokenisés en lignes utilisant 'unnest_tokens' –

+0

Pouvez-vous poster' dput (head (amazonr_tidy_sent, 10)) '? – Gopala

Répondre

0

Vous pouvez utiliser unnest_tokens() plus d'une fois, si cela est approprié à votre analyse. D'abord, vous pouvez utiliser unnest_tokens() pour obtenir les lignes souhaitées. Notez que j'ajoute une colonne pour garder trace de l'identifiant de chaque ligne; vous pouvez l'appeler comme vous voulez, mais l'important est d'avoir une colonne qui indiquera quelle ligne vous êtes.

library(tidytext) 
library(dplyr) 
library(janeaustenr) 


d <- data_frame(txt = prideprejudice) 

d_lines <- d %>% 
    unnest_tokens(line, txt, token = "lines") %>% 
    mutate(id = row_number()) 

d_lines 

#> # A tibble: 10,721 × 2 
#>                  line 
#>                  <chr> 
#> 1              pride and prejudice 
#> 2               by jane austen 
#> 3                chapter 1 
#> 4 it is a truth universally acknowledged, that a single man in possession 
#> 5       of a good fortune, must be in want of a wife. 
#> 6 however little known the feelings or views of such a man may be on his 
#> 7 first entering a neighbourhood, this truth is so well fixed in the minds 
#> 8 of the surrounding families, that he is considered the rightful property 
#> 9         of some one or other of their daughters. 
#> 10 "my dear mr. bennet," said his lady to him one day, "have you heard that 
#> # ... with 10,711 more rows, and 1 more variables: id <int> 

Maintenant, vous pouvez utiliser unnest_tokens()à nouveau, mais cette fois avec words afin que vous obtiendrez une ligne pour chaque mot. Notez que vous savez toujours de quelle ligne provient chaque mot.

d_words <- d_lines %>% 
    unnest_tokens(word, line, token = "words") 

d_words 
#> # A tibble: 122,204 × 2 
#>  id  word 
#> <int>  <chr> 
#> 1  1  pride 
#> 2  1  and 
#> 3  1 prejudice 
#> 4  2  by 
#> 5  2  jane 
#> 6  2 austen 
#> 7  3 chapter 
#> 8  3   1 
#> 9  4  it 
#> 10  4  is 
#> # ... with 122,194 more rows 

Maintenant, vous pouvez faire tout type de comptage que vous voulez, par exemple, peut-être vous voulez savoir combien de mots chaque ligne avait en elle?

d_words %>% 
    count(id) 

#> # A tibble: 10,715 × 2 
#>  id  n 
#> <int> <int> 
#> 1  1  3 
#> 2  2  3 
#> 3  3  2 
#> 4  4 12 
#> 5  5 11 
#> 6  6 15 
#> 7  7 13 
#> 8  8 11 
#> 9  9  8 
#> 10 10 15 
#> # ... with 10,705 more rows 
0

En divisant chaque ligne en utilisant str_split nous pouvons compter le nombre de mots par ligne.

Quelques exemples de données (contenant les nouvelles lignes et mots vides):

library(dplyr) 
library(tidytext) 
d = data_frame(reviewText = c('1 2 3 4 5 able', '1 2\n3 4 5\n6\n7\n8\n9 10 above', '1!2', '1', 
          '!', '', '\n', '1', 'able able', 'above above', 'able', 'above'), 
      asin = rep(letters, each = 2, length.out = length(reviewText))) 

Compter le nombre de mots:

by_line %>% 
    group_by(asin) %>% 
    summarize(word = sum(sapply(strsplit(word, '\\s'), length))) 

    asin word 
    <chr> <int> 
1  a 17 
2  b  2 
3  c  1 
4  d  1 
5  e  4 

Note: dans votre code d'origine la plupart des mots vides ne seront pas supprimés parce que vous diviser les données par ligne. Seules les lignes qui sont exactement un seul mot stop seront supprimées.

Pour exclure l'utilisation de mots vides wordcount ceci:

by_line %>% 
    group_by(asin) %>% 
    summarize(word = word %>% strsplit('\\s') %>% 
        lapply(setdiff, y = stop_words$word) %>% sapply(length) %>% sum) 

    asin word 
    <chr> <int> 
1  a 15 
2  b  2 
3  c  1 
4  d  1 
5  e  0 
6  f  0