список частот слов с использованием R

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

library(tm)
library(RWeka)

txt <- read.csv("HW.csv",header=T) 
df <- do.call("rbind", lapply(txt, as.data.frame))
names(df) <- "text"

myCorpus <- Corpus(VectorSource(df$text))
myStopwords <- c(stopwords('english'),"originally", "posted")
myCorpus <- tm_map(myCorpus, removeWords, myStopwords)

#building the TDM

btm <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))
myTdm <- TermDocumentMatrix(myCorpus, control = list(tokenize = btm))

Обычно я использую следующий код для создания списка слов в частотном диапазоне.

frq1 <- findFreqTerms(myTdm, lowfreq=50)

Есть ли способ автоматизировать это, чтобы мы получили кадр данных со всеми словами и их частотой?

Другая проблема, с которой я сталкиваюсь, связана с преобразованием матрицы документа термина во фрейм данных. Когда я работаю с большими выборками данных, я сталкиваюсь с ошибками памяти. Есть ли простое решение для этого?


person ProcRJ    schedule 07.08.2013    source источник


Ответы (6)


Попробуй это

data("crude")
myTdm <- as.matrix(TermDocumentMatrix(crude))
FreqMat <- data.frame(ST = rownames(myTdm), 
                      Freq = rowSums(myTdm), 
                      row.names = NULL)
head(FreqMat, 10)
#            ST Freq
# 1       "(it)    1
# 2     "demand    1
# 3  "expansion    1
# 4        "for    1
# 5     "growth    1
# 6         "if    1
# 7         "is    2
# 8        "may    1
# 9       "none    2
# 10      "opec    2
person David Arenburg    schedule 17.11.2013
comment
Блестяще спасибо! Одно примечание для начинающих: myTdm ‹- TermDocumentMatrix(crude)[1:10, 1:10] дает вам tdm 10 на 10, поэтому, если корпус больше, [1:10, 1:10] не следует использовать. - person Simone; 06.10.2016
comment
Я так и думал. Поначалу R может иногда сбивать с толку, поэтому добавил его для новичков в R. - person Simone; 07.10.2016
comment
достаточно, если вы сделаете: FreqMat <- as.data.frame(as.table(myTdm)) - person jibiel; 05.07.2017
comment
Когда я пытаюсь inspect(), я получаю только [1:10,1:10] независимо от размера tdm/dtm. - person user1603472; 31.07.2017
comment
@user1603472 user1603472 Если вы сделаете myTdm <- TermDocumentMatrix(crude), вы получите полное представление. - person David Arenburg; 31.07.2017
comment
@jibiel head(as.data.frame(as.table(myTdm)), 10) не дает мне такого же результата. - person David Arenburg; 31.07.2017
comment
@user1603472 user1603472 Кстати, я только что проверил исходный код inspect, и он просто делает as.matrix, а затем печатает его. Так что вообще не надо его использовать. - person David Arenburg; 31.07.2017
comment
@Simone Вы совершенно правы, и это была ошибка с моей стороны. Кроме того, я только что проверил исходный код inspect, и он просто выполняет as.matrix, а затем печатает его, поэтому я соответствующим образом исправил код, чтобы избежать ненужной печати. - person David Arenburg; 31.07.2017

У меня есть следующие строки в R, которые могут помочь создать частоты слов и поместить их в таблицу, он читает текстовый файл в формате .txt и создает частоты слов, я надеюсь, что это может помочь всем заинтересованным.

avisos<- scan("anuncio.txt", what="character", sep="\n")
avisos1 <- tolower(avisos)
avisos2 <- strsplit(avisos1, "\\W")
avisos3 <- unlist(avisos2)
freq<-table(avisos3)
freq1<-sort(freq, decreasing=TRUE)
temple.sorted.table<-paste(names(freq1), freq1, sep="\\t")
cat("Word\tFREQ", temple.sorted.table, file="anuncio.txt", sep="\n")
person alejandro    schedule 20.05.2015
comment
это было очень полезно для одного из моих крошечных домашних проектов по анализу текста ... большое спасибо :)) - person LearneR; 18.12.2016
comment
также один вопрос.. если я хочу подсчитать частоту определенной фразы или предложения в дампе текста, есть ли способ сделать это? например: допустим, я хочу найти частоту набора слов «какой странный инцидент» во всей книге. Какие изменения я должен внести в приведенный выше код? - person LearneR; 18.12.2016

Глядя на источник findFreqTerms, похоже, что функция slam::row_sums делает свое дело, когда вызывается на матрице терминов-документов. Попробуйте, например:

data(crude)
slam::row_sums(TermDocumentMatrix(crude))
person Daniel Janus    schedule 18.07.2015

В зависимости от ваших потребностей использование некоторых функций tidyverse может быть грубым решением, которое предлагает некоторую гибкость с точки зрения того, как вы обрабатываете заглавные буквы, пунктуацию и стоп-слова:

text_string <- 'I have been using the tm package to run some text analysis. My problem is with creating a list with words and their frequencies associated with the same. I typically use the following code for generating list of words in a frequency range. Is there any way to automate this such that we get a dataframe with all words and their frequency?
The other problem that i face is with converting the term document matrix into a data frame. As i am working on large samples of data, I run into memory errors. Is there a simple solution for this?'

stop_words <- c('a', 'and', 'for', 'the') # just a sample list of words I don't care about

library(tidyverse)
data_frame(text = text_string) %>% 
  mutate(text = tolower(text)) %>% 
  mutate(text = str_remove_all(text, '[[:punct:]]')) %>% 
  mutate(tokens = str_split(text, "\\s+")) %>%
  unnest() %>% 
  count(tokens) %>% 
  filter(!tokens %in% stop_words) %>% 
  mutate(freq = n / sum(n)) %>% 
  arrange(desc(n))


# A tibble: 64 x 3
  tokens      n   freq
  <chr>   <int>  <dbl>
1 i           5 0.0581
2 with        5 0.0581
3 is          4 0.0465
4 words       3 0.0349
5 into        2 0.0233
6 list        2 0.0233
7 of          2 0.0233
8 problem     2 0.0233
9 run         2 0.0233
10 that       2 0.0233
# ... with 54 more rows
person sbha    schedule 13.07.2018

a = scan(file='~/Desktop//test.txt',what="list")
a1 = data.frame(lst=a)
count(a1,vars="lst")

кажется, работает, чтобы получить простые частоты. Я использовал сканирование, потому что у меня был текстовый файл, но он должен работать и с read.csv.

person Tahnoon Pasha    schedule 07.08.2013
comment
вышеизложенное не помогает мне понять n граммов и словесных ассоциаций. Я заинтересован в оценке частоты n граммов, которые были сгенерированы - person ProcRJ; 07.08.2013

apply(myTdm, 1, sum) или rowSums(as.matrix(myTdm)) дают количество ngram, которое вам нужно?

person Ben    schedule 22.08.2013