按组过滤if_tdf dtm的前20%

时间:2019-06-18 20:27:27

标签: r text tidytext

我的课文不同。我的目标是确定并保留每个类中具有最高tf_idf值(最高20%)的功能。

作为示例,我使用var fW = (typeof getFormWarpRequest == "function" ? getFormWarpRequest() : document.forms["formWarpRequest"]); if ( !fW || fW == undefined) { fW = ( formWarpRequest_THIS_ ? formWarpRequest_THIS_ : formWarpRequest_NS_ );} var form = fW; var ID=fW.elements["_oLstChoicesID"]; var SID=fW.elements["_oLstChoicesSID"]; ID.attachEvent("onclick", m_click); function m_click() { for(i=0;i<fW._oLstChoicesID.length;i++) { fW._oLstChoicesID[i].selected=false; fW._oLstChoicesID[i].disabled=true; } for(i=0;i<fW._oLstChoicesSID.length;i++) { fW._oLstChoicesSID[i].disabled=false; } } 数据集。 book_of_mormon是文本,text是类。

一个想法是使用tidy_text包并过滤每个类的前20%。

book_title

首先,我创建tf_idf值:

library(scriptuRs)
library(tidytext)
library(tidyverse)

然后,过滤每个类的tf_idf值的前20%。

d = book_of_mormon %>%
  select(book_title, text) %>%
  unnest_tokens(word, text) %>%
  group_by(book_title) %>%
  count(word) %>%
  bind_tf_idf(word, book_title, n) 

head(d, 3)

# A tibble: 3 x 6
# Groups:   book_title [1]
  book_title word          n        tf   idf    tf_idf
  <chr>      <chr>     <int>     <dbl> <dbl>     <dbl>
1 1 Nephi    a           200 0.00795   0     0        
2 1 Nephi    abhorreth     1 0.0000398 2.01  0.0000801
3 1 Nephi    abide         1 0.0000398 0.916 0.0000364

最后,我将数据帧转换为(dtm)矩阵。因此,我将书籍作为观察,将特征作为专栏。

d = d %>%
  group_by(book_title) %>% 
  arrange(book_title, -tf_idf) %>%
  filter(tf_idf > quantile(tf_idf, .8))

但是,如果我将数据帧投射回矩阵(这对于我的任务是必需的),则行数会减少(即某些文档/观察结果会减少)。

d = d %>%
  cast_dtm(word, book_title, tf_idf) 

d = as.data.frame(as.matrix(d))

另一个想法是使用dim(d) [1] 19099 6 dim(book_of_mormon) [1] 6604 19 包。但是,使用大数据集(例如我的原始数据集),R将耗尽内存。

首先,我创建dtm和一个数据框。

tm

然后,我过滤每个类中具有最高值的特征。

library(tm)

corpus = Corpus(VectorSource(book_of_mormon$text))

corpus = corpus %>%
  tm_map(removeWords, stopwords("en")) %>%
  tm_map(removeNumbers) %>%
  tm_map(removePunctuation) %>%
  tm_map(tolower)

dtm = DocumentTermMatrix(corpus)

dtm = weightTfIdf(dtm, normalize = TRUE)

dtm =  as.data.frame(as.matrix(dtm))

dtm$book_title = book_of_mormon$book_title

最后,我创建了一个过滤的dtm,其中每个类的前20%(前5个)功能部件。

dict = dtm %>%
  gather(Variable, Value, -book_title) %>%
      group_by(book_title) %>% 
      arrange(book_title, -Value) %>%
      top_n(5, Value) # I use top_n to keep the data small (i.e it´s 
                      # computational expensive to filter out the top 
                      # 20% which would lead to a long runtime in R in this 
                      # example)

0 个答案:

没有答案