【问题标题】:R: Top N elements of each group without duplicatesR:每组前 N 个元素不重复
【发布时间】:2018-06-29 00:51:55
【问题描述】:

对于一个课堂项目,我有一组推文,分为 3 种类型的言论:仇恨、常规和攻击性。我的目标是最终训练分类器从数据中预测正确类型的推文。

我有一个整齐的格式(每行一个单词)的数据,其中包含每个单词的 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 &lt;- 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. 确保每个组中选择的单词与其他组中的单词不同?

【问题讨论】:

  • 你可以在group_by之后使用unique(word)distinct(word)
  • @A.Suliman 你能举个例子吗?在group_by 之后我将如何使用它?

标签: r dplyr


【解决方案1】:

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

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

【讨论】:

  • 感谢分享!我认为distinct 函数正是我所需要的。
  • 我真正改变的唯一一件事是在对数据进行分组之前使用distinct,以确保没有一个词用于一种以上的语音类型。
【解决方案2】:

感谢@A。 Suliman,我想我现在有一些东西可以工作。

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

这应该总是在我的词汇表中产生预期的单词数量,因为它会抢先消除任何平局的机会。

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-02-04
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多