Почему мои биграммы все еще рассматривают стоп-слова?

Результат по-прежнему учитывает стоп-слова... Несколько строк моего txt:

Sensacional, ума дас melhores римейки де анимасао Саи сделать кино emocionado, absurdamente lindo, insensibilidade де quem reclama сделать мюзикл, lindo demais. (...)о фильм зависит от ностальгии да animação пункт funcionar. E apesar de ser eficaz, somente esse sentio não sustenta o longa sozinho para dizer que esta obra tenha qualidade e refinamento cinematográficos. um lado inova o seu contexto social, por outro lado a falta de originalidade compromete que a obra seja mais impactante.

Рединг текст

data <- read_tsv("bela.txt", locale = locale(encoding = "latin1"))

Создание корпуса

datacorpus <- VCorpus(VectorSource(data))

datacorpus <- tm_map(datacorpus, PlainTextDocument)

datacorpus <- tm_map(datacorpus, removePunctuation) 

datacorpus <- tm_map(datacorpus, removeWords, stopwords('pt')) 

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))

tdm <- TermDocumentMatrix(datacorpus,control=list(removePunctuation = TRUE, 
                                       stopwords = stopwords('pt'),
                                       removeNumbers = TRUE,
                                       tokenize = BigramTokenizer))

m <- as.matrix(tdm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 10)

set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 1,
      max.words=200, random.order=FALSE, rot.per=0.35, 
      colors=brewer.pal(8, "Dark2"))

введите здесь описание изображения


person Raquel Dourado    schedule 31.03.2017    source источник
comment
В чем именно заключается ваш вопрос? Я не уверен, что ясно вижу здесь проблему.   -  person MrFlick    schedule 31.03.2017
comment
Мне не нужны биграммы со стоп-словами типа: a, o, os.   -  person Raquel Dourado    schedule 31.03.2017


Ответы (1)


Предполагая, что вы хотите удалить биграммы, содержащие стоп-слова, используя пакет tidytext, вы можете сделать

library(dplyr)
library(tidytext)

set.seed(47)

data_frame(text = 'Sensacional, uma das melhores remakes de animação sai do cinema emocionado, absurdamente lindo, insensibilidade de quem reclama do musical, lindo demais. (...)o filme depende muito da nostalgia da animação para funcionar. E apesar de ser eficaz, somente esse sentimento não sustenta o longa sozinho para dizer que esta obra tenha qualidade e refinamento cinematográficos.(...)A Bela e a Fera acerta em tornar a sua história ainda extremamente relevante nos dias atuais, e se de um lado inova o seu contexto social, por outro lado a falta de originalidade compromete que a obra seja mais impactante.') %>% 
    unnest_tokens(bigram, text, 'ngrams', n = 2) %>%    # tokenize bigrams
    mutate(i = row_number()) %>%    # add index for later grouping
    unnest_tokens(word, bigram, drop = FALSE) %>%    # tokenize bigrams into words
    anti_join(data_frame(word = tm::stopwords('pt'))) %>%    # drop rows with stop words
    group_by(i) %>%    # group by bigram index
    filter(n() == 2) %>%    # drop bigram instances where only one word left
    summarise(bigram = unique(bigram)) %>%    # collapse groups to single bigram each
    count(bigram) %>% 
    { wordcloud::wordcloud(.$bigram, .$n, min.freq = 1, scale = c(1, .2), rot.per = .35, 
                           colors = RColorBrewer::brewer.pal(8, 'Dark2')) }

Цвета здесь не работают, потому что каждый из них встречается по одному разу, но должны нормально работать в масштабе.

person alistaire    schedule 31.03.2017
comment
Можно ли удалить стоп-слово и сделать биграммы только с оставшимися словами? - person Raquel Dourado; 31.03.2017
comment
Конечно, на самом деле это проще; просто сначала токенизируйте слова, anti_join, а затем повторно токенизируйте в биграммы. Проблема в том, что вы будете создавать биграммы из слов, которые на самом деле не рядом друг с другом, когда между ними было стоп-слово. - person alistaire; 31.03.2017
comment
Мне очень тяжело... Что я делаю не так? - извините, я новичок в R data_frame(text = datacorpus) unnest_tokens(unigram, text, 'ngrams', n = 1) mutate(i = row_number()) unnest_tokens(word, unigram, drop = FALSE) - person Raquel Dourado; 31.03.2017
comment
anti_join(data_frame(word = tm::stopwords('pt'))) unnest_tokens(bigram, text, 'ngrams', n = 2) mutate(i = row_number()) unnest_tokens(word, bigram, drop = FALSE) group_by (i) filter(n() == 2) summarise(bigram = unique(bigram)) count(bigram) % { wordcloud::wordcloud(.$bigram, .$n, min.freq = 1, scale = c( 1, .2), rot.per = .35, colors = RColorBrewer::brewer.pal(8, 'Dark2')) } - person Raquel Dourado; 31.03.2017
comment
Вам нужно либо использовать конвейеры, либо сохранять промежуточные переменные, либо вкладывать вызовы. Это будет выглядеть как data_frame(text = ...) %>% unnest_tokens(word, text) %>% anti_join(data_frame(word = tm::stopwords('pt'))) %>% unnest_tokens(bigram, word, 'ngrams', n = 2) %>% count(bigram) %>% { wordcloud::wordcloud(.$bigram, .$n, ...) } с заполненным .... - person alistaire; 01.04.2017