Câu hỏi danh sách các tần số từ sử dụng R


Tôi đã sử dụng gói tm để chạy một số phân tích văn bản. Vấn đề của tôi là tạo ra một danh sách với các từ và tần số của chúng liên kết với nhau

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))

Tôi thường sử dụng mã sau để tạo danh sách các từ trong dải tần số

frq1 <- findFreqTerms(myTdm, lowfreq=50)

Có cách nào để tự động hóa này như vậy mà chúng tôi nhận được một dataframe với tất cả các từ và tần số của họ?

Vấn đề khác mà tôi phải đối mặt là chuyển đổi ma trận tài liệu thuật ngữ thành một khung dữ liệu. Khi tôi đang làm việc trên các mẫu dữ liệu lớn, tôi chạy vào các lỗi bộ nhớ. Có một giải pháp đơn giản cho điều này?


18
2017-08-07 10:30


gốc


bạn có thể chấp nhận câu trả lời để câu hỏi này có thể được đánh dấu là đã giải quyết không? - duhaime


Các câu trả lời:


Thử cái này

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

18
2017-11-17 13:11



Brilliant cảm ơn bạn! Một lưu ý mặc dù cho người mới bắt đầu: myTdm <- TermDocumentMatrix (thô) [1:10, 1:10] cung cấp cho bạn 10 x 10 tdm vì vậy nếu phần lớn hơn [1:10, 1:10] không nên được sử dụng - Simone
Tôi nghĩ vậy. Trong phần mở đầu R có thể khá khó hiểu đôi khi để thêm nó cho R newbies. - Simone
nó là đủ nếu bạn làm: FreqMat <- as.data.frame(as.table(myTdm)) - jibiel
Khi tôi thử kiểm tra () tôi chỉ nhận ra [1: 10,1: 10] bất kể kích thước của tdm / dtm. - user1603472
@ user1603472 Nếu bạn sẽ làm myTdm <- TermDocumentMatrix(crude) bạn sẽ có được cái nhìn đầy đủ. - David Arenburg


Hãy nhìn vào nguồn của findFreqTerms, có vẻ như chức năng slam::row_sums thực hiện thủ thuật khi được gọi trên ma trận thuật ngữ tài liệu. Hãy thử, ví dụ:

data(crude)
slam::row_sums(TermDocumentMatrix(crude))

8
2017-07-18 16:43





Tôi có các dòng sau trong R có thể giúp tạo ra các tần số từ và đặt chúng trong một bảng, nó đọc các tập tin văn bản ở định dạng .txt và tạo ra các tần số của các từ, tôi hy vọng rằng điều này có thể giúp cho bất cứ ai quan tâm.

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")

7
2018-05-20 17:18



điều này đã rất hữu ích cho một trong những dự án thú cưng nhỏ của tôi trong khai thác văn bản .. cảm ơn rất nhiều :)) - LearneR
cũng, một câu hỏi .. nếu tôi muốn đếm tần số của một cụm từ cụ thể hoặc một câu trong một bãi chứa văn bản, có cách nào để làm điều đó không? ví dụ: giả sử tôi muốn tìm tần suất tập hợp các từ 'một sự cố lạ' trong toàn bộ cuốn sách .. tôi nên làm gì với mã trên? - LearneR
Rất tuyệt vời - cảm ơn bạn đã đăng bài! - jmb277


Làm apply(myTdm, 1, sum) hoặc là rowSums(as.matrix(myTdm)) cho số đếm ngram bạn đang theo sau?


2
2017-08-22 16:07





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

dường như làm việc để có được tần số đơn giản. Tôi đã sử dụng quét vì tôi đã có một tập tin txt, nhưng nó cũng làm việc với read.csv.


1
2017-08-07 10:39



trên không giúp tôi tìm ra n gram và các hiệp hội từ. Tôi quan tâm đến việc đánh giá tần suất của n gam đã được tạo - ProcRJ


Tùy thuộc vào nhu cầu của bạn, sử dụng một số tidyverse các hàm có thể là giải pháp thô cung cấp một số tính linh hoạt về cách bạn xử lý viết hoa, dấu câu và từ dừng:

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

1
2017-07-13 02:18