Как преобразовать матрицу терминов документа в R?

Здравствуйте, у меня есть матрица терминов документа, и я преобразовал ее с помощью функции tidy(), и она отлично работает. Я хочу построить облако слов на основе частоты слова. Итак, моя преобразованная таблица выглядит так:

> head(Wcloud.Data)
# A tibble: 6 x 3
  document term       count
  <chr>    <chr>      <dbl>
1 1        accept         1
2 1        access         1
3 1        accomplish     1
4 1        account        4
5 1        accur          2
6 1        achiev         1

У меня 33 647 383 наблюдения, так что это очень большой кадр данных. Если я использую функцию max(), я получаю очень большое число (64116), но ни одно слово в моем фрейме данных не имеет частоты 64116. Также, если я рисую фрейм данных блестящим с wordcloud(), он отображает одни и те же слова несколько раз. Также, если я хочу отсортировать свой столбец count, он не работает - sort(Wcloud.Data$count,decreasing = TRUE). Значит что-то не так, но я не знаю, что и как это решить. У кого-нибудь есть идеи?

Это сводка моей матрицы терминов документа, прежде чем преобразовать ее в фрейм данных:

> observations.tf
<<DocumentTermMatrix (documents: 76717, terms: 4234)>>
Non-/sparse entries: 33647383/291172395
Sparsity           : 90%
Maximal term length: 15
Weighting          : term frequency (tf)

Обновление: я добавляю изображение своего фрейма данных

Фрейм данных

Вывод


person Belfort90    schedule 17.06.2018    source источник
comment
Можете ли вы предоставить нам подмножество данных Wcloud.Data (возможно, используя dput), чтобы мы могли воспроизвести проблему в вашем наборе данных? Я думаю, что у меня есть решение для вас, но нужно подтвердить на месте. Спасибо :)   -  person mysteRious    schedule 17.06.2018
comment
Появление одного и того же слова является нормальным, поскольку у вас есть несколько документов (76717), и если слово появляется в нескольких документах с высокой частотой, оно будет напечатано несколько раз. Если вам нужно облако слов, состоящее только из слов, избавьтесь от документа и агрегируйте числа для каждого слова.   -  person phiver    schedule 17.06.2018
comment
@phiver спасибо за ваш ответ. Как я могу решить это автоматически? Я не хочу, чтобы это было множественным.   -  person Belfort90    schedule 17.06.2018
comment
@mysteRious Не знаю почему, но у меня проблема с выводом. Или R вычисляет, и ему нужно некоторое время. Какова ваша идея?   -  person Belfort90    schedule 17.06.2018
comment
Все, что могло бы получить 100-1000 строк Wcloud.Data для работы, было бы полезно.   -  person mysteRious    schedule 17.06.2018
comment
@mysteRious это не поможет, потому что мой набор данных выглядит нормально. но поскольку у меня есть несколько документов, он будет вычислять столбец count по-разному. Как я могу это решить, я просто хочу работать с числами, которые отображаются в моем столбце подсчета (см. рисунок выше в моем вопросе)   -  person Belfort90    schedule 17.06.2018
comment
@mysteRious Проверьте мой вопрос. Я разместил изображение, на котором показано, что слово отображается несколько раз, и это моя проблема.   -  person Belfort90    schedule 17.06.2018


Ответы (1)


Используя dplyr, вы можете сделать следующее:

library("tm")
library("SnowballC")
library("wordcloud")
library("RColorBrewer")

Wcloud.Data<- data.frame(Document= c(rep(1,6)), 
                         term = c("accept", "access","accomplish", "account", "accur", "achiev"),
                         count = c(1,1,1,4,2,1))

Data<-Wcloud.Data %>% 
  group_by(term) %>% 
  summarise(Frequency = sum(count))
set.seed(1234)
wordcloud(words = Data$term, freq = Data$Frequency, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

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

С другой стороны, библиотеки quanteda и tibble могут помочь вам создать матрицу частот терминов. Я приведу вам пример работы с ним:

library(tibble)
library(quanteda)
Data <- data_frame(text = c("Chinese Beijing Chinese",
                              "Chinese Chinese Shanghai",
                              "this is china",
                              "china is here",
                              'hello china',
                              "Chinese Beijing Chinese",
                              "Chinese Chinese Shanghai",
                              "this is china",
                              "china is here",
                              'hello china',
                              "Kyoto Japan",
                              "Tokyo Japan Chinese",
                              "Kyoto Japan",
                              "Tokyo Japan Chinese",
                              "Kyoto Japan",
                              "Tokyo Japan Chinese",
                              "Kyoto Japan",
                              "Tokyo Japan Chinese",
                              'japan'))
DocTerm <- quanteda::dfm(Data$text)
DocTerm
# Document-feature matrix of: 19 documents, 11 features (78.5% sparse).
# 19 x 11 sparse Matrix of class "dfm"
# features
# docs     chinese beijing shanghai this is china here hello kyoto japan tokyo
# text1        2       1        0    0  0     0    0     0     0     0     0
# text2        2       0        1    0  0     0    0     0     0     0     0
# text3        0       0        0    1  1     1    0     0     0     0     0
# text4        0       0        0    0  1     1    1     0     0     0     0
# text5        0       0        0    0  0     1    0     1     0     0     0
# text6        2       1        0    0  0     0    0     0     0     0     0
# text7        2       0        1    0  0     0    0     0     0     0     0
# text8        0       0        0    1  1     1    0     0     0     0     0
# text9        0       0        0    0  1     1    1     0     0     0     0
# text10       0       0        0    0  0     1    0     1     0     0     0
# text11       0       0        0    0  0     0    0     0     1     1     0
# text12       1       0        0    0  0     0    0     0     0     1     1
# text13       0       0        0    0  0     0    0     0     1     1     0
# text14       1       0        0    0  0     0    0     0     0     1     1
# text15       0       0        0    0  0     0    0     0     1     1     0
# text16       1       0        0    0  0     0    0     0     0     1     1
# text17       0       0        0    0  0     0    0     0     1     1     0
# text18       1       0        0    0  0     0    0     0     0     1     1
# text19       0       0        0    0  0     0    0     0     0     1     0

Mat<-quanteda::convert(DocTerm,"data.frame")[,2:ncol(DocTerm)] # Converting to a Dataframe without taking into account the text variable
Result<- colSums(Mat) # This is what you are interested in
names(Result)<-colnames(Mat)
# > Result
# chinese  beijing shanghai     this       is    china     here    hello    kyoto    japan 
# 24        4        4        4        8       12        4        4        8       18 
person Carles Sans Fuentes    schedule 17.06.2018
comment
Спасибо, Карлес, но моя проблема в другом. phiver узнал, к чему ведет моя проблема. - person Belfort90; 17.06.2018
comment
Хорошо, теперь я отредактировал свой вопрос, чтобы получить ваш ответ. Кроме того, если вы просто попытаетесь выполнить группировку суммы (счета) по термину, это должно сработать. - person Carles Sans Fuentes; 17.06.2018
comment
Это моя проблема: одно и то же слово появляется нормально, поскольку у вас есть несколько документов (76717), и если слово появляется в нескольких документах с высокой частотой, оно будет напечатано несколько раз. - person Belfort90; 17.06.2018
comment
Да, это и есть термин частотная матрица. Количество слов в документе. Если наиболее типичное слово встречается более чем в одном документе, оно появляется несколько раз. - person Carles Sans Fuentes; 17.06.2018
comment
Так что я могу сделать? - person Belfort90; 17.06.2018
comment
Я не понимаю тогда хорошо ваш вопрос. Что именно вы хотите сделать. Кроме того, как они сказали, постарайтесь предоставить данные, которые вы используете, чтобы люди могли поиграть с ними. - person Carles Sans Fuentes; 17.06.2018
comment
Если я рисую облако слов, оно отображает одни и те же слова несколько раз и вычисляет все мои столбцы подсчета, кратные. Я просто хочу работать с этими числами, включенными в столбец подсчета, не более того (см. Мое изображение выше). - person Belfort90; 17.06.2018
comment
Я до сих пор не понимаю, что вы хотите сделать, какова ваша цель? - person Carles Sans Fuentes; 17.06.2018
comment
Бро, я просто хочу нарисовать облако слов с помощью функции wordcloud. Функция wordcloud берет слово и частоту слова и отображает его. Поскольку мой набор данных рассчитывается как несколько (и я не знаю, как это убрать), это моя проблема. Я просто не хочу, чтобы он вычислялся кратно. - person Belfort90; 17.06.2018
comment
Проверьте мой вопрос. Я разместил изображение, на котором показано, что слово отображается несколько раз, и это моя проблема. - person Belfort90; 17.06.2018
comment
Я думаю, что ответил на это в своем коде. Скажите пожалуйста, если это не так - person Carles Sans Fuentes; 17.06.2018
comment
Я попробовал ваш код фильтра, не сработало. Другой код из вашего генерирует новую таблицу, но у меня уже есть кадр данных - person Belfort90; 17.06.2018
comment
Для меня это работает с вашим примером. Я переписал свой код с началом вашего примера. Проверьте еще раз. - person Carles Sans Fuentes; 17.06.2018
comment
Бро, я думаю, это сработало!!! Позвольте мне внести некоторые коррективы, и я дам вам знать - person Belfort90; 17.06.2018
comment
Если я поставлю max.words выше, я получу много таких ошибок для многих слов: Warnung in wordcloud(words = WData$term, freq = WData$Frequency, min.freq = 1, subtyp could not be fit on page. It will not be plotted. - person Belfort90; 17.06.2018
comment
Но мне нужно. Я хочу зарисовать их всех. - person Belfort90; 17.06.2018
comment
stackoverflow.com/questions/27981651/. Я думаю, что ваша проблема с Белфортом решена. Ваше здоровье ! - person Carles Sans Fuentes; 18.06.2018
comment
до сих пор не работает. получаю ту же ошибку, даже если я пытаюсь с весами. Я не знаю человека, как я могу решить это. Может, я еще раз задам тот же вопрос? - person Belfort90; 18.06.2018