R:每个组的前N个元素,无重复

时间:2018-06-29 00:51:56

标签: r dplyr

对于一个课堂项目,我有一组推文,分为以下三种类型:仇恨,常规和令人反感。我的目标是最终训练分类器,以根据数据预测正确的推文类型。

我以整洁的格式(每行一个单词)来整理数据,其中包含每个单词的TF-IDF分数。我用星号检查了冒犯性语言:

> tfidf_words
# A tibble: 34,717 x 7
   speech tweet_id word       n    tf   idf tf_idf
   <fct>     <int> <chr>  <int> <dbl> <dbl>  <dbl>
 1 hate   24282747 reason     1 0.25   5.69  1.42 
 2 hate   24282747 usd        1 0.25   8.73  2.18 
 3 hate   24282747 bunch      1 0.25   5.60  1.40 
 4 hate   24282747 ******     1 0.25   5.21  1.30 
 5 hate   24284443 sand       1 0.5    4.76  2.38 
 6 hate   24284443 ******     1 0.5    2.49  1.24 
 7 hate   24324552 madden     1 0.111  8.73  0.970
 8 hate   24324552 call       1 0.111  4.11  0.456
 9 hate   24324552 ******     1 0.111  2.05  0.228
10 hate   24324552 set        1 0.111  5.90  0.655
# ... with 34,707 more rows

要限制训练特征空间的大小,我想根据其TF-IDF分数获得每种语音类型的前“ n”个唯一词。

我的vocabulary是为我的特征空间选择的所有唯一单词的向量,定义为vocabulary <- unique(feature_space$word)

在程序中,我使用SENTIMENT_SIZE定义模型中每种语音类型需要多少个单词。

我都尝试过这两种方法:

feature_space <- tfidf_words %>%
  arrange(desc(tf_idf)) %>%
  group_by(speech) %>%
  slice(1:SENTIMENT_SIZE) %>%
  ungroup() %>%
  arrange(tweet_id)

这:

feature_space <- tfidf_words %>%
  group_by(speech) %>%
  top_n(n = SENTIMENT_SIZE, wt = tf_idf) %>%
  ungroup()

这两个都是“工作”,但它们都不以我希望的方式处理重复项。例如,如果我将SENTIMENT_SIZE设置为100,则希望从每种语音类型中看到100个唯一的单词,总共300个单词。

相反,我们得到方法1的结果:

> length(vocabulary)
[1] 248

方法2的结果

> length(vocabulary)
[1] 293

我如何:

  1. 确保在每个语音组中没有选择重复的单词,并且...
  2. 确保每个组中选择的单词与其他组中的单词不同吗?

2 个答案:

答案 0 :(得分:2)

在这里,我假设您正在word的每组中寻找唯一的speech

tfidf_words %>% arrange(desc(tf_idf)) %>% 
                group_by(speech) %>% distinct(word, .keep_all = TRUE) 

答案 1 :(得分:1)

感谢@A。苏里曼,我想我现在有一些可行的方法。

feature_space <- tfidf_words %>%
  arrange(desc(tf_idf)) %>% 
  distinct(word, .keep_all = TRUE) %>% #remove all duplicate words
  group_by(speech) %>%
  slice(1:SENTIMENT_SIZE) %>% #grab first n of each speech category
  ungroup()

这应该总是能在我的词汇表中产生预期的单词数,因为它可以抢先消除平局的可能。